こちらの記事はではAnsibleを紹介するための文章で、元Red Hat社員のJingjing Shiが作成し、Wenhan Shiが日本語に翻訳しました。内容の校正はHideki SaitoとKento Yagisawaが協力しています。Ansibleの基礎知識から、実際の現場で利用できる実運用まで紹介しています。

本文内にあるすべてのansible playbookの例は、以下のgithubのURLから利用できる。 https://github.com/ansible-book/ansible-first-book-examples もし不備やコメントがありましたら、作者[email protected]または翻訳者[email protected] に連絡してください。

詳細の内容を下記三つに分けて説明します。

Ansible 入門 - 紹介 Ansible 入門 - 基本 Ansible 入門 - 応用

本章では、簡単な例を使ってAnsibleの基本的な使い方を説明する。

  1. インストール
  2. 管理対象のサーバー(サーバリストの管理)
  3. コマンドラインによるサーバー管理(Ad-hoc command)
  4. スクリプトによるサーバー管理(スクリプト言語 Playbook)
  5. モジュール

インストール

ここでは Red Hat 系 Linux でのインストールを前提に解説にする。他のOSに関していAnsibleのWebページをご参照ください。

管理者ノード

Ansible パッケージをインストール

1
2
3
4
# Redhat/CentOS Linuxの場合, epolリポジトリをインストールする必要がある。
# Fedoraの場合、デフォルトのリポジトリにAnsibleを含まれているため,直接インストールできる
sudo yum install epel-release
sudo yum install ansible -y

管理者ノードからリモートノードの接続設定

SSH keyによる認証パスワードレス)方式を設定する。

1
2
3
4
5
6
# ssh key を生成
ssh-keygen
# リモートノードにssh keyをコピー
ssh-copy-id remoteuser@remoteserver
# リモートノードをknows_hostsに追加(ssh Keyの保存確認がなくなる)
ssh-keyscan remote_servers >> ~/.ssh/known_hosts

設定確認

管理者ノードで下記コマンドを実行し、パスワードの入力とSSH keyの保存確認がなかったら設定完了。

1
ssh remoteuser@remoteserver

リモートノード

Python 2.4以上が必要だが、通常はデフォルトでインストールされている。そのため、別途パッケージのインストールは必要ない。

管理対象のサーバー(サーバーリストの管理)

サーバリスト(Host Inventory)とは

Host InventoryはAnsibleの設定ファイルであり、管理対象となるリモートノードの一覧をAnsibleに教える。 また、下記のように状況に応じてリモートノードのカテゴリ化もできる。 使い道によってカテゴリ化する:データベースノード、サービスノード。 ロケーションによってカテゴリ化する:中部データセンター、西部データセンター

Host Inventoryファイル

デフォルトのファイルパス: /etc/ansible/hosts

他のファイルパスへ変更することもできる、詳細については後程紹介する。

例:

一番シンプルのhosts ファイル

1
2
3
192.168.1.50
aserver.example.org
bserver.example.org

カテゴリを持つhosts ファイル

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
mail.example.com

[webservers]
foo.example.com
bar.example.com

[dbservers]
one.example.com
two.example.com
three.example.com

コマンドラインによるサーバー管理(Ad-hoc command)

Ansibleではコマンドラインツールを提供していて、オフィシャルドキュメントでは Ad-Hoc Commandsと名付けている。ansibleコマンドのフォーマットを以下に示す。

1
ansible <host-pattern> [options]

Ansible コマンドができること

コマンドの構文の詳細を置いといて、“命令”モジュールの説明が終わったら構文の理解が深まりにいく。ここでは、下記のコマンドの例を通して、ansibleコマンドの役割を体感しましょう

環境を確認する

ansible管理者ノードからユーザ bruce で各リモートノードをアクセスすることを確認する。

1
ansible all -m ping -u bruce

コマンド実行

現在bash ユーザと同名のユーザがすべてのリモートノードに対し"echo”コマンドを実行する。

1
ansible all -a "/bin/echo hello"

ファイルコピー

/etc/hosts ファイル を全リモートノードのweb グループにコピーし、コピー先は/tmp/hosts

1
ansible web -m copy -a "src=/etc/hosts dest=/tmp/hosts"

パッケージインストール

全リモートノードのweb グループのマシンにyum でacmeパッケージをインストール

1
ansible web -m yum -a "name=acme state=present"

ユーザ追加

1
ansible all -m user -a "name=foo password=<crypted password here>"

パッケージダウンロード

