Ansible은 비공개 그룹을 제공합니까?

Ansible은 비공개 그룹을 제공합니까?

호스트를 두 그룹으로 나눌 수 없다는 규칙이 있나요? 예를 들어 실제로 문서에는 다음과 같이 나와 있습니다.

호스트의 목적(역할)에 따라 그룹을 정의하는 것이 좋습니다.

하지만 내 캐릭터 중 일부는 다른 캐릭터를 제외합니다. 즉, 중복될 수 없습니다. 생산과 개발도 마찬가지다. 이 논리를 인벤토리의 그룹에 통합하는 방법이 있습니까? 호스트가 충돌하는 두 그룹에 연결되어 있지 않은지 확인하시겠습니까?

답변1

프로덕션과 개발을 분리하려면 별도의 인벤토리 파일을 보관해야 합니다.

이렇게 하면 개발, 통합 및 프로덕션에 대해 정확히 동일한 플레이북을 실행할 수 있습니다.

"프로덕션" 및 "개발"은 Ansible 인벤토리 컨텍스트에서 그룹이 아니지만 "웹 서버" 및 "데이터베이스"는 그룹입니다.

일반적인 시나리오는 개발 시 하나의 호스트에 모든 것을 설치하고 프로덕션에는 전용 데이터베이스 서버를 두는 것입니다.

개발 체크리스트는 다음과 유사합니다.

[webserver]
host1

[dbserver]
host1

프로덕션 환경과 유사합니다.

[webserver]
host1

[dbserver]
host2

역할이 겹칠 때마다 필요한 프로필을 포함하는 새 역할을 작성해야 합니다.

답변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

검사를 수행하고 조기에 종료할 수 있도록 작업을 플레이북에 가장 먼저 배치합니다.

관련 정보