호스트를 두 그룹으로 나눌 수 없다는 규칙이 있나요? 예를 들어 실제로 문서에는 다음과 같이 나와 있습니다.
호스트의 목적(역할)에 따라 그룹을 정의하는 것이 좋습니다.
하지만 내 캐릭터 중 일부는 다른 캐릭터를 제외합니다. 즉, 중복될 수 없습니다. 생산과 개발도 마찬가지다. 이 논리를 인벤토리의 그룹에 통합하는 방법이 있습니까? 호스트가 충돌하는 두 그룹에 연결되어 있지 않은지 확인하시겠습니까?
답변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
검사를 수행하고 조기에 종료할 수 있도록 작업을 플레이북에 가장 먼저 배치합니다.