【ansible】Playbookの処理を分岐させる方法【構成管理】
こんにちは! システムソリューション部の讃岐です。
SREチームに異動してから2ヶ月が過ぎました。
まだまだ分からないことだらけですが、日々新しい物事を学べる環境に感謝です!
新しいことを学ぶのは楽しいですね!
本日は構成管理ツールのansibleについてです。
Playbookの処理を分岐させたい時ってありますよね。
例えば下記のようなPlaybookの処理を実行するとします。
中身は元ある設定ファイルをリネームした後に、新しい設定ファイルを設置するよくあるやつです。
- name: rename-conffile shell: mv /etc/hoge/main.cf /etc/hoge/main.cf_backup - name: conf-add 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-conffile-confirm stat: path=/etc/hoge/main.cf_backup register: result - name: rename-conffile shell: mv /etc/hoge/main.cf /etc/hoge/main.cf_backup when: not result.stat.exists - name: conf-add template: src="{{ inventory_dir }}/roles/hoge/template/conf.j2" dest="/etc/hoge/main.cf" owner=root group=root mode=644
rename-conffile-confirmという処理を見て下さい。
stat: path=/etc/hoge/main.cf_backup register: result
statモジュールを使用して、main.cf_backupが存在しているか確認しています。
存在していればresultという変数にTrueを、そうでなければFalseを格納します。
そしてget-backupの処理の中にwhenステートメントの記述がありますね。
when: not result.stat.exists
resultがTrueでない場合のみget-backupの処理を実行します。
実際に条件が一致した時に処理が実施されないことを確認してみます。
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-conffile-confirm] ****************************************** ok: [192.168.33.72] TASK [hoge : rename-conffile] ************************************************** skipping: [192.168.33.72] TASK [hoge : conf-add] ********************************************************* 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には様々な条件分岐をさせることができます。
詳しく知りたい方は是非、公式のドキュメントを読んでみて下さい!
公式ドキュメント