はじめに
お疲れ様です。
今回は、assert モジュールについてまとめていきます。
assertモジュールですが個人的に機能がボリューミーだと思ってます。
あまり理解できていないところもありますが、分かる範囲で備忘録で残しておきます。
間違っている箇所もあるかと思うので、なにか気になることがあったら@nakayumc0278 まで直接連絡いただければと思います。
TL;DR
- assert モジュールを使うことで、ある値が指定した条件に合致しているか判定できる。
- 複数の条件式がある場合、AND と OR で判定させることができる。
- ignore_errors ディレクティブを使うことで、エラーとなっても Playbook の処理を継続させることができる
assertモジュールとは何ぞや??
assert
モジュールとは、ある値が期待した条件を合致しているか判定できるモジュールです。
基本的に、assert の結果がfaild
になると、それ以降の Playbook の処理が止まります。
環境
環境は下記の通りです。前回と同じ環境です。
- サーバとか
名前 | IPアドレス | OS |
---|---|---|
control | 192.168.1.110 | RHEL 8.6 |
node01 | 192.168.1.111 | CentOS 7 |
node02 | 192.168.1.112 | CentOS 7 |
- ユーザ周り
ユーザ名 | パスワード |
---|---|
ansible | ansible |
- ansible バージョン
(venv) ansible [core 2.12.1]
検証した Inventory ファイル
今回検証に使った inventory ファイルはこんな感じです。
最低限のことしか書いていません。
[nodes] node01 ansible_host=192.168.1.111 [nodes:vars] ansible_user=ansible ansible_password=ansible
基本的な使い方と実行結果
条件式が1つだけの場合
成功するパターン
下記に記載のthat
にある条件式が、左の111
と右の111
が等しいので、実行結果がAll assertions passed
となり、成功します。
--- - name: assert check ansible.builtin.assert that: - 111 == 111
実行結果
ok: [node01] => { "changed": false, "msg": "All assertions passed" }
失敗するパターン
that
にある条件式が、左の111
と 右の999
が等しくないので、この場合は実行結果がAssertion failed
となり、エラーが吐かれます。
--- - name: assert check ansible.builtin.assert: that: - 111 == 999
実行結果
fatal: [node01]: FAILED! => { "assertion": "111 == 999", "changed": false, "evaluated_to": false, "msg": "Assertion failed" }
複数の条件式がある場合
assertには複数の条件式を指定して判断させることができます。
2つの条件判定があり、ANDとORがあります。
AND条件とき
AND条件の場合は、条件式がすべて等しい場合に成功し、1つでも等しくない条件式があると失敗します。
成功するパターン
これは条件式がすべて等しいので、All assertions passed
となり、成功します。
--- - name: assert check ansible.builtin.assert: that: - 111 == 111 - 222 == 222
実行結果
ok: [node01] => { "changed": false, "msg": "All assertions passed" }
失敗するパターン
この場合は、2つ目の条件式が222 == 999
となっています。 この場合だとすべて等しくないので、Assertion failed
が出力され、失敗します。
--- - name: assert check ansible.builtin.assert: that: - 111 == 111 - 222 == 999
実行結果
fatal: [node01]: FAILED! => { "assertion": "222 == 999", "changed": false, "evaluated_to": false, "msg": "Assertion failed" }
OR条件とき
OR条件の場合は、1つでも成功すればAll assertions passed
となります。
成功するパターン
これは、111 == 444
では等しくありませんが、後ろの222 == 222
では等しいため、All assertions passed
が出力され、成功します。
--- - name: assert check ansible.builtin.assert: that: 111 == 444 or 222 == 222
実行結果
ok: [node01] => { "changed": false, "msg": "All assertions passed" }
失敗するパターン
この場合は、2つの条件式がどちらも等しくない場合はAssertion failed
となり、失敗します。
--- - name: assert check ansible.builtin.assert: that: 111 == 444 or 222 == 999
実行結果
fatal: [node01]: FAILED! => { "assertion": "111 == 444 or 222 == 999", "changed": false, "evaluated_to": false, "msg": "Assertion failed" }
assert で failed になると、、、
ここからは、 assert モジュールの 結果が failed
になると、基本的にそれ以降のPlaybookの処理が止まることについて解説していきます。
失敗したとき
まず、失敗パターンです。条件式を111 == 999
としているので、等しくないです。
--- - name: assert check ansible.builtin.assert: that: 111 == 999 - name: output message ansible.builtin.debug: msg: "Hello. I'm a cat. I'm not cat command."
実行した結果
PLAY [node01] ****************************************************************** TASK [assert check] ************************************************************ fatal: [node01]: FAILED! => { "assertion": "111 == 999", "changed": false, "evaluated_to": false, "msg": "Assertion failed" }
このように、assert が実行され、111 == 999
となっており等しくないので、Assertion failed
となりました。このとき、2つ目のdebugモジュールが実行されていません。
成功したとき
次に、成功したパターンです。
--- - name: assert check ansible.builtin.assert: that: 111 == 111 - name: output message ansible.builtin.debug: msg: "Hello. I'm a cat. I'm not cat command."
実行した結果
PLAY [node01] ****************************************************************** TASK [assert check] ************************************************************ ok: [node01] => { "changed": false, "msg": "All assertions passed" } TASK [output message.] ********************************************************* ok: [node01] => { "changed": false, "msg": "Hello. I'm a cat. I'm not cat command." }
はい、実行結果のように assert が実行されて、111 == 111
となっており等しいためAll assertions passed
となりました。
その後、処理が継続されて、2つ目のdebugモジュールが実行されました。
ignore_errors ディレクティブを使う
ignore_errors
ディレクティブとは、万一、エラーが発生しても Playbook の処理を継続させることができる機能です。
111 == 222
の下に、ignore_errors: true
を追加しました。
--- - name: assert check ansible.builtin.assert: that: 111 == 222 ignore_errors: true - name: output message. ansible.builtin.debug: msg: "Hello. I'm a cat. I'm not cat command."
実行結果
PLAY [node01] ****************************************************************** TASK [assert check] ************************************************************ fatal: [node01]: FAILED! => { "assertion": "111 == 222", "changed": false, "evaluated_to": false, "msg": "Assertion failed" } ...ignoring TASK [output message.] ********************************************************* ok: [node01] => { "changed": false, "msg": "Hello. I'm a cat. I'm not cat command." }
本来であれば、assert がエラーになっているため、Playbook の処理が止まりますが、ignore_errors: true
を追加したことにより、その後の処理が続行されました。
さいごに
今回は、assertモジュールについて触れました。
指定した値が正しく設定されているかどうかを確認するために使用されるため、よく使われるんじゃないかなと感じました。
ということが確認できました。