Ansibleはプライベートグループを提供していますか?

Ansibleはプライベートグループを提供していますか?

ホストを2つのグループに分けることができないという規則はありますか?たとえば、実際にはドキュメントには次のように記載されています。

ホストの目的(役割)に応じてグループを定義することをお勧めします。

しかし、私のキャラクターのいくつかは他のキャラクターを除外します。つまり、重複することはできません。生産と開発も同じだ。このロジックを在庫のグループに統合する方法はありますか?ホストが競合する2つのグループに接続されていないことを確認しますか?

答え1

プロダクションと開発を分離するには、別々のインベントリファイルをアーカイブする必要があります。

これにより、開発、統合、およびプロダクションに対してまったく同じプレイブックを実行できます。

「本番」と「開発」はAnsibleインベントリのコンテキストではグループではありませんが、「Webサーバー」と「データベース」はグループです。

一般的なシナリオは、開発時に1つのホストにすべてをインストールし、本番環境に専用のデータベースサーバーを置くことです。

開発チェックリストは次のようになります。

[webserver]
host1

[dbserver]
host1

本番環境に似ています。

[webserver]
host1

[dbserver]
host2

役割が重複するたびに、必要なプロファイルを含む新しい役割を作成する必要があります。

答え2

尋ねる:「このロジックをインベントリのグループに統合する方法はありますか?1つのホストが2つの競合するグループに接続しないようにするには?」

答え:いいえ。在庫にはそのような方法はありません。しかし、ミッションでは簡単に実装できます。 Ansible 変数は、group_namesホストが属するグループのリストを保持します。リストを定義exclusive_groupsしてテストしましょうintersect

exclusive_groups|intersect(group_names)|length > 1

たとえば、在庫がある場合

$ cat hosts
[group1]
test_01 ansible_host=10.1.0.51
test_02 ansible_host=10.1.0.52

[group2]
test_03 ansible_host=10.1.0.53
test_04 ansible_host=10.1.0.54

[group3]
test_02 ansible_host=10.1.0.52
test_03 ansible_host=10.1.0.53

スクリプト

- hosts: all

  vars:
    exclusive_groups:
      - group1
      - group3

  tasks:
    - set_fact:
        member_exclusive_groups: "{{ exclusive_groups|intersect(group_names) }}"
    - block:
        - debug:
            msg: "{{ msg.split('\n') }}"
          vars:
            msg: |-
              {{ inventory_hostname }} is member of exclusive groups
              {{ member_exclusive_groups|to_yaml }}
              End of host.
        - meta: end_host
      when: member_exclusive_groups|length > 1

与えられた

skipping: [test_01]
ok: [test_02] => {
    "msg": [
        "test_02 is member of exclusive groups", 
        "[group1, group3]", 
        "", 
        "End of host."
    ]
}
skipping: [test_03]
skipping: [test_04]

答え3

他の答えからアイデアを得て、このソリューションを検討してください。ホストが複数の排他的グループに属している場合、完全にシャットダウンされます。

- name: Exclusive group check
  assert:
    msg: "{{ inventory_hostname }} may only be in only one of these inventory groups: {{ exclusive_groups|intersect(group_names)|join(',')  }}"
    that:
      - exclusive_groups|intersect(group_names)|length <= 1

exclusive_groupsたとえば、インベントリで排他グループ名のリストに設定します。

all:
  vars:
    exclusive_groups:
      - webservers
      - databases

スキャンを実行して早期に終了できるように、タスクをプレイブックに最初に配置します。

関連情報