1
ansible web -m git -a "repo=git://foo.example.org/repo.git dest=/srv/myapp version=HEAD"

サービス起動

1
ansible web -m service -a "name=httpd state=started"

並列実行

リブート命令を10並列で実行する。

1
ansible lb -a "/sbin/reboot" -f 10

リモートノード情報取得

1
ansible all -m setup

スクリプトによるサーバー管理

重複な入力を避けるため、Ansibleをスクリプトの実行に対応する。AnsibleのスクリプトはPlaybookと読んで、YAML形式で、拡張子はymlである。Note: YAMLとJSONは似ていて、データを表示するフォーマットである。

Playbookの実行方法

1
ansible-playbook deploy.yml

Playbookの例

Playbook deploy.ymlを通して、webグループのリモートサーバに対しapacheをデプロイする。ステップとしては

  1. Apacheパッケージをインストール
  2. 設定ファイルhttpdをコピーし、コピー完了後apacheサービスを再起動することを保証
  3. デフォルトweb pageのindex.htmlをコピー
  4. Apacheサービスを起動

このPlaybook deploy.yml 内では以下のキーワードを含まれている。

キーワード内容備考
hostsリモートノードのIP、またはグループ名、またはキーワードall
remote_user実行ユーザ
vars変数
tasks[^1]Playbookのコア部分、処理内容actionを順番通りに実行する。各actionはansible moduleを利用する。action の構文:module: module_parameter=module_value。
handersPlaybookのイベントで、デフォルトでは実行されず、action内でトリガーの条件に満足したら実行する。複数のトリガー条件にマッチしても1回のみ実行する。
[^1]よく利用するモジュールはyum, copy, templateなど。Ansibleの中のmodule は、bash の中のyum, copyの命令に似ている。詳細は後程紹介する。

以下はdeploy.ymlの内容を示す。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
---
- hosts: web
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest

  - name: Write the configuration file
    template: src=templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
    notify:
    - restart apache

  - name: Write the default index.html file
    template: src=templates/index.html.j2 dest=/var/www/html/index.html

  - name: ensure apache is running
    service: name=httpd state=started
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

YAMLが分からなかったら、上記deploy.ymlをJSON形式に変換することも可能だ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[
  {
    "hosts": "web",
    "vars": {
      "http_port": 80,
      "max_clients": 200
    },
    "remote_user": "root",
    "tasks": [
      {
        "name": "ensure apache is at the latest version",
        "yum": "pkg=httpd state=latest"
      },
      {
        "name": "Write the configuration file",
        "template": "src=templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf",
        "notify": [
          "restart apache"
        ]
      },
      {
        "name": "Write the default index.html file",
        "template": "src=templates/index.html.j2 dest=/var/www/html/index.html"
      },
      {
        "name": "ensure apache is running",
        "service": "name=httpd state=started"
      }
    ],
    "handlers": [
      {
        "name": "restart apache",
        "service": "name=httpd state=restarted"
      }
    ]
  }
]

JSON と YAMLをお互いに変換するオンラインツール:http://www.json2yaml.com/

Play vs. Playbook

Playbookは Ansibleで実行可能な YAMLファイルである。一般的な構文を以下の例に示す。

1
2
3
4
5
6
---
- hosts: web
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest

一つのPlaybookファイルの中で、二つのリモートノードグループに対しそれぞれ異る操作を存在することができる。例えば、webノードにhttpdパッケージのインストールと、lbノードにmysqlパッケージのインストール処理を一つのPlaybook ファイルに設定することができる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
---
# apache をインストールのplay
- hosts: web
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest

# mysql をインストールのplay
- hosts: lb
  remote_user: root
  tasks:
  - name: ensure mysqld is at the latest version
    yum: pkg=mariadb state=latest

上記の例では、一つのサーバに対する操作処理は、一つのPlayになる。一般的には一つのPlaybookでは一つのPlayしか実行しないため、その場合にはPlaybookとPlayは同じである。

Ansibleのモジュール

Ansibleのモジュールとは

Bashを利用する時、コマンドラインでもスクリプト内でも、cd, ls, copy, yumなどの命令を実行する必要がある。AnsibleのモジュールはAnsibleの命令であり、Ansibleのコマンドラインやスクリプト上にて実行されている。よく使うモジュールとしてyum, copy, templateなどがある。

Bashでのコマンドを利用するときに、さまざまなオプションが利用できて、このオプションはコマンドごとに定義されている。それと同じように、Ansibleのモジュールを実行する時に複数のオプションをつけることができて、各モジュールのオプションはモジュール内に定義されている。

