답변 : 호스트가 둘 이상의 그룹에 나타나고 두 그룹 모두 동일한 작업을 수행합니다. 작업을 한 번만 실행할 수있는 방법이 있습니까?


9

다음과 같은 플레이 북이 있습니다.

---
- hosts: group1
  roles:
    - role1
    - role2

- hosts: group2
  roles:
    - role2
    - role3

이제 다음과 같은 항목을 가진 hosts 파일이 있다고 가정 해보십시오.

[group1]
host1.example.com

[group2]
host1.example.com

Ansible은 host1.example.com에 대해 role2 TWICE에서 2 개의 그룹으로 표시되고 각각에 role2가 할당되어 있으므로 태스크를 실행합니다.

Ansible에 동일한 역할이 두 번 포함되어 있음을 어떻게 알 수 있습니까?


"role1", "role2"등 대신 실제 예제를 제공하는 것이 좋습니다. 아마도 다르게 수행해야하기 때문입니다. 그러나 실제로 달성하려는 것에 달려 있습니다.
Antonis Christofides

답변:


10

언급했듯이 이것은 의도적으로 설계된 동작입니다. Ansible은 한 번에 하나의 플레이 만 실행합니다. 플레이 북은 두 개의 플레이 (플레이 북 파일에 의해 정의 된 루트 레벨 YAML 목록의 두 항목)로 구성됩니다. 첫 번째 연극은 role1과 role2를 group1에 적용합니다. 그 플레이는 먼저 실행되고, 완료된 후에 만 ​​두 번째 플레이가 시작됩니다. 그러나 Ansible은 연극을 논리적으로 병합하려고 시도하지 않습니다. 결국 role2의 작업이 실제로 두 번 실행되기를 원할 수 있습니다.

문제를 해결하기 위해이 문제를 해결할 수있는 몇 가지 방법이 있으며 그룹과 역할의 세부 사항에 따라 선택할 수 있습니다.

role2의 모든 작업이 dem 등적입니다. 즉, 여러 번 실행될 수 있고 매번 동일한 결과로 끝날 수 있다면 실제로지는 것은 시간이며 역할을 반복해도 괜찮습니다. 역할을 적용하는 데 시간이 오래 걸리거나이를 dem 등원으로 만들 수없는 경우 다음 아이디어를 고려하십시오.


플레이 북을 3 개의 플레이로 나누고 역할을 개별적으로 적용 할 수 있습니다.

---
- hosts: group1
  roles:
    - role1

- hosts: group1:group2
  roles:
    - role2

- hosts: group2
  roles:
    - role3

또는 역할을 함께 그룹화해야하는 경우 세 가지 역할이 모두 필요한 서버에 대한 세 번째 그룹을 만들 수 있습니다. 다른 두 그룹에서 꺼내지 않아도됩니다. 다음과 같이 인벤토리 파일에 그룹을 만들 수 있습니다.

[group1and2:children]
group1
group2

그런 다음 플레이 북에서 다시 세 번의 플레이로 나눌 수 있지만 세 번째 그룹을 사용하여 역할을 다시 실행하지 않아도됩니다.

---
- hosts: group1:!group1and2
  roles:
    - role1
    - role2

 - hosts: group1and2
   roles:
     - role1
     - role2
     - role3

 - hosts: group2:!group1and2
   roles:
     - role2
     - role3

꽤 추악하지만 어떤 경우에는 유용 ​​할 수 있습니다.


고마워, 나는 옵션 (2)의 변형으로 갈 것이라고 생각합니다.-그룹과 역할을 더 세분화하여 서버를 그룹화합니다.
Asfand Qazi 2016

변수를 통해 {{host1}} 및 {{host2}}으로 호스트를 호출하면 어떻게 구성 할 수 있습니까?
BMW

문서 섹션을 검색하는 경우 : 공통 패턴
Sahap Asci

3

이것은 의도적으로 설계된 동작입니다. 갈 수있는 유일한 방법은 하나의 플레이 북에서만 역할 2를 하나의 특정 그룹에 적용하고 여기와 같이 공통 구성원이있는 그룹의 다른 플레이 북에서는 role2를 사용하지 않는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.