Ansibleでは、タスクが実行される前に評価される条件を定義できます。 条件が満たされない場合、タスクはスキップされます。 これは、 when キーワード。通常、変数またはファクトに基づく式を受け入れます。

次の例では、2つの変数を定義しています。 create_user_fileuser. いつ create_user_file に評価されます true、によって定義されたユーザーのホームディレクトリに新しいファイルが作成されます。 user 変数:

と呼ばれる新しいファイルを作成します playbook-04.yml あなたの中で ansible-practice ディレクトリ:

  1. nano ~/ansible-practice/playbook-04.yml

次に、新しいプレイブックファイルに次の行を追加します。

〜/ 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ユーザーは、リモートサーバーに接続します。

  1. ansible-playbook -i inventory playbook-04.yml -u sammy

条件が満たされると、 changed 再生出力のステータス:

Output
... TASK [create file for user] ***************************************************************************** changed: [203.0.113.10] ...

の値を変更した場合 create_user_fileno、条件は次のように評価されます 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 ディレクトリ:

  1. nano ~/ansible-practice/playbook-05.yml

次に、次のコンテンツを新しいプレイブックファイルに追加します。

〜/ 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、ただし、それに応じてこれらの値を変更する必要があります。

  1. 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 タスクによってサーバーが変更されました。これは、ファイルが作成されたことを意味します。 ここで、プレイブックを再度実行すると、別の結果が得られます。

  1. 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プレイブックでの条件の使用について詳しく知りたい場合は、公式ドキュメントを参照してください。