【インベントリー概要】構築方法 3章:ホストへの接続
5.動作用のイベントリーパラメーター
変数を設定して、Ansibleがリモートホストと対話する方法を制御します。
パラメータ | 説明 |
---|---|
ansible_connection | ホストへの接続の種類 ansiblleの接続プラグインの名前を使用できます。 SSHプロトコルタイプは、 smart 、ssh 、またはparamiko です。デフォルトは smart です。 |
ansible_host | 接続するホストの名前(割り当てたいエイリアスと異なる場合) |
ansible_port | デフォルトではない場合(sshの場合は22)は、接続ポート番号 |
ansible_user | ホストに接続する際に使用するユーザ名 |
ansibl_pasword | ホストへの認証に使用するパスワード (この変数をプレーンテキストで保存しないでください。常にVaultを使用してください。) |
SSH接続の固有キーのパラメーター
パラメータ | 説明 |
---|---|
ansible_ssh_private_key_file | sshが使用する秘密鍵 複数のキーを使用し、SSHエージェントを使用しない場合に便利 |
ansible_ssh_common_args | この設定は、常にsftp 、scp およびssh のデフォルトのコマンドラインに追加されます。特定のホスト(またはグループ)に proxyCommand を設定するのに便利です。 |
ansible_sftp_extra_args | この設定は、常にドフォルトのsftp コマンドラインに追加されます。 |
ansible_scp_extra_args | この設定は、常にデフォルトのscp コマンドラインに追加されます |
ansible_ssh_pipelining | SSHパイプラインを使用するかどうかを決めます。 これにより、 ansible.cfg のpipelining 設定を上書きできます。 |
ansible_ssh_executable | この設定により、システムのssh を使用するデフォルトの動作が上書きされます。これにより、 ansible.cfg のssh_executable 設定を上書きできます。 |
権限の昇格 詳細はこちら
パラメータ | 説明 |
---|---|
ansible_become | ansible_sudo またはansible_su と同等です。これにより、権限のエスカレーションが強制できます。 |
ansible_become_method | 権限昇格メソッドの設定を許可します。 |
ansible_become_user | ansible_sudo_user またはansible_su_user と同等で、権限の昇格でユーザーを設定できます。 |
ansible_become_password | ansible_sudo またはansible_su と同等で、権限昇格パスワードを設定できます。(この変数をプレーンテキストで保存しないでください。常にVaultを使用してください。) |
ansible_become_exe | ansible_sudo またはansible_su と同等で、選択した昇格メソッドの実行ファイルを設定できます。 |
ansible_become_flags | ansible_sudo_flags またはansible_su_flags と同等で、選択した昇格メソッドに渡すフラグを設定出来ます。これは、 sudo_flags オプションのabsible.cfg でグローバルに設定することも出来ます。 |
リモートホスト環境パラメーター
パラメータ | 説明 |
---|---|
ansible_shell_type | ターゲットシステムのシェルタイプ ansible_shell_executableを非Bourme(sh)しない限り、この設定は使用しないでください デフォルトコマンドは sh スタイルの構文を使用してフォーマットこれを csh またはfish に設定すると、ターゲットシステムで実行差sれるコマンドがシェル構文に従います。 |
ansible_python_interpreter | ターゲットホストのPythonパス これは、複数のPythonがあるシステム、またはBSDなどの /usr/bin/python にないシステム、または /usr/bin/python が2.XシリーズのPython以外のシステムに役に立ちます。 /usr/bin/env メカニズムを使用しません。 リモートユーザーのパスを正しく設定する必要があり、また python 実行ファイルの名前がpythonであることを前提としています。 python2.6*のようになります。 |
ansible*interpreter | rubyやperlなどのあらゆるもので動作し、ansible_pyton_interpreter と同じように機能します。 これは、ホストで実行するモジューつのシバンに代わるものです。 |
New in version2.1
パラメータ | 説明 |
---|---|
ansible_shell_executable | ansibleコントローラがターゲットマシンで使用するシェルを設定し、ansible.cfg のexecutable を上書きします。このデフォルトは /bin/sh です /bin/shを使用できない場合(つまり /bin/sh がターゲットマシンにインストールされず、sudoから実行できない場合)に限り変更してください。 |
Ansibile-INIホストファイルの例
some_host ansible_port=2222 ansible_user=manager aws_host ansible_ssh_private_key_file=/home/example/.ssh/aws.pem freebsd_host ansible_python_interpreter=/usr/local/bin/python ruby_module_host ansible_ruby_interpreter=/usr/bin/ruby.1.9.3
5−1.SSH以外の接続タイプ
ホスト固有のパラメータansible_connection=<connector>
を使用すると、接続タイプを変更できます。
以下のパラメーターは、このコネクターより処理されます。
パラメータ | 説明 |
---|---|
local | このコネクターは、Playbookをコントロールマシン自体にデプロイするために使用できます。 |
docker | このコネクターは、ローカルのDockerクライアントを使用してPlaybokを直接Dokcerコンテナにデプロイします。 |
ansible_host | 接続先のDockerコンテナの名前 |
ansibel_user | コンテナ内で動作するユーザ名 ユーザーはコンテナ内に存在している必要があります。 |
ansible_become | true に設定すると、become_user はコンテナ内で動作するために使用されます |
ansible_docker_extra_args | Dockerが認識する追加の引数を持つ文字列を指定できますが、これはコマンド固有ではありません。 このパラメーターは、主に、使用するDockerデーモンを設定するために使用されます |
以下は、作成されたコンテナに即時にデプロイする例を示しています。
- name: create jenkins container docker_container: docker_host: myserver.net:4243 name: my_jenkins image: jenkins - name: add container to inventory add_host: name: my_jenkins ansible_connection: docker ansible_docker_extra_args: "--tlsverify --tlscacert=/path/to/ca.pem --tlscert=/path/to/client-cert.pem --tlskey=/path/to/client-key.pem -H=tcp://myserver.net:4243" ansible_user: jenkins changed_when: false - name: create directory for ssh keys delegate_to: my_jenkins file: path: "/var/jenkins_home/.ssh/jupiter" state: directory
利用可能なプラグインとサンプルの一覧は、プラグイン一覧を参照してください。
vault
Ansibleでパスワードなどの機密情報を暗号化して管理する | akamist blog
ansible-playbook -i hosts site.yml --ask-vault-pass
--ask-vault-pass
でプロンプトを表示させるか
--vault-password-file=VAULT_PASSWORD_FILE
でパスワードの書かれたファイルを指定します。
--ask-vault-pass
を付けて、ansible-playbook
コマンドを実行すると
Valut password
との入力が求められるので、暗号化した時のパスワードを入力すると復号化が可能
playbook1.yml
- hosts: group1 remote_user: root tasks: - name: ls command: ls become: yes register: result_ls - name: result_ls debug: msg: "{{ result_ls.stdout }}"
項目 | 説明 |
---|---|
hosts | 実行対象のグループやホスト名を指定 |
tasks | 実行するタスクを実行順に記述 |
name | 実行するタスク名を指定(コメントみたいに何を記載しても大丈夫) |
command | 指定したOSコマンドを実行するモジュール |
become | 権限昇格をアクティブにするにはyesに設定 |
register | モジュールの結果を記載した変数名に格納するように指定 |
debug | msgで指定した文字列を出力するモジュール |
コマンド実行
ansible-playbook -i hosts playbook1.yml
実行先のホスト及びユーザ
hosts
hostsはコロンで区切られた1つ以上のグループまたは ホストパターンのリストです。
- hosts: webserver
remote_user
remote_userは、ユーザアカウントの名前
remote_user: root
becomeの使用
権限昇格の理解: become — Ansible Documentation
playレベルまたはtaskレベルでbecome
を制御するディレクティブを設定できます。
接続変数をホストに設定すると、その変数を上書きできます。
これは多くの場合は、ホスト間で異なります。
これらの変数とディレクティブは独立しています。
become_userを設定するとbecomeに設定されません。
become 権限昇格をアクティブにするには
yes
に設定become_user 希望する権限を持つユーザに設定
ログインしたユーザではなく、becomeを行ったユーザ名になります。
ホストレベルで設定できるbecome:yes
を意味しているわけではありません。
デフォルトはroot
になります。become_method playレベル、taskレベル
ansible.cfgに設定されたデフォルトのメソッドをオーバーライドして、
becomeプラグインを使用するよう設定しまします。become_flags playレベル、taskレベル タスクまたはロールの特定フラグを使用できます。
シェルにno loginを設定する場合は、ユーザをnobodyに変更するのが一般的な方法。
Ansible2.2で追加
使用例
root
以外のユーザとして接続する際にシステム・サービスを管理
become_user(root)がデフォルトで使用できます。
- name: Ensure the httpd service is running
service:
name: httpd
state: started
become: yes
apache
ユーザとしてコマンド実行するには、次を実行します。
- name: Run a command as the apache user
command: somecommand
become: yes
become_user: apache
シェルがnologingの場合にnobody
ユーザとして操作を行う場合は、次を実行します。
- name: Run a command as nobody
command: somecommand
become: yes
become_method: su
become_user: nobody
become_flags: '-s /bin/sh'
sudoのパスワードを指定する必要がある場合
ansible-playbook
に--ask-become-pass
または-K
を付けて実行します。
become
を使用してPlaybookを実行し、
Playbookがハングしているように見える場合は、
おそらく権限昇格のプロンプトでスタックしており、Control-Cを使用して停止できます。
これにより、適切なパスワードを追加してPlaybookを再実行できます。
タスクリスト
各プレイには宅リストが含まれる。
タスクは、次のタスクに進む前に、ホスト「ターンに一致するすべてのマシンに対して、
一度に1つす順番に実行されます。
Ansible実行時の詳細ログを出力
Ansibleの実行時、以下のように-vvv
を引数に追加
詳細な情報が表示されます。
Playbookの実行が失敗する場合、この引数を追加し実行を行い、原因特定を行う。
ansible-playbook -i hosts hoge.yml -vvv
指定された文字列をそのまま画面表示を行う「debug」
debugモジュールは引数msg
に指定された文字列をそのまま画面に表示
tasks: - debug: msg="文字列を入力すると表示されます。"
変数の場合は以下の通り
vars: debug_msg: message tasks: - debug: {{ debug_msg }}
参考サイト
- Playbook実行後の戻り値 【公式】Playbookの概要
【インベントリー概要】構築方法 2章:変数の追加
インベントリーへの変数追加
特定のホストまたはグループに関連する変数の値をイベントリーに保存できます。
メインのイベントリーファイルのホスト及びグループに変数を直接追加することが出来ます。
管理ノードをAnsibleイベントリーに追加するため、変数を別々のホスト変数およびグループ変数のファイルに保存することが推奨されます。
2.あるマシンへの変数の割り当て:ホスト変数
1台のホスト変数を簡単に割り当てると、後でPlaybookで使用できます。 INIの場合は、以下のようになります。
[atlanta] host1 http_port=80 maxRequestsPerChild=808 host2 http_port=303 maxRequestsPerChild=909
YAMLの場合は、以下のようになります。
atlanta: host1: http_port: 80 maxRequestsPerChild: 808 host2: http_port: 303 maxRequestsPerChild: 909
非標準のSSHポートなどの一意な値は、ホスト変数として機能します。
コロンを使用してポート番号をホスト名の後に追加することで、ホスト変数としてAnsibleイベントリーに追加できます。
badwolf.example.com:5309
接続数もホスト変数として機能します。
[targets] localhost ansible_connection=local other1.example.com ansible_connection=ssh ansible_user=myuser other2.example.com ansible_connection=ssh ansible_user=myotheruser
Note SSH設定ファイル内に非標準のSSHポートの一覧を表示した場合、
openssh
接続はそのポートを見つけて使用しますが、paramiko
接続は行われません
2−1.インベントリーエイリアス
エイリアスをインベントリーに定義することも出来ます。
INIの場合は、以下のようになります。
jumper ansible_port=5555 ansible_host=192.0.2.50
YAMLの場合は、以下のようになります。
... hosts: jumper: ansible_port:5555 ansible_host:192.0.2.50
上記の例では、ホストエイリアス「Jumper」に対してAnsibleを実行すると、ポート5555で192.0.2.50に接続します。
これは、静的IPがあるホスト、またはトンネル経由で接続しているホストでのみ機能します。
Note
key-value
構文をしようしてINI形式で渡される値が解釈される方法は、宣言される場所に応じて異なります。・ホストとインラインで宣言すると、INI値はPythonリテラル構造(文字列、数値、リスト、辞書、プール値、なし)として解釈されます。 ホスト業は、行ごとに複数の
key=value
パラメータを受け入れます。 そのため、空白文字を区切り文字ではなく値の一部であることを示す方法が必要になります。・
:vars
セクションで宣言すると、INI値は文字列として解釈されます。 例えば、var=FALSE
は「FALSE」に等しい文字列を作成します。 ホスト行とは異なり、:vars
セクションは行ごとにエントリーを1つしか受け入れないため、=
に続くものはすべてエントリーの値である必要があります。・INIイベントリーに設定された変数の値を特定のタイプ(文字列やプール値など)にする必要がある場合は、タスクで常にそのタイプをフィルターで指定します。 変数の使用時にINIインベントリーに設定されたタイプに依存しないでください
・変数の実際のタイプの混乱を避けるために、インベントリーソースにはYAML形式を使用することを検討してください。 YAMLイベントリープラグインは、変数の値を一貫して正しく処理します。
通常は、システムポリシーを記述する変数を定義するのが最適な方法ではありません。
メインのイベントリーファイルで変数を設定するのは簡単な方法です。
「hosts_vars」ディレクトリーの個別ファイルに変数の値を保存するガイドラインはホスト変数とグループ変数の整理を参照してください。
3.多くのマシンへの変数の割り当て:グループ変数
グループのすべてのホストが変数値を共有している場合は、その変数をグループ全体に一度に適用できます。 INIの場合は以下のようになります。
[atlanta] host1 host2 [atlanta:vars] ntp_server=ntp.atlanta.example.com proxy=proxy.atlanta.example.com
YAMLの場合は、以下のようになります。
atlanta: hosts: host1: host2: vars: ntp_server: ntp.atlanta.example.com proxy: proxy.atlanta.example.com
グループ変数は、変数を複数のホストに当時に適用する場合に便利
ただし、Ansibleを実行する前に、イベントリー変数などの変数は常にホストレベルにフラットにします。
ホストが複数グループのメンバーである場合、Ansibleは、そのすべてのグループからヘンスの値を読み取ります。
異なるグループ内の同じ変数に異なる値を割り当てる場合、Ansibleは内部のマージ用ルールに基づいて、使用する値を選択します。
4.変数値の継承:グループのグループ用グループ変数
INIの:children
接尾辞またはYAMLのchildren:
エントリーを使用して、グループのグループ作成できます。
変数は、:vars
またはvars:
を使用して、これらのグループのグループに適用できます。
INIの場合は、以下のようになります。
[atlanta] host1 host2 [raleigh] host2 host3 [southeast:children] atlanta raleigh [southeast:vars] some_server=foo.southeast.example.com halon_system_timeout=30 self_destruct_countdown=60 escape_pods=2 [usa:children] southeast northeast southwest northwest
YAMLの場合は、以下のようになります。
all: children: usa: children: southeast: children: atlanta: hosts: host1: host2: raleigh: hosts: host2: host3: vars: some_server: foo.southeast.example.com halon_system_timeout: 30 self_destruct_countdown: 60 escape_pods: 2 northeast: northwest: southwest:
一覧またはハッシュデータを保持する必要がある場合や
イベントリーファイルとは別にホスト及びグループ固有の変数を保持する必要がある場合
ホスト変数とグループ変数の整理を参照してください
- 子グループのメンバーであるホストは、自動的に親グループのメンバーになります。
- 子グループの変数は、親グループの変数よりも優先度が高くなります(オーバライド)
- グループに複数の親と子を追加することは出来ますが、循環関係は設定できません。
- ホストは複数のグループに属することもできますが、ホストのインスタンスは1つだけであり、複数のグループからのデータをマージします。
【インベントリー概要】構築方法 1章:基本
インベントリーの構築方法
- Ansibleは、インベントリーと呼ばれるリスト、またはリストのグループを使用して インフラストラクチャーにある複数管理ノードまたは「ホスト」に対して同時に機能します。
- インベントリーのデフォルトの場所は以下のファイルです。
/etc/ansible/hosts
-i <path>
動的イベントリーでの使用で説明されているように、
複数のイベントリーファイルを同時に使用したり
、動的またはクラウドのソースまたは異なる形式(YAML,iniなど)からづくすうのイベントリー
を取得(プル)することも出来る。Ansibleには、inventoryプラグインがあり、柔軟にカスタマイズ可能 バージョン2.4で導入
1.イベントリーの基本:形式、ホスト、およびグループ
基本的なINIである/etc/ansible/hosts
は以下のようになります。
mail.example.com [webservers] foo.example.com bar.example.com [dbservers] one.example.com two.example.com three.example.com
カッコ内の見出しはグループ内で、ホストを分類し、どの時点で、どのような目的で、どのホストを制御するのかを決定するのに使用されます。
基本的なYAMLである/etc/ansible/hosts
は以下のようになります。
all: hosts: mail.example.com: children: webservers: hosts: foo.example.com: bar.example.com: dbservers: hosts: one.example.com: two.example.com: three.example.com:
1−1.デフォルトのグループ
デフォルトのグループはall
および、ungrouped
です。
グループ名 | 説明 |
---|---|
allグループ | 全てのホストが含まれます |
ungroupedグループ | ユーザーによって明示的にグループへの紐付けがされていない全てのホストが所属するグループ |
allグループの例
all: hosts: mail.example.com: children: webservers: hosts: foo.example.com: bar.example.com: dbservers: hosts: one.example.com: two.example.com: three.example.com:
この設定の場合 以下のホスト名が含まれる
mail.example.com foo.example.com bar.example.com one.example.com two.example.com three.example.com
ungroupedグループの例
all: hosts: mail.example.com: children: webservers: hosts: foo.example.com: bar.example.com: dbservers: hosts: one.example.com: two.example.com: three.example.com:
この設定の場合 以下の children配下ではない、ホスト名が含まれる
mail.example.com
補足:childern
- 子グループを定義する時の宣言
管理対象のノードを共通な内容でグルーピングします。 上記の設定の場合以下のような子グループに分かれます。
# | ホスト名 | 用途 |
---|---|---|
1 | mail.example.com | - |
2 | foo.example.com | webservers |
3 | bar.example.com | webservers |
4 | one.example.com | dbservers |
5 | two.example.com | dbservers |
6 | three.example.com | dbservers |
1−2.複数グループ内のホスト
- 各ホストを複数のグループに配置
例:Atlantaのデータセンター内の実稼働Webサーバは [prod],[atlanta]および[webservers]と呼ばれるグループに含まれる場合があります。 以下を追跡するグループ作成できます。
項目 | 説明 |
---|---|
なにを | アプリケーション、スタック、またはマイクロサービス(データベースサーバ,Webサーバなど) |
どこで | (ローカルDNS,ストレージなどと通信する)データセンターまたはリージョン(例:東、西) |
いつ | 実稼働リソースでのテストを回避する開発ステージ(例:実稼働、テスト) |
「いつ、どこで、なにを」が含まれるようにします。
all: hosts: mail.example.com: children: webservers: hosts: foo.example.com: bar.example.com: dbservers: hosts: one.example.com: two.example.com: three.example.com: east: hosts: foo.example.com: one.example.com: two.example.com: west: hosts: bar.example.com: three.example.com: prod: hosts: foo.example.com: one.example.com: two.example.com: test: hosts: bar.example.com: three.example.com:
one.exampple.com
が
sbservers
,east
,prod
グループに存在することを確認出来る。
このイベントりーのprod
,test
を簡略化するために、ネストされたグループを使用することも出来ます。
all: hosts: mail.example.com: children: webservers: hosts: foo.example.com: bar.example.com: dbservers: hosts: one.example.com: two.example.com: three.example.com: east: hosts: foo.example.com: one.example.com: two.example.com: west: hosts: bar.example.com: three.example.com: prod: children: east: test: children: west:
イベントリーを整理し、ホストをグループ化する方法は、イベントリーの設定例を参照してください。
1−3.ホスト範囲の追加
同様のパターンを持つホストが複数ある場合は、各ホスト名を個別に表示するのではなく ホスト範囲として追加できます。
- INIの場合は以下のようになります。
[webservers] www[01:50].example.com
- YAMLの場合は以下のようになります。
... webservers: hosts: www[01:50].example.com:
数値のパターンでは、必要に応じて、先頭にゼロを含めるか、または削除出来ます。
また、アルファベットの範囲を定義することも出来ます。
[databases] db-[a:f].example.com
【PlayBook概要】構築方法 4章:Playbookの実行
Playbookの実行
並列処理レベル10を使用してPlaybookを実行
ansible-playbook playbook.yml -f 10
Ansible-Pull
ansible-pull
は、gitから設定手順のリポジトリをチェックアウトし、そのコンテンツに対してansible-playbook
を実行する小さなスクリプトです。チェックアウトの場所を負荷分散する場合、
ansible-pull
は基本的に無限にスケーリングします。- 詳細は、
ansible-pull --help
を実行してください - プッシュモードからのcrontabで
ansible-pull
を設定する際に利用可能なclever playbookもあります。
Playbook文法チェック
ansible-lint
を使用してPlaybookの詳細チェックを実行する前にPlaybookを実行可能
例:
verify-apache/yml playbookでansible-lint
を実行すると以下の結果を得られます。
$ ansible-lint verify-apache.yml [403] Package installs should not use latest verify-apache.yml:8 Task/Handler: ensure apache is at the latest version
ansible-lintのデフォルトルールページでは、各エラーが説明されています。
[403]
の場合に推奨される修正は、Playbookのsate: latest
をstate: present
に変更する。
その他のPlaybook検証オプション
Playbookの検証に使用できるツールの詳細なリストは、Playbookを検証するためのツールを参照してください。
- playbookの構文を確認するには、
--syntax-check
フラグを指定してansible-playbook
を使用します。 (これにより、パーサーを介してPlaybookファイルが実行され、インクルードダイルやろ0るなどに構文上の問題が無いことが確認されます。) - Playbookの実行の下部を見て、対象となったノードの概要やその実行方法を確認します。 (一般的な障害と、致命的な「到達不能」な通信の試行は、個別にカウントされます。)
- 成功したモジュールだけでなく、失敗したモジュールからの詳細な出力を表示する場合は、
--verbose
フラグを使用します。 (これは、Ansible0.5以降で利用できます。) - 実行する前にPlaybbokの影響を受けるホストを確認するには、次のようにします
ansible-playbook playbook.yml --list-hosts
【PlayBook概要】構築方法 3章:タスク
各Playにはタスクリストが含まれている
- タスクは、次のタスクに進む前に、ホストパターンに一致するマシンに対して、
一度に1つずつ順番
に実行されます。 Play
内では、全てのホストが同じタスクディレクティブを取得することを理解することが重要。- Playの目的は、選択したホストをタスクにマップすることです。
- 上から下に実行されるPlaybookを実行すると、タスクが失敗したホストは、Playbook全体のローテーションから除外されます。
- 問題が発生した場合は、Playbookファイルを修正し、再実行します。
各タスクの目的
- 非常に具体的な引数を使用してモジュールを実行することです。
- 変数はモジュールの引数で使用できます。
- モジュールは冪等(べきとう)である必要があります。
- モジュールをシーケンスで複数回実行すると、1回だけ実行した場合と同じ結果になります。
- 冪等性(べきとうせい)を達成する1つの方法は、モジュールに目的の最終状態がすでに実現しているかどうかを確認し、その状態が実現している場合は、アクションを実行せずに終了することです。
important
Playbookが使用するすべてのモジュールの冪等(べきとう)である場合は、Playbook自体が冪等(べきとう)である可能性が高いため、Playbookを再実行しても安全です。
commandモジュールとshellモジュール
- 通常、同じコマンドを実行します。
chmod
またはsetsebool
などのコマンドの場合は、まったく問題ありません。- これらのモジュールを冪等(べきとう)にするために使用できる
creates
フラグが利用できます。
すべてのタスクにはname
が必要です。
これは、Playbookの実行から出力に含まれます。
人間が読める形式の出力であるため、各タスクステップの適切な説明を提供すると便利です。
ただし、名前が指定されてない場合は、actionに渡される文字列
が出力されます。
推奨は
タスクは、レガシーの
action:module option
形式を使用して宣言出来ますが より一般的なmodule:option
形式を使用することが推奨されます。
この推奨される形式はドキュメント全体で使用されていますが
一部のPlaybook
では古い形式を使用している場合があります。
以下は基本的なタスクです。
ほとんどのモジュールの場合と同様、サービスモジュールはkey=value
引数をとります。
tasks: - name: make sure apache is running service: name: httpd state: started
commandモジュールとshellモジュールは
引数のリストを取り、
key=value
形式を使用しないユイツのモジュールです。 これにより、それらは予想どおりに機能します。
name: enable selinux command: /sbin/setenforce 1
commandモジュールとshellモジュールは戻りコードを処理するため コマンドがあり、その正常な終了コードがゼロでない場合は以下を行うことが出来ます。
name: run this command and ignore the result shell: /usr/bin/somecommand || /bin/true
アクション行が長すぎて快適ではなくなった場合
スペースで改行し、継続している行にインシデントを追加できます。
name:Copy ansible inventory file to client copy: src=/etc/ansible/hosts dest=/etc/ansible/hosts owner=root group=root mode=0644
変数はアクション行で使用できます。
たとえば、vars
セクションでvhost
という名前の変数定義したとすると、次のようになります。
name: create a virtual host file for {{ vhost }} template: src: somefile.j2 dest: /etc/httpd/conf.d/{{ vhost }}
同じような変数は、後で使用するテンプレートで使用できます。
非常に基本的なPlaybookでは、すべてのタスクがそのPlay
に直接リストされますが
通常は「再利用可能なPlaybookの作成」の説明に従って、タスクを破損せる方が分かりやすくなります。
アクション(短縮形表記)
Ansibleでは、以下のようなモジュールリストが推奨されます。
template: src: templates/foo.j2 dest: /etc/foo.conf
Ansibleの初期バージョンでは以下の形式が使用されていましたが、これは引き続き動作します。
action: template src=templates/foo.j2 dest=/etc/foo.conf
ハンドラー:変更時の操作の実行
モジュールは冪等(べきとう)である必要があり、リモートシステムに変更を加えた時にリレーできます。Playbookはこれを認識し、変化に対応すために使用できる基本的なイベントシステムを備えています。
これらの「通知」アクションは、Play
のタスクの各ブロックの最後にトリガーされ、複数の異なるタスクから通知された場合でも1回だけトリガーされます。
たとえば、複数のリソースが設定ファイルを変更したためにApacheを再起動する必要があることを示している場合がありますが、不必要な再起動を回避するために、Apacheは1回だけバウンスされます。
<実例>
次に、ファイルの内容が変更された時に2つのサービスを再起動する。
ファイルが変更された場合のみ
name: template configuration file template: src: template.j2 dest: /etc/foo.conf #ハンドラーと呼ばれている notify: restart memcached restart apache
タスクのnotify
セクションに挙げられているものは、ハンドラーと呼ばれています。
ハンドラーとは
- タスクのリストであり、通常のタスクとの違いはない。
- グローバルに一意の名前で参照され、通知機能によって通知されます。
- ハンドラーは何も通知しないと、実行されません。
- ハンドラーに通知するタスクの数に関係なく、特定の
Play
でタスクがすべて完了すると、ハンドラーは1回だけ実行されます。
以下は、ハンドラーセクションの例
handlers: - name: restart memcached service: name: memcached state: restarted - name: restart apache service: name: apache state: restarted
Ansibleハンドラーが変数を使用することが望ましい場合があります。
たとえば、サービスの名前がディストリビューションによって若干異なる場合は、出力で各ターゲットマシンについて再起動したサービスの正確な名前を表示させる必要があります。
ハンドラーの名前を変数にしないようにします。
ハンドラー名はすぐにテンプレート化されるため、Ansibleには以下のように、ハンドラー名に使用できない値がない場合がある。
handlers: # this handler name may cause your play to fail! - name: restart “{{ web_service_name }}”
ハンドラー名で使用される変数が使用出来ない場合
Play
全体が失敗します。
この変数を中間のPlay
に変更すると、ハンドラーは新たには作成されません。
代わりに、変数をハンドラーのtaskパラメータに設定します。
以下のようなinclude_vars
を使用して値を読み込むことが出来ます。
tasks: - name:Set host variables based on distribution include_vars: "{{ ansible_facts.distribution }}.yml"
handlers: name: restart web service service: name: “{{ web_service_name | default(‘httpd’) }}” state: restarted
Ansible2.2以降、ハンドラーは一般的なトピックを「リッスン」することもでき、タスクは次のようにそれらのトピックに通知できます。
handlers: name: restart memcached service: name: memcached state: restarted listen: “restart web services” name: restart apache service: name: apache state: restarted listen: “restart web services” tasks: name: restart everything command: echo “this task will restart the web services” notify: “restart web services”
この使用により、複数のハンドラーをトリガーすることがはるかに簡単になります。
また、ハンドラーを名前から切り離し、Playbookとロールの間でハンドラーを共有しやくします。
(特にGalaxyなどの共有ソースからサードパーティのロールを使用する場合)
note
・通知ハンドラーは常に、notify-statementに記載される順番ではなく、
定義される順序で実行されます。これは、listenを使用するハンドラーの場合
でも当てはまります。
・ハンドラー名とlistenトピックは、グローバルな名前空間にあります。
・ハンドラー名は一時的なものですが、listenトピックは一時的ではありません。
・固有のハンドラー名を使用します。
同じ名前のハンドラーを複数トリガーすると、最初のハンドラーが上書きされます。
定義された最後のモノのみが実行されます。
・インクルード内で定義されたハンドラーに通知することは出来ません。
Ansible2.1の時点ではこれは機能しますが、包含は静的だある必要がります。
ロールについては、次の点に注意してください。
・pre_task
セクション、task
セクション、およびpost_task
セクション内で通知される
ハンドラーは、通知されたセクションの最後に自動的にフラッシュされます。
・roles
セクション内で通知されるハンドラーは、tasks
セクションの最後ではなく、
tasks
ハンドラーの前に自動的にフラッシュされます。
・ハンドラーはスコープのあるPlay
であるため、
ハンドラーは定義されているロールの外で使用できます。
すべてのハンドラーコマンドをすぐにフラッシュする必要のある場合は、
以下を実行できます。
tasks: shell: some tasks go here meta: flush_handlers shell: some other tasks
上記の例では、meta
ステートメントに到達したときに、キューに入れられたハンドラーが処理されます。
これは少しニッチなケースですが、時々役に立ちます。