モジュールの利用方法は以下のドキュメントを参照で http://docs.ansible.com/ansible/modules_by_category.html

コマンドラインにてAnsibleモジュールを利用

Ansible コマンドラインでは、以下の様にモジュールを利用できる。

1
2
3
  -m <モジュール名>

  -a モジュールのパラメータ

例えば

1
2
3
4
# module copyを利用し、管理者ノードの/etc/hostsをリモートノードの/tmp/hostsにコピー
ansible all -m copy -a "src=/etc/hosts dest=/tmp/hosts"
# module yumを利用しリモートノードweb上にhttpdパッケージをインストール
ansible web -m yum -a "name=httpd state=present"

PlaybookにてAnsibleモジュールを利用

Playbookスクリプトでは、task内一つのactionは一つのモジュールを実行している。各actionに対し、

: の前はモジュールの名前

: の後ろはモジュールのパラメータ

1
2
3
4
5
6
7
8
---
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
  - name: write the apache config file
    template: src=templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
  - name: ensure apache is running
    service: name=httpd state=started

Ansibleモジュールの特性

  • Linuxのコマンドのように、Ansibleのモジュールはコマンドライン上で実行することもできるし、Playbook内に書いて実行することもできる。
  • 各モジュールのパラメータや状態の判断は、このモジュールの仕様によって決められている。そのため、モジュールを利用する前に、このモジュールのドキュメントを参照することが必要である。
  • Ansibleはよく利用するモジュールを多数公開していますが、APIを公開しているので、ユーザが自分のモジュールの開発もできる。AnsibleのモジュールはPythonで書かれている。

よく使うAnsibleモジュールの紹介

Linuxを利用する時、コマンド命令が分からないとLinux 利用することはできない。これと同じようにAnsibleを利用するために基本のモジュールを理解することが大事である。

これからは普段よく使われているモジュールを紹介する。

  • テスト&確認用

    • ping: リモートノードにpingして、正常に接続ができる場合は"pong”を返す。
    • debug: デバッグ用、情報を出力のみ、Linuxのecho コマンドに似ている。
  • ファイル操作

    • copy: ローカルのファイルをリモートノードにコピー
    • template: ローカルのファイルをリモートノードにコピーし、変数を変更
    • file: ファイルのパーミッションや属性を設定
  • システム操作

    • user: ユーザアカウント管理
    • yum: red hat 系Linuxのパッケージ管理
    • service: サービスの管理
    • firewalld: ファイアウォール内のサービスやポートの管理
  • Shell命令実行

    • shell: リモートノード上shell命令を実行、$HOMEや”<”, ”>”, “|”と“&”などは利用可能
    • command: リモートノード上shell命令を実行、$HOMEや”<”, ”>”, “|”と“&”などは利用不可

ping

管理者ノードからリモートノードへの接続状態を確認するときに一番よく使われているモジュールである。ただShellのpingコマンドみたいにただリモートノードを"ping”するだけではなく、パスワードレスのSSHログインと、リモートノードのpythonのversionを確認し、両方問題なかったらpongを返す。

pingモジュールを使う時にパラメータが必要ない。リモートノードの接続状況を確認するためコマンドラインでの利用がplaybookの中より多くなっている。下記はコマンドラインでのpingモジュールの例を示す。

1
ansible servers -m ping

debug

Shellのechoコマンドに似ていて。メッセージを出力する。 msgパラメータに出力したいメッセージ内容を設定する。下の例では、システム情報をメッセージ内容に含めて出力している。Ansibleが実行する前にシステム情報を集めて定数にしているため、playbook内に定義しなくても利用できる。

1
2
- debug:
    msg: "System \{\{ inventory_hostname \}\} has gateway \{\{ ansible_default_ipv4.gateway \}\}"

実行結果

1
2
3
4
TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "System localhost has gateway 192.168.50.1"
}

出力したい情報をvar パラメータを定義し出力させることができる。情報はシステム情報でも、モジュール実行結果を取り込むことができ、キーワードregesterを用いて変数に設定する。 例えば、システム情報を出力するため、以下の内容をPlaybookに記入する。

1
2
3
  - name: Display all variables/facts known for a host
    debug:
      var: hostvars[inventory_hostname]["ansible_default_ipv4"]["gateway"]

実行結果

1
2
3
4
  TASK [Display part of variables/facts known for a host] ************************
  ok: [localhost] => {
      "hostvars[inventory_hostname][\"ansible_default_ipv4\"][\"gateway\"]": "192.168.50.1"
  }

