nakayumcの技術ブログ

エンジニア1年目のブログです。(旧ブログも混在してますが、こっちが新しいです)

anisbleの assertモジュールの基本的な使い方をまとめてみた

はじめに

お疲れ様です。
今回は、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モジュールについて触れました。
指定した値が正しく設定されているかどうかを確認するために使用されるため、よく使われるんじゃないかなと感じました。

ということが確認できました。