Ansible when
および他の条件を使用して、異なる条件に基づいてAnsibleタスクを実行する必要がある場合は、楽しいことになります。前のタスクに依存するかどうか、OSに基づいて条件を評価することができます。
このチュートリアルでは、Ansible when
および他の条件を使用して、タスクを実行せずにすむようにする方法を学びます。
さあ、始めましょう!
前提条件
このチュートリアルには実践的な例が含まれています。一緒に進める場合は、以下が整っていることを確認してください:
- Ansibleコントローラホスト – このチュートリアルでは、Ubuntu 18.04.5 LTSマシンにホストされたAnsible v2.9.24を使用しています。
- A remote computer to run commands.
- インベントリファイルが設定されており、既にAnsibleコマンドおよびプレイブックを実行できるようになっている1つ以上のホストが必要です。このチュートリアルでは、インベントリグループwebを使用します。
プレイブック内で複数のタスクと一緒にAnsible when
を使用する
複数のタスクが条件なしですべて実行されると、プレイブックでの複数のタスクは手間です。このチュートリアルでは、Ansibleプレイブックの複数のタスクでAnsible when
条件を定義することから始めましょう。
1. Ansibleコントローラーホストでターミナルを開きます。
2. 以下のコマンドを実行して、ホームディレクトリにディレクトリを作成し、任意の名前を付け、そのディレクトリに移動します。
この例では、ディレクトリの名前は ansible_when_condition_demo
です。このディレクトリには、Ansibleタスク内で when 条件を呼び出すのに使用する playbook が含まれます。
3. 好みのコードエディタで、~/ansible_when_condition_demo ディレクトリに YAML ファイルを作成します。この例では、ファイルの名前は my_playbook.yml です。以下の YAML プレイブックの内容を my_playbook.yml ファイルにコピーして貼り付けます。
両方のタスク (Task-1
および Task-2
) では、when
条件が各リモートホストのオペレーティングシステムを確認します。その結果は、それぞれのタスクの ansible_os_family
プレースホルダ変数に渡されます。
もしansible_os_family
のプレースホルダーの値がRedHat
またはDebian
と等しい場合、AnsibleはApacheをインストールするタスクのいずれかを実行します。
4. 以下のansible-playbook
コマンドを実行して、既存のインベントリファイルで定義されているリモートホストで(my_playbook.yml)に定義されたタスクを実行します。
以下のスクリーンショットでは、次のことがわかります:
- 最初のタスクはOKステータスを返し、タスクに変更が必要ないことを示します。
- 2番目のタスクはスキップステータスを返しました。条件が満たされない場合、タスクはスキップされます。
- 3番目のタスクは変更ステータスを返し、リモートホストが適切な状態ではなかったこと(つまり、Apacheが存在しない)を示し、Apacheをインストールするために変更されました。

5. お気に入りのSSHクライアントを使用して、Ansibleプレイブックの対象であるリモートホストにSSHセッションを開き、Apacheがインストールされ、実行されていることを確認してください。
6. 最後に、以下のservice
コマンドを実行してApacheがインストールされているかを確認してください(status apache2
)リモートホストで。
以下に示すように、リモートマシンにApacheサービスがインストールされています。

Ansible when
およびループの使用
以前に、特定のパラメータ(例:ansible_os_family
)に対するAnsible when
に従ってAnsibleタスクを実行しました。ただし、リストで定義された複数のパラメータで条件をチェックする必要がある場合は、タスクにloop
を追加してみてください。
以前に作成したmy_playbook.ymlファイルを開きます(「Ansible when
とプレイブックの複数のタスクで作業」のステップ3)。 my_playbook.ymlファイルの内容を以下のコードで置き換えます。
以下のコードのタスク(Task-1
)は、loop
を実行し、when
条件がアイテムの値が5より大きいかどうかをチェックし、その結果を返します。
前回と同じように、以下のコマンドを実行してプレイブックを実行してください。
以下に、条件が偽の場合はskippingステータスが表示され、条件が真の場合はchangedステータスが表示されます。

when
condition for multiple parameters Ansible when
およびAnsible facts
と連携して作業します。
おそらく、タスクを実行するために複数の条件を追加したい場合があります。その場合は、when
条件内でAnsible factsをどのように利用するかを学習してください。Ansible factsを使用すると、OS、IPアドレス、接続されたファイルシステムなどの収集された事実に基づいてタスクを実行する条件文を追加できます。
my_playbook.ymlファイルの内容を以下のコードに置き換えます。
以下のコードでは、Task-1
およびTask-2
の両方のタスクは、次の条件のいずれかが真の場合にのみ(システムをシャットダウン)実行されます:
distribution
およびdistribtion_major_version
の両方が真の値を返した場合。os_family
の値がCentOS
と等しい場合。
以前と同じコマンドでプレイブックを実行します。
以下に注目してください。Ubuntuの場合は、両方のタスクがskippingステータスを表示します。タスクは、CentOSの場合にのみ実行されます。

