【Ansible Tower/AWX】条件分岐処理の記述方法


この記事はプロモーションを含みます。

Ansible

ホーム > Ansible Tower・AWX リファレンス

Ansibleも他言語と同様に条件分岐処理を実装することが可能です。ここでは、実例を交えながら条件分岐処理の記述方法を解説したいと思います。

Ansibleでのループ処理は、他言語でよく見かけるIf文ではなく、「when」ディレクティブを使用します。

書式

whenディレクティブの書式です。

- name: 処理名
  処理:
  when: 分岐条件

比較演算子を使った条件分岐

比較演算子を使用した条件分岐のサンプルです。

使用できる比較演算子

条件として使用できる比較演算子です。

演算子説明
x == yx の値と y の値が等しい場合は ture
x != yx の値と y の値が等しくない場合は true
x > yx の値が y の値より大きい場合は true
x < yx の値が y の値より小さい場合は true
x >= yx の値が y 以上の場合は true
x <= yx の値が y 以下の場合は true

値が一致する場合のサンプル

x と y の値が一致する場合のサンプルです。

---
- hosts: all
  gather_facts: False
  tasks:

  - name: 比較演算子を使った条件分岐
    vars:
      x: 100
      y: 100
    debug:
      msg: 値xと値yは一致します。
    when: x == y

実行結果です。


SSH password: 
BECOME password[defaults to SSH password]: 
PLAY [all] *********************************************************************
TASK [比較演算子を使った条件分岐] ***********************************************************
ok: [192.168.56.105] => {
    "msg": "値xと値yは一致します。"
}
PLAY RECAP *********************************************************************
192.168.56.105             : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

y の値を[200]に変更して実行してみました。
値が一致しない場合は処理がスキップされます。


検索
SSH password: 
BECOME password[defaults to SSH password]: 
PLAY [all] *********************************************************************
TASK [比較演算子を使った条件分岐] ***********************************************************
skipping: [192.168.56.105]
PLAY RECAP *********************************************************************
192.168.56.105             : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

論理演算子を使った条件分岐

論理演算子を使用した条件分岐のサンプルです。
また、複数の条件を用いた条件分岐についてもこちらで説明しています。

使用できる論理演算子

演算子説明
not 条件1条件1 が false の場合は true
条件1 and 条件2条件1 と条件2 の両方が true の場合は true
条件1 or 条件2条件1 か 条件2 のどちらかが true の場合は true

2つの条件の両方がtrueの場合のサンプル

条件1 と条件2 の両方がtrueの場合に処理を実行するサンプルです。

---
- hosts: all
  gather_facts: False
  tasks:

  - name: 論理演算子を使った条件分岐
    vars:
      x: 100
      y: 100
    debug:
      msg: 条件1 と 条件2 は ture です。
    when: x == 100 and y == 100

実行結果です。


SSH password: 
BECOME password[defaults to SSH password]: 
PLAY [all] *********************************************************************
TASK [論理演算子を使った条件分岐] ***********************************************************
ok: [192.168.56.105] => {
    "msg": "条件1 と 条件2 は ture です。"
}
PLAY RECAP *********************************************************************
192.168.56.105             : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

y の値を[200]に変更して実行してみました。
2つの条件の片方でも、trueとならない場合は処理がスキップされます。


SSH password: 
BECOME password[defaults to SSH password]: 
PLAY [all] *********************************************************************
TASK [論理演算子を使った条件分岐] ***********************************************************
skipping: [192.168.56.105]
PLAY RECAP *********************************************************************
192.168.56.105             : ok=0    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

ある値が配列に含む・含まれない場合の条件分岐

in演算子を使用した条件分岐のサンプルです。
ある値が配列に含まれる(含まれない)場合に処理を実行する条件を設定することが可能です。

使用できるin演算子

演算子説明
値a in [x, y, z]値a と同じ値が x, y, z に含まれる場合は true
値a not in [x, y, z]値a と同じ値が x, y, z に含まれない場合は true
値a in 配列x値a と同じ値が 配列x に含まれる場合は true
値a not in 配列x値a と同じ値が 配列x に含まれない場合は true

ある値が配列に含まれる場合のサンプル

値a が配列x に含まれる場合に処理を実行するサンプルです。

---
- hosts: all
  gather_facts: False
  tasks:

  - name: in演算子を使った条件分岐
    vars:
      a: 100
      x:
       - 100
       - 200
       - 300
    debug:
      msg: 値a は配列x に含まれます。
    when: a in x

実行結果です。

SSH password: 
BECOME password[defaults to SSH password]: 
PLAY [all] *********************************************************************
TASK [in演算子を使った条件分岐] ***********************************************************
ok: [192.168.56.105] => {
    "msg": "値a は配列x に含まれます。"
}
PLAY RECAP *********************************************************************
192.168.56.105             : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

a の値を[900]に変更して実行してみました。
配列に含まれた値と一致する値が存在しないため処理がスキップされます。


SSH password: 
BECOME password[defaults to SSH password]: 
PLAY [all] *********************************************************************
TASK [in演算子を使った条件分岐] ***********************************************************
skipping: [192.168.56.105]
PLAY RECAP *********************************************************************
192.168.56.105             : ok=0    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

変数が定義されている・されていない場合の条件分岐

変数が定義されている場合、または定義されていない場合に処理を実行するサンプルです。

書式

変数が定義されている、されていない場合の条件分岐は「変数名 is defined」と記述します。

項目書式
定義されているwhen: 変数名 is defined
定義されていないwhen: 変数名 is not defined

変数が定義されている場合のサンプル

変数が定義されている場合のみに処理を実行するサンプルです。

---
- hosts: all
  gather_facts: False
  tasks:

  - name: 変数が定義されている例
    vars:
      foo: "変数の定義"
    debug:
      msg: "変数は定義されています。"
    when: foo is defined

  - name: 変数が定義されていない例
    debug:
      msg: "変数は定義されていません。"
    when: bar is defined

実行結果です。変数が定義されている場合のみ処理が実行されていることが分かります。

SSH password: 
BECOME password[defaults to SSH password]: 
PLAY [all] *********************************************************************
TASK [変数が定義されている例] *************************************************************
ok: [192.168.56.106] => {
    "msg": "変数は定義されています。"
}
TASK [変数が定義されていない例] ************************************************************
skipping: [192.168.56.106]
PLAY RECAP *********************************************************************
192.168.56.106             : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

変数が定義されていない場合のサンプル

変数が定義されていない場合のみに処理を実行するサンプルです。

---
- hosts: all
  gather_facts: False
  tasks:

  - name: 変数が定義されている例
    vars:
      foo: "変数の定義"
    debug:
      msg: "変数は定義されています。"
    when: foo is not defined

  - name: 変数が定義されていない例
    debug:
      msg: "変数は定義されていません。"
    when: bar is not defined

実行結果です。変数が定義されていない場合のみ処理が実行されていることが分かります。

SSH password: 
BECOME password[defaults to SSH password]: 
PLAY [all] *********************************************************************
TASK [変数が定義されている例] *************************************************************
skipping: [192.168.56.106]
TASK [変数が定義されていない例] ************************************************************
ok: [192.168.56.106] => {
    "msg": "変数は定義されていません。"
}
PLAY RECAP *********************************************************************
192.168.56.106             : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

ファイルの存在有無で条件分岐

ファイルの存在確認を行い、その結果を元に処理を条件分岐させる方法については以下の記事で説明しています。

記事は以上です。
If文同様の基礎的な文法となるFor文(ループ処理)は以下を参考にして下さい。

コメント

タイトルとURLをコピーしました