また、モジュールの実行結果など動的な情報を出力するためのPlaybook内容を以下に示す。

1
2
3
4
5
  - shell: /usr/bin/uptime
    register: result

  - debug:
      var: result

実行結果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
  TASK [command] *****************************************************************
  changed: [localhost]

  TASK [debug] *******************************************************************
  ok: [localhost] => {
      "result": {
          "changed": true,

          "cmd": "/usr/bin/uptime",
          "delta": "0:00:00.003212",
          "end": "2017-01-01 21:30:02.817443",
          "rc": 0,
          "start": "2017-01-01 21:30:02.814231",
          "stderr": "",
          "stdout": " 21:30:02 up 12:38,  8 users,  load average: 1.13, 1.31, 1.14",
          "stdout_lines": [
              " 21:30:02 up 12:38,  8 users,  load average: 1.13, 1.31, 1.14"
          ],
          "warnings": []
      }
  }

copy

ローカルマシン上のファイルをリモートノードにコピーし、適切なファイルパーミッションを設定する。注意すべきなのは、ファイルをコピーする前に、コピー元とコピー先のファイルのchecksumを比較する。同一の場合はコピーせず、OK状態を返す。異なっている場合のみコピーを実行し、changed状態を返す。

ファイルパーミッション設定

modeパラメータを使ってパーミッションを設定する。設定の方式は数字でも、符号形式"u=rw,g=r,o=r”, ”u+rw,g-wx,o-rwx” でも問題ない。

1
2
3
4
5
6
- copy:
    src: /srv/myfiles/foo.conf
    dest: /etc/foo.conf
    owner: foo
    group: foo
    mode: 0644

リモートノード上ファイルのバックアップ

backupパラメータがyesになっている時に、コピーする前にリモートノード上のファイルのバックアップを取るようになる。もしコピー元&先のファイルが同一であれば、コピー処理が実行されず、バックアップも実行されなくなる。

1
2
3
4
- copy:
    src: sudoers
    dest: /tmp
    backup: yes

コピー後の検証

validate パラメータに検証の為のコマンドを設定する。通常の場合、検証が必要なのはコピー後のファイルなので、%s で指定することができる。copyモジュールにvalidate変数が存在する場合は、コピー処理が正常に終了したことに加えて、validataの命令も正常と返す時のみ、copyモジュールの実行が成功になる。

以下の例では、visudo -cf /etc/sudoers は sudoers ファイルを検証するための命令である。

1
2
3
4
- copy:
    src: /mine/sudoers
    dest: /etc/sudoers
    validate: 'visudo -cf %s'

template

普通のファイルをコピーする場合は、copyモジュールで充分だが、コピー先ファイルの内容を動的に変更したい場合、templateモジュールを利用する必要がある。 例えば、apacheをインストールした後、テストのためリモートノードにindex.htmlファイルをコピーし、リモートノードのホスト名とIPアドレスを表示させたい時、templateを利用したほうがいい。 Index.html内、変更したい部分を変数として記入する。templateはpythonのj2テンプレートを利用している。j2を理解する必要がないが、変数の書き方は\{\{ \}\}で囲むことを分かれば問題がない。

templateファイルの構文

Templateなので、可読性のため j2 拡張子をファイルにつける。下記の index.html.j2 ファイルに二つの変数ansible_hostname と ansible_default_ipv4.address が書かれている。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<html>
<title>Demo</title>
<body>
<div class="block" style="height: 99%;">
    <div class="centered">
        <h1>#46 Demo</h1>
        <p>Served by \{\{ ansible_hostname \}\} (\{\{ ansible_default_ipv4.address \}\}).</p>
    </div>
</div>
</body>
</html>

facts変数を利用するtemplate

index.html.j2で使われている変数ansible_hostnameとansible_default_ipv4.addressはfacts変数であり、ansibleはその内容を調べ、直接Playbookで利用することができるし、templateで利用することもできる。そのため、templateにこの変数を記入した場合は特にパラメータを入力する必要はない。

1
2
- name: Write the default index.html file
  template: src=templates/index.html.j2 dest=/var/www/html/index.html

一般変数を利用するtemplate

例えば、httpd.conf.j2をリモートノードにコピーした後、デフォルトのhttpポートを設定したい場合、templateの一般変数を利用して実現できる。templateファイル httpd.conf.j2の中での一般変数の利用方法は同じく\{\{\}\}:

1
2
3
4
ServerRoot "/etc/httpd"
...
Listen \{\{ http_port \}\}
...

