AnsiblePlaybookで条件文を使用する方法
Ansibleでは、タスクが実行される前に評価される条件を定義できます。 条件が満たされない場合、タスクはスキップされます。 これは、 when
キーワード。通常、変数またはファクトに基づく式を受け入れます。
次の例では、2つの変数を定義しています。 create_user_file
と user
. いつ create_user_file
に評価されます true
、によって定義されたユーザーのホームディレクトリに新しいファイルが作成されます。 user
変数:
と呼ばれる新しいファイルを作成します playbook-04.yml
あなたの中で ansible-practice
ディレクトリ:
- nano ~/ansible-practice/playbook-04.yml
次に、新しいプレイブックファイルに次の行を追加します。
---
- hosts: all
vars:
- create_user_file: yes
- user: sammy
tasks:
- name: create file for user
file:
path: /home/{{ user }}/myfile
state: touch
when: create_user_file
内容の編集が完了したら、ファイルを保存して閉じます。
インベントリファイルからサーバー上でこのプレイブックを実行するには、 ansible-playbook
このシリーズの他のプレイブックを実行するときに以前に使用したのと同じ接続引数を使用します。 ここでも、という名前のインベントリファイルを使用します inventory
およびsammyユーザーは、リモートサーバーに接続します。
- ansible-playbook -i inventory playbook-04.yml -u sammy
条件が満たされると、 changed
再生出力のステータス:
Output...
TASK [create file for user] *****************************************************************************
changed: [203.0.113.10]
...
の値を変更した場合 create_user_file
に no
、条件は次のように評価されます false
. この場合、次のように表示されます。 skipping
タスクが実行されなかったことを示す、再生出力のステータス:
Output...
TASK [create file for user] *****************************************************************************
skipping: [203.0.113.10]
...
Ansibleプレイブックのコンテキストでの条件の一般的な使用法は、それらを register
、新しい変数を作成し、コマンドから取得した出力を割り当てるキーワード。 このように、任意の外部コマンドを使用して、タスクの実行を評価できます。
注意すべき重要な点の1つは、デフォルトでは、条件の評価に使用しているコマンドが失敗した場合、Ansibleが再生を中断することです。 そのため、 ignore_errors
ディレクティブをに設定 yes
上記のタスクで、これによりAnsibleは次のタスクに進み、プレイを続行します。
次の例では、ファイルがまだ存在しない場合にのみ、ユーザーのホームディレクトリに新しいファイルを作成します。これをテストします。 ls
指図。 ただし、ファイルが存在する場合は、 debug
モジュール。
と呼ばれる新しいファイルを作成します playbook-05.yml
あなたの中で ansible-practice
ディレクトリ:
- nano ~/ansible-practice/playbook-05.yml
次に、次のコンテンツを新しいプレイブックファイルに追加します。
---
- hosts: all
vars:
- user: sammy
tasks:
- name: Check if file already exists
command: ls /home/{{ user }}/myfile
register: file_exists
ignore_errors: yes
- name: create file for user
file:
path: /home/{{ user }}/myfile
state: touch
when: file_exists is failed
- name: show message if file exists
debug:
msg: The user file already exists.
when: file_exists is succeeded
完了したら、ファイルを保存して閉じます。
次に、実行します ansible-playbook
前の例と同じ接続引数を使用します。 ここでは、という名前のインベントリファイルを使用しています inventory
およびという名前のユーザー sammy
、ただし、それに応じてこれらの値を変更する必要があります。
- ansible-playbook -i inventory playbook-05.yml -u sammy
このプレイブックを初めて実行するとき、ファイルがそのパスに存在しないため、コマンドは失敗します。 次に、ファイルを作成するタスクが実行され、最後のタスクはスキップされます。
...
[secondary_label Output]
TASK [Check if file already exists] *********************************************************************
fatal: [203.0.113.10]: FAILED! => {"changed": true, "cmd": ["ls", "/home/sammy/myfile"], "delta": "0:00:00.004258", "end": "2020-10-22 13:10:12.680074", "msg": "non-zero return code", "rc": 2, "start": "2020-10-22 13:10:12.675816", "stderr": "ls: cannot access '/home/sammy/myfile': No such file or directory", "stderr_lines": ["ls: cannot access '/home/sammy/myfile': No such file or directory"], "stdout": "", "stdout_lines": []}
...ignoring
TASK [create file for user] *****************************************************************************
changed: [203.0.113.10]
TASK [show message if file exists] **********************************************************************
skipping: [203.0.113.10]
...
出力から、次のことがわかります。 create file for user
タスクによってサーバーが変更されました。これは、ファイルが作成されたことを意味します。 ここで、プレイブックを再度実行すると、別の結果が得られます。
- ansible-playbook -i inventory playbook-05.yml -u sammy
Output...
TASK [Check if file already exists] *********************************************************************
changed: [203.0.113.10]
TASK [create file for user] *****************************************************************************
skipping: [203.0.113.10]
TASK [show message if file exists] **********************************************************************
ok: [203.0.113.10] => {
"msg": "The user file already exists."
}
...
Ansibleプレイブックでの条件の使用について詳しく知りたい場合は、公式ドキュメントを参照してください。