概要
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でエラーハンドリングをやってみました。
基本的には各タスクはすべて正常であるべきだと思いますが、異常な値がかえってくる可能性がある処理をコントロールしない場合にはこのようにやってみるといいとおもいます。