条件によって実行する task を定義する
when による条件分岐について調べたのでまとめておきます。
host の情報や他のコマンドの実行結果の値により実行する task を定義する事が出来ます。
task を実行するための条件は when 句で指定します。
when 句では変数を指定できるので、例えば --extra-vars を使用して以下のように外部から実行条件を指定する事ができます。
- when.yml
--- - user: root hosts: all tasks: - name: install mlocate yum: name=mlocate state=installed when: install == "y"
when 句での変数の参照には ${} や {{}} は付けない事に注意。
実行時には以下のように変数 install の値を渡します。
「y」以外の値を渡すと task の実行が skip されることが分かります。
$ ansible-playbook when.yml --extra-vars "install=n" -i hosts -k
vars_prompt で入力させるようにすれば、実行時に task 実行可否を決めさせることも可能です。
- when2.yml
--- - user: root hosts: all vars_prompt: - name: "install" prompt: "install mlocate?" private: no default: "y" tasks: - name: install mlocate yum: name=mlocate state=installed when: install == "y"
ansible では対象ホストの情報やインベントリで定義された情報についてアクセスするために自動的に定義されるいくつかの変数があります。
これらの変数の値を when 句で使用する事も可能です。
例えば以下ではインベントリファイルに定義したホスト名を取得する inventory_hostname を使って実行可否を切り替えています。
- when3.yml
- user: root hosts: all tasks: - yum: name=mysql state=latest when: inventory_hostname != 'example01'
また、register を使用して他の task の実行結果を変数に格納しておき、その値を他の task の when 句で使用することも出来ます。
この挙動を試すため、対象サーバで以下のようなファイルを作成します。
# echo "bar" > /tmp/testfile
以下の Playbook では先ほど作成したファイルの有無で処理の実行を切り替えています。
試しにファイルを削除すると task が実行されなくなることが分かります。
- when4.yml
- user: root hosts: all tasks: - command: test -f /tmp/testfile ignore_errors: true register: testfile_exist - lineinfile: dest=/tmp/testfile state=present regexp='^bar$' line=BAR when: testfile_exist.rc == 0
これらの条件付き実行タスクを使いこなす事でより一層柔軟な Playbook を定義することが出来るようになりそうです。
参考
Magic Variables, and How To Access Information About Other Hosts
http://docs.ansible.com/ansible/latest/playbooks_variables.html#magic-variables-and-how-to-access-information-about-other-hosts
Conditionals — Ansible Documentation
http://docs.ansible.com/ansible/latest/playbooks_conditionals.html
Registered Variables
http://docs.ansible.com/ansible/latest/playbooks_variables.html#registered-variables
shkumagai さんが Ansible 1.2.2 のドキュメントを日本語に翻訳して下さいました。
お陰で理解が進みました。
ありがとうございます。
ansible v1.2.2 ドキュメントを翻訳しました ― doing mistakes
http://shkumagai.github.io/blog/2013/08/19/ansible_docs_v1_2_2_translated.html
今回参照したドキュメントと対応する箇所は以下になります。