特定のインベントリ グループに対して実行するタスクを設定するにはどうすればよいですか?

特定のインベントリ グループに対して実行するタスクを設定するにはどうすればよいですか?

次のタスク:

- name: Download Jfrog Artifcats
  ansible.windows.win_shell: |
    $ENV:JFROG_CLI_OFFER_CONFIG="false"
    jfrog rt download ...
  when: ???

centerグループ内の以下のマシンに対してのみ実行する必要がありappserversます

---
all:
  children:
    root:
      children:
        center:
          children:
            appservers:
              hosts:
                vm1.domain.com:
            qservers:
              hosts:
                vm2.domain.com:
            dbservers:
              hosts:
                vm3.domain.com:
        mobilefarms:
          hosts:
          children:
            gateways:
              hosts:
        south:
          children:
            brooklyn:
              hosts:
                vm4.domain.com:
              children:
                clients:
                  hosts:
                    vm5.domain.com:
                    vm6.domain.com:
        north:
          children:
            new_york:
              hosts:
                vm8.domain.com:
              children:
                clients:
                  hosts:
                    vm9.domain.com:

これを実現するには、条件として何を入力すればよいですかwhen? また、この構成オプションの背後にある原則は何ですか?

答え1

タスク、再生、またはブロックの条件でグループ メンバーシップを使用するには、次の形式を使用します。

when: inventory_hostname in groups["<group name>"]

具体的には、最初の質問に対して:

when: inventory_hostname in groups["appservers"]

の下にあるすべてのマシンに到達するにはnorth、次のように変更するだけです。 when: inventory_hostname in groups["north"]

フォローアップの説明(特定の「場所」のグループを指定する)に関しては、グループ名はAnsible内で一意である必要があるため、区別する必要はありません。どれの appserversあなたが参照しているグループは、appservers常に 1 つの場所にしか存在できません。

2 つのグループを作成しようとするとappservers、最初のグループのみが Ansible エンジンによって実際に解析され、同じ名前の後続のグループは無視されます。そのため、(将来的に) のappservers下にグループを作成しnorthappserversの下にグループを作成することを計画している場合はsouth、最初のグループのメンバーのみが含まれることがわかります。

Ansibleでは、これをどうやって実現するか(私が想定している5月将来的に必要になる可能性がある場合は、次のようにホストを複数のグループに追加し、制限や条件を適切に調整します。

all:
  children:
    north:
      hosts:
        a.domain.com:
        b.domain.com:
    south:
      hosts:
        y.domain.com:
        z.domain.com:
    appservers:
      hosts:
        a.domain.com:
        y.domain.com:
    dbservers:
      hosts:
        b.domain.com:
        z.domain.com:

この例では、全てアプリサーバーをターゲットにする場合は、 をターゲットにします。 地域のみでappservers再生したい場合は、再生の制限を に設定するか、条件付きappserversnorthnorth:&appservers

when:
  - inventory_hostname in groups["appservers"]
  - inventory_hostname in groups["north"]

いずれにせよ、Ansibleでインベントリがどのように構成されているかをもう一度確認する必要があると思います。そのためには、ユーザーガイド; さまざまなトレーニング サイトには、さらに詳しい情報を提供する優れたリソースもいくつかあります。

複数のグループ(組み合わせ、結合、除外など)を使用したより複雑なターゲティングの詳細については、こちらの他の記事を参照することをお勧めします。ユーザーガイド


個人的な意見ですが、最初はセットアップが面倒で制限があると思っていましたが、使い慣れてくると、他の方法よりもダイナミックだと感じるようになりました。

関連情報