概要
when
ディレクティブを利用してAnsibleのplaybookでエラーハンドリングしてみます。
playbook
playbookはこんなかんじです。
copy
の結果をもとにwhen
でエラーハンドリングしています。
ちょっとした解説
3行目のcopy
を実行し、4行目のregister: result
でその結果を取得しています。
5行目のignore_errors: True
はエラーとなっても処理をつづける記載です。
エラーハンドリングしたいのにそこでAnsibleが終了してしまっては意味ないので記載しています。
8行目や11行目にあるwhen
は条件をみたすときに処理を実行するというディレクティブです。
今回の場合はcopy
の結果(result
)の値によって判定を行っています。
実行結果
実際に動いているところを見てみます。
コピーの結果ファイルが変更されたとき
copy
が実行されてファイル(今回の場合はsasasa.txt
)が変更されたときはcopy
の成功と変更が行われますので、以下のような感じの実行結果になります。
$ ansible-playbook -i ansible_hosts when.yml PLAY [localhost] ********************************************************************** TASK [Gathering Facts] ********************************************************************** ok: [localhost] TASK [copy] ********************************************************************** changed: [localhost] TASK [debug] ********************************************************************** ok: [localhost] => { "msg": "成功したよ(succedded)" } TASK [debug] ********************************************************************** skipping: [localhost] TASK [debug] ********************************************************************** ok: [localhost] => { "msg": "変更したよ(changed)" } TASK [debug] ********************************************************************** skipping: [localhost] PLAY RECAP ********************************************************************** localhost : ok=4 changed=1 unreachable=0 failed=0
成功と変更の旨のメッセージが出力されていることがわかります。
コピーしてもファイルに変化がなかったとき
続けざまにもう一度実行するとファイルの内容は同じでchanged
にはなりませんので、成功した旨のメッセージだけが出力されます。
$ ansible-playbook -i ansible_hosts when.yml PLAY [localhost] ************************************************************************************* TASK [Gathering Facts] ******************************************************************************* ok: [localhost] TASK [copy] ****************************************************************************************** ok: [localhost] TASK [debug] ***************************************************************************************** ok: [localhost] => { "msg": "成功したよ(succedded)" } TASK [debug] ***************************************************************************************** skipping: [localhost] TASK [debug] ***************************************************************************************** skipping: [localhost] TASK [debug] ***************************************************************************************** skipping: [localhost] PLAY RECAP ******************************************************************************************* localhost : ok=3 changed=0 unreachable=0 failed=0
コピーが失敗したとき
コピーするファイルが存在しなかった場合にはcopy
は失敗(failed
)となりますので以下のような動きになります。
$ ansible-playbook -i ansible_hosts when.yml PLAY [localhost] ************************************************************************************* TASK [Gathering Facts] ******************************************************************************* ok: [localhost] TASK [copy] ****************************************************************************************** An exception occurred during task execution. To see the full traceback, use -vvv. The error was: AnsibleFileNotFound: Could not find or access '/home/ec2-user/wawawa.txt2' fatal: [localhost]: FAILED! => {"changed": false, "msg": "Could not find or access '/home/ec2-user/wawawa.txt2'"} ...ignoring TASK [debug] ***************************************************************************************** skipping: [localhost] TASK [debug] ***************************************************************************************** ok: [localhost] => { "msg": "失敗したよ(failed)" } TASK [debug] ***************************************************************************************** skipping: [localhost] TASK [debug] ***************************************************************************************** skipping: [localhost] PLAY RECAP ******************************************************************************************* localhost : ok=3 changed=0 unreachable=0 failed=0
コピーがスキップされたとき
例が思いつかなかったけど以下のような動きになると思います。
$ ansible-playbook -i ansible_hosts when.yml PLAY [localhost] ************************************************************************************* TASK [Gathering Facts] ******************************************************************************* ok: [localhost] TASK [copy] ****************************************************************************************** ok: [localhost] TASK [debug] ***************************************************************************************** ok: [localhost] => { skipping: [localhost] } TASK [debug] ***************************************************************************************** skipping: [localhost] TASK [debug] ***************************************************************************************** skipping: [localhost] TASK [debug] ***************************************************************************************** ok: [localhost] => { "msg": "しなかったよ(skipped)" } PLAY RECAP ******************************************************************************************* localhost : ok=3 changed=0 unreachable=0 failed=0
おわりに
Ansibleでエラーハンドリングをやってみました。
基本的には各タスクはすべて正常であるべきだと思いますが、異常な値がかえってくる可能性がある処理をコントロールしない場合にはこのようにやってみるといいとおもいます。

- 作者: 若山史郎
- 発売日: 2014/07/30
- メディア: Kindle版
- この商品を含むブログ (2件) を見る