一般変数はtemplateを読み込む時ではなく、Playbook内のvars キーワードで定義される。もちろんPlaybook内で直接利用できる変数は、template内でも利用できる。inventory内の変数の定義については後章で説明する。

1
2
3
4
5
6
7
8
- hosts: localhost
  vars:
    http_port: 8080
  remote_user: root
  tasks:

  - name: Write the configuration file
    template: src=templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf

templateモジュールはcopyモジュールと同じく、ファイルをリモートノードにコピーするだけではなく、パーミッションの設定、バックアップ、検証機能などもできる。

1
2
3
4
5
6
7
8
- template:
    src: etc/ssh/sshd_config.j2
    dest: /etc/ssh/sshd_config.j2
    owner: root
    group: root
    mode: '0600'
    validate: /usr/sbin/sshd -t %s
    backup: yes

file

fileモジュールは、リモートノード上のファイル、シンボリック、フォルダの作成、削除、またはパーミションの設定を行う。

ファイルのパーミッションの変更

mode変数には直接数字(頭1文字は 0)でも、パーミッション設定内容でも、パーミッションの追加/削除でも設定することができます。詳細については以下の例で示す。

1
2
3
4
5
6
7
- file:
    path: /etc/foo.conf
    owner: foo
    group: foo
    mode: 0644
    #mode: "u=rw,g=r,o=r"
    #mode: "u+rw,g-wx,o-rwx"

シンボリックリンク作成

ここで注意すべきところは、srcとdestパラメータの意味はcopyモジュールと異なり、fileモジュールの操作対象のファイルは全てリモートノード上にある。

1
2
3
4
5
6
- file:
    src: /file/to/link/to
    dest: /path/to/symlink
    owner: foo
    group: foo
    state: link

新しいファイル作成

Touchコマンドのように新しいファイルを作成

1
2
3
4
- file:
    path: /etc/foo.conf
    state: touch
    mode: "u=rw,g=r,o=r"

新しいフォルダを作成

1
2
3
4
5
# create a directory if it doesn't exist
- file:
    path: /etc/some_directory
    state: directory
    mode: 0755

user

ユーザモジュールはリモートノードのユーザアカウントを追加/削除/変更することができ、アカウントの属性を設定することもできる。

アカウント追加

ユーザアカウントjohndを追加、uid を 1040に、primary groupをadminに設定する。

1
2
3
4
5
  - user:
      name: johnd
      comment: "John Doe"
      uid: 1040
      group: admin

ユーザアカウントjamesを作成し、このアカウントに二つのグループを追加する。

1
2
3
4
5
  - user:
      name: james
      shell: /bin/bash
      groups: admins,developers
      append: yes

アカウント削除

ユーザアカウントjohndを削除する。

1
2
3
4
- user:
    name: johnd
    state: absent
    remove: yes

アカウントの属性を変更

アカウントjsmithに対し2048-bit のSSH keyを作成し、~jsmith/.ssh/id_rsaに保存する。

1
2
3
4
5
  - user:
      name: jsmith
      generate_ssh_key: yes
      ssh_key_bits: 2048
      ssh_key_file: .ssh/id_rsa

アカウントの無効時刻を追加

1
2
3
4
5
  - user:
      name: james18
      shell: /bin/zsh
      groups: developers
      expires: 1422403387

yum

yum モジュールはRed Hat系Linuxのパッケージを管理する。RHEL, CentOS, fedora 21以下のOSをサポートする。fedora 22以上からはdnfを利用するため、dnfモジュールの利用をお勧めする。

パッケージのinstallとremove

最新のパッケージをインストール。もし古いパッケージが存在する場合、最新versionにアップデートする。

1
2
3
4
  - name: install the latest version of Apache
    yum:
      name: httpd
      state: latest

指定したversionのパッケージをinstall

1
2
3
4
  - name: install one specific version of Apache
    yum:
      name: httpd-2.2.29-1.4.amzn1
      state: present

httpdパッケージをremove

1
2
3
4
  - name: remove the Apache package
    yum:
      name: httpd
      state: absent

指定したリポジトリtestingからパッケージをinstall

1
2
3
4
5
  - name: install the latest version of Apache from the testing repo
    yum:
      name: httpd
      enablerepo: testing
      state: present

パッケージグループをinstall

1
2
3
4
5
6
7
8
9
- name: install the 'Development tools' package group
  yum:
    name: "@Development tools"
    state: present

