akishin999の日記

調べた事などを書いて行きます。

条件によって実行する 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 を定義することが出来るようになりそうです。