Ansibleを使用したwhen
に基づく登録値に基づく作業
時々、Playbook内の以前のタスクの結果に基づいてタスクを実行したりスキップしたりしたいことがあります。たとえば、前のタスクがアップグレードされた後にサービスを構成したい場合があります。その場合は、登録変数を使用します。登録変数を使用すると、以前のタスクの結果を変数として登録し、次のタスクの入力として使用できます。
1. /home/ubuntu/helloという名前の空のディレクトリを作成します。
2. 下記のコードでmy_playbook.ymlファイルの内容を置き換えます。このコードは、次のことを実行します。
最初のタスク(Task-1
)は、/etc/hosts
ディレクトリの内容(ファイルとサブディレクトリ)をメモリにリストし、その結果をregister
コマンドを介してcontents1
変数に保存します。
2番目のタスク(Task-2
)は、/home/ubuntu/helloディレクトリの内容(現在は空)をメモリにリストし、そのリストをcontents2
変数に保存します。
3番目のタスク(Task-3
)は、contents1
またはcontents2
変数の登録結果のいずれかが空である場合に、「ディレクトリが空です」というメッセージを確認して表示します。
contents1
およびcontents2
変数のstdout
プロパティは、タスクコマンドを実行した結果の保存されたシェル出力です。
3. 最後に、以下のansible-playbook
コマンドでプレイブックを実行します。
以下のように、contents2
変数の登録結果が空であるため、3番目のタスクはディレクトリが空であるメッセージを返します。

Ansible when
based on registered values Ansibleでwhen
を使用する
最後の例では、Ansibleのroles
内でwhen
がどのように機能するかを学びます。 Ansibleのroles
を使用すると、標準の構成を再利用して迅速な展開が可能です。 Ansibleのwhen
条件がtrueの場合にのみ、タスクがAnsibleのroles
を呼び出す方法について学習してください。
1. 以下のコマンドを実行して、ホームディレクトリに~/ansible_role_when_demoというディレクトリを作成し、そのフォルダに移動します。この~/ansible_role_when_demoディレクトリには、この例のデモファイルが保存されます。
2. 次に、以下のコマンドを実行して、~/ansible_role_when_demo/rolesと~/ansible_role_when_demo/roles/java/tasksディレクトリを作成します。
各ディレクトリには以下の内容が含まれます:
- ~/ansible_role_when_demo/rolesディレクトリには、展開する必要のある役割が含まれます。
デフォルトでは、Ansibleはplaybookが存在するディレクトリ内のroles/ディレクトリまたは/etc/ansible/roles内の2つの場所で役割を検索します。別のパスに役割を保存する場合は、playbookで
- role:
パラメータを使用してパスを宣言します。
- ~/ansible_role_when_demo/roles/java/tasksフォルダには、役割を展開するために必要なmain.ymlファイルが含まれています。
今、~/ansible_role_when_demo/roles/java/tasksディレクトリにmain.ymlという名前のファイルを作成し、その後、以下のプレイブックコードをmain.ymlファイルにコピーして貼り付けます。
以下のプレイブックは、aptモジュールを使用してリモートノードにJavaをインストールします。
4. 好きな名前の別のYAMLファイルを作成し、以下のコードをコピー/貼り付けます。この例では、ファイルの名前は~/ansible_role_when_demo/java-setup.ymlです。
以下のコードは、Ansibleのrole
(java
)を、管理者アクセスがあるリモートユーザー(ubuntu
)に、そのリモートユーザーがDebian OS上にある場合のみ展開します。
5. ~/ansible_role_when_demoディレクトリに存在するすべての必要なフォルダとファイルを確認するために、tree
コマンドを実行してください。

6. 最後に、以下のansible-playbook
コマンドを使用して、プレイブックを実行してください。 ansible-playbook java-setup.yml
以下のタスクは、Debian OSを実行しているリモートノードにJavaが正常にインストールされたことを示すchangedステータスを返しました。 Ansibleロールを使用した
Ansible when
を使用してAnsibleプレイブックを実行する

Ansible when
with Ansible roles 結論
このチュートリアルでは、Ansible when
およびその他の条件文の異なる使用方法について学びました。また、Ansible when
条件を適用する方法、基本的なタスクからAnsible facts
を活用してAnsible roles
を展開する方法についても学びました。
この新しい知識をどのように活用しますか?おそらく、Ansibleテンプレートを使用して複数のサーバーの構成を保存し、Ansible when
条件を適用しますか?