- name: install the 'Gnome desktop' environment group
  yum:
    name: "@^gnome-desktop-environment"
    state: present

ローカルファイルからパッケージをinstall

1
2
3
4
- name: install nginx rpm from a local file
  yum:
    name: /usr/local/src/nginx-release-centos-6-0.el6.ngx.noarch.rpm
    state: present

URLからパッケージをinstall

1
2
3
4
- name: install the nginx rpm from a remote repo
  yum:
    name: http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
    state: present

service

リモートノード上のサービスを管理する。一般的によく利用されるサービスは、httpd, sshd, nfs, crondなどがある。

起動/停止/再起動

httpdサービスを起動

1
2
3
  - service:
      name: httpd
      state: started

httpdサービスを停止

1
2
3
  - service:
      name: httpd
      state: stopped

httpdサービスを再起動

1
2
3
  - service:
      name: httpd
      state: restarted

httpdサービスをreload

1
2
3
  - service:
      name: httpd
      state: reloaded

httpdサービスをブート時自動起動に設定

1
2
3
- service:
    name: httpd
    enabled: yes

ネットワークサービスのポートを起動する

1
2
3
4
- service:
    name: network
    state: restarted
    args: eth0

firewalld

firewalldモジュールは、サービスやポートに対しfirewalldのルールを設定する。実行中のルールと、永久のルールの両方が設定できる。ただし、firewalldモジュールの条件として、リモートノードのfirewalldのversionは0.2.11以上である必要がある。

サービスに対しfirewalldルールを追加

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
- firewalld:
    service: https
    permanent: true
    state: enabled

- firewalld:
    zone: dmz
    service: http
    permanent: true
    state: enabled

ポートに対しfirewalldルールを追加

1
2
3
4
5
6
7
8
9
- firewalld:
    port: 8081/tcp
    permanent: true
    state: disabled

- firewalld:
    port: 161-162/udp
    permanent: true
    state: enabled

その他のfirewalldルールの例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
- firewalld:
    rich_rule: 'rule service name="ftp" audit limit value="1/m" accept'
    permanent: true
    state: enabled

- firewalld:
    source: 192.0.2.0/24
    zone: internal
    state: enabled

- firewalld:
    zone: trusted
    interface: eth2
    permanent: true
    state: enabled

- firewalld:
    masquerade: yes
    state: enabled
    permanent: true
    zone: dmz

shell

shellモジュールは/bin/shを使ってリモートノードで命令を実行する。 もし命令はyumやcopyモジュールで実現できるなら、shellまたはcommandのような命令モジュールが必要なくなる。 また、shellモジュールは操作後の戻り値やstatusをチェックしていないため、実行する必要がない場合でも、もう一回実行される。

$home, $HOME, “<”, “>”, “|”, “;” と“&”が利用できる。

  • $home
1
2
  - name: test $home
    shell: echo "Test1" > ~/tmp/test1
  • &&
1
  - shell: service jboss start && chkconfig jboss on
  • >>
1
  - shell: echo foo >> /tmp/testfoo

スクリプト実行

1
  - shell: somescript.sh >> somelog.txt

命令実行前にカレントディレクトリを変更

1
2
3
  - shell: somescript.sh >> somelog.txt
    args:
      chdir: somedir/

命令実行前にカレントディレクトリを変更し、somelog.txtが存在しない時にのみactionを実行する。

1
2
3
4
  - shell: somescript.sh >> somelog.txt
    args:
      chdir: somedir/
      creates: somelog.txt

Bashを指定し命令を実行する

1
2
3
  - shell: cat < /tmp/\*txt
    args:
      executable: /bin/bash

Command

Shellモジュールと似ていて、リモートノードで命令を実行する。しかし、commandモジュールは $HOME または “<”, “>”, “|”, “;” and “&”を利用できない

Shell と似た部分

  • 一つの命令を実行する
1
  - command: /sbin/shutdown -t now
  • 命令を実行する前にカレントディレクトリを変更し、databaseファイルがない時に命令を実行
1
2
3
4
  - command: /usr/bin/make_database.sh arg1 arg2
    args:
      chdir: somedir/
      creates: /path/to/database

Shell と異る部分

  • パラメータを渡す方法はShellより一つ多い
1
  - command: /usr/bin/make_database.sh arg1 arg2 creates=/path/to/database
  • && または » は利用できない。

下記の書き方で、~/tmp/test3と~/tmp/test4は作成できない。

1
2
  - name: test $home
    command: echo "test3" > ~/tmp/test3 && echo "test4" > ~/tmp/test4