かべぎわブログ

技術的なことについてかけたらいいな…

Ansibleでwhenをつかってエラーハンドリングしてみる

概要

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

入門Ansible

入門Ansible