【Ansible】Playbookの処理を分岐させる方法【構成管理】
こんにちは! システムソリューション部のしめじです。
SRE チームに異動してから2ヶ月が過ぎました。
まだまだ分からないことだらけですが、日々新しい物事を学べる環境に感謝です!
新しいことを学ぶのは楽しいですね!
本日は構成管理ツールの Ansible についてです。
Playbook の処理を分岐させたい時ってありますよね。
例えば下記のような Playbook の処理を実行するとします。
中身は元ある設定ファイルをリネームした後に、新しい設定ファイルを設置するよくあるやつです。
- name: Rename Config File shell: mv /etc/hoge/main.cf /etc/hoge/main.cf_backup - name: Deploy Config File template: src: "{{ inventory_dir }}/roles/hoge/template/conf.j2" dest: "/etc/hoge/main.cf" owner: root group: root mode: 644
上記の処理は特に何事もなく「元ある設定ファイルをリネーム」して、「新たな設定ファイルの設置」が完了します。
ただ、既に「main.cf_backup」というファイルがあれば処理をスキップしたい…。
そんな時は Registered Variables と when statement を使いましょう。
Registered Variables を使うと実行したタスクの実行結果を変数に入れることが出来ます。
その結果を元に処理を分岐させれば、処理をスキップできますね。
処理を分岐させるには、when statement を使用します。
ファイルが既にある場合はスキップしたい時
上記を考慮した Playbook の処理が下記になります。
- name: Rename Config File Confirm stat: path: /etc/hoge/main.cf_backup register: result - name: Rename Config File shell: mv /etc/hoge/main.cf /etc/hoge/main.cf_backup when: not result.stat.exists - name: Deploy Config File template: src: "{{ inventory_dir }}/roles/hoge/template/conf.j2" dest: "/etc/hoge/main.cf" owner: root group: root mode: 644
Rename Config File Confirm という処理を見て下さい。
stat: path: /etc/hoge/main.cf_backup register: result
stat モジュールを使用して、main.cf_backup が存在しているか確認しています。
存在していれば result という変数に True を、そうでなければ False を格納します。
そして Rename Config File の処理の中に when ステートメントの記述がありますね。
when: not result.stat.exists
result が True でない場合のみ Rename Config File の処理を実行します。
実際に条件が一致した時に処理が実施されないことを確認してみます。
main.cf_backup が存在する下記サーバに対して処理を実行してみます。
・192.168.33.72【 CentOS72 】
ansible-playbook -i hosts operation.yml --ask-pass
PLAY [apply common configuration to all nodes] ********************************* TASK [Gathering Facts] ********************************************************* ok: [192.168.33.72] TASK [hoge : Rename Config File Confirm] ****************************************** ok: [192.168.33.72] TASK [hoge : Rename Config File] ************************************************** skipping: [192.168.33.72] TASK [hoge : Deploy Config File] ********************************************************* ok: [192.168.33.72] PLAY RECAP ********************************************************************* 192.168.33.72 : ok=3 changed=0 unreachable=0 failed=0
うん、処理がスキップされていますね。
その他の分岐処理
when statement は他にも様々な条件分岐をさせることが出来ます。
下記は OS が CentOS7 の場合のみ Apache をインストールする Playbook になります。
- name: CentOS7 Install Apache yum: name: httpd state: present when: - ansible_facts['distribution'] == "CentOS" - ansible_facts['distribution_major_version'] == "7"
条件はリスト形式にて書くことが可能です。
その場合は全ての条件に合致した場合のみ処理が実行されます。
(上記例では OS が CentOS でバージョンが 7 の場合)
実際に下記2つのサーバに対して処理を実行してみましょう。
・192.168.33.67【 CentOS67 】
・192.168.33.72【 CentOS72 】
ansible-playbook -i hosts operation.yml --ask-pass
PLAY [apply common configuration to all nodes] ********************************* TASK [Gathering Facts] ********************************************************* ok: [192.168.33.65] ok: [192.168.33.72] TASK [test : CentOS7-install-apache] ******************************************* skipping: [192.168.33.65] changed: [192.168.33.72] PLAY RECAP ********************************************************************* 192.168.33.65 : ok=1 changed=0 unreachable=0 failed=0 192.168.33.72 : ok=2 changed=1 unreachable=0 failed=0
192.168.33.72 にのみ処理が実行されていますね。
成功です!
終わりに
簡単なご紹介となりましたが、
他にも when statement には様々な条件分岐をさせることができます。
詳しく知りたい方は是非、公式のドキュメントを読んでみて下さい!
公式ドキュメント