[Ansible]シェルの実行結果によって条件分岐する

タイトルの通り、シェルの実行結果によって、Ansibleの挙動を制御する方法を考える。

Ansibleで何か実行する場合、通常、その目的を達成するモジュールを探すわけですが、モジュールだけでは細かい制御ができないことが多く、シェルを実行するモジュールにシェルコマンドを渡すことが多くなります。

そういった際にシェルの実行結果を取得し、結果によって別の動きをする条件分岐を行えると便利です。

例えば、

grep 'hello' test.txt

のように、test.txt文中に「hello」という文字列があるか?
ということを調べる場合、以下のような形でYMLを書きます。

- name: check hello
    shell:      "grep 'hello' text.txt"
    register:    check_hello
    failed_when: check_hello.rc not in [0,1]

直感的に shellの結果を registerの引数であるcheck_helloに格納するというのは分かると思います。

直感的にわからないのは、failed_when: の部分です。

check_hello.rc
「rc」return codeのことであり、シェル実行時のリターンコードです。正常終了で「0」, 異常終了で「1」が格納されます。

それを踏まえてfailed_when: の部分を見直すと、
check_hello.rc が 0か1で無い時に failed する ということになります。

このfailed_whenが無いとシェルが異常終了の時 (今回のケースでは、test.txtに'hello'が含まれてない時)にAnsibleがエラーで止まってしまいますので、必ずfailed_whenを入れます。

後は、check_hello.rc を基にして、条件分岐を作れば良いでしょう。
例えば、以下の通りです。

debug: 
    msg: 'hello is found!!'
when: check_hello.rc == 0

debug: 
    msg: 'hello is not found'
when: check_hello.rc == 1

ということで、
今回はAnsibleの条件分岐についてでした。

以上、
「がの」がお送りしました(^o^)/








この記事が気に入ったらサポートをしてみませんか?