IaC/Ansible

[Ansible] 앤서블 특정 조건,상황을 만족할 때 실행하기 (ansible-palybook yml when)

Nirsa 2020. 10. 30. 15:14
반응형

 

  • 앤서블 조건식 거는 방법 (ansible-palybook yml when)

앤서블 플레이북을 작성할 때 when을 사용하여 특정 조건,상황을 만족해야 실행될 수 있도록 설정하는 방법에 대해 포스팅 하겠습니다. 사용 환경은 아래와 같습니다.

  • ansible master, node01, node02
  • OS : CentOS 7.8

* facts를 통한 테스트 필요 없이 바로 when 사용 방법을 알고 싶으시다면 facts쪽은 패스하고 하단에 있는 when 테스트를 바로 보셔도 됩니다.

 

  • 테스트를 위한 facts 수집 및 비교

특정 노드의 환경이나 OS 등을 확인한 후 when을 사용해서 특정 노드만 실행되도록 할 수 있는데, 우선 테스트를 해보기 위해 아래와 같이 node01, 02의 facts를 수집하도록 하겠습니다.

ansible 192.168.235.20 -m setup > facts1.txt
ansible 192.168.235.21 -m setup > facts2.txt

 

특정 노드에서만 실행되는지를 테스트하기 위해 diff 명령어를 이용해 서로 다른 facts를 확인해봅니다. 저는 ip 주소와 mac 주소를 가지고 테스트 해보도록 하겠습니다.

 

우선 facts1.txt 파일을 보면 address와 macaddress가 ansible_default_ipv4라는 필드 아래에 존재하고 있습니다.

 

  • when 테스트 - 1

맥주소가 00:0c:29:0a:0c:26인 호스트(192.168.235.20)가 있을 경우 "mac address" 문자열을 출력, ip 주소가 192.168.235.21인 호스트가 있을 경우 "ip address"를 출력하는 간단한 yml 입니다. 해당 코드를 작성하며 주의 및 설명은 아래와 같습니다.

  1. hosts: nginx는 본인의 환경에 따라서 변경 해주어야 합니다.
  2. when의 ansible_default_ipv4 이후 [] 구간은 바로 위의 스샷을 확인해보시면 이해할 수 있습니다. ansible_default_ipv4 이후 {}안에 address와 alias, broadcast 등의 필드로 나뉘어 지는데 ansible_default_ipv4['macaddress']는 ansible_default_ipv4 아래의 macaddress 필드를 가르키는 의미이며 ansible_default_ipv4['address']는 ansible_default_ipv4 아래의 address 필드를 가르킵니다. 즉, macdress 필드가 00:0c:29:0a:0c:26인것을, address 필드가 192.168.235.21인것을 의미 합니다.
---
- name: when test
  hosts: nginx  #/etc/ansible/hosts 내용에 따라 해당 라인을 변경

  tasks:
    - name: mac address가 00:0c:29:0a:0c:26 인 경우 mac address! 출력
      debug:
        msg: echo "mac address!"
      when: ansible_default_ipv4['macaddress'] == '00:0c:29:0a:0c:26'

    - name: ip address가 192.168.235.21 인 경우 ip address! 출력
      debug:
        msg: echo "ip address!"
      when: ansible_default_ipv4['address'] == '192.168.235.21'

 

이후 ansible-playbook when.yml 명령을 이용해 해당 yml을 실행시켜보면 mac address가 00:0c:29:0a:0c:26인 경우 21번 서버는 해당되지 않으므로 skipping이 발생, 20번 서버는 mac address가 일치하므로 echo "mac address!" 가 실행 되었습니다.

마찬가지로 그 아래는 ip address가 192.168.235.20번 서버는 일치하지 않으므로 skipping 발생, 192.168.235.21번 서버는 일치하므로 echo "ip address!"가 실행 되었습니다.

 

  • when 테스트 - 2

마지막으로 아래와 같이 ==, >, < 와 같은 기호를 통해서도 할 수 있습니다. 현재 저의 node01, node02의 ansible_uptime_seconds 값은 6000 이상 입니다.

아래와 같이 5000보다 높을 경우 uptime_seconds > 5000 문자열을, 5000보다 낮을 경우 uptime_second < 5000 문자열을 출력하도록 when2.yml 파일을 작성 하였습니다. 즉, 저의 현재 uptime_seconds 값은 6000 이상이므로 uptime_seconds > 5000이 실행되고 uptime_seconds < 5000은 skipping이 되어야 합니다.

* 참고로 when 부분의 숫자를 '' 으로 묶어버리면 숫자가 재대로 인식되지 않아 의도한바와 다른 결과가 출력 됩니다. ''으로 묶게되면 숫자가 아니라 단순 문자로 취급해버리는 것 같은데 정확한 이유는 확인하지 못했으니 참고 해주세요.

---
- name: when test
  hosts: nginx

  tasks:
    - name: ansible_uptime_seconds이 5000보다 더 높은 경우 출력
      debug:
        msg: echo "uptime_seconds > 5000"
      when: ansible_uptime_seconds > 5000

    - name: ansible_uptime_seconds이 5000보다 더 낮은 경우 출력
      debug:
        msg: echo "uptime_seconds < 5000"
      when: ansible_uptime_seconds < 5000

 

ansible-playbook when2.yml 명령어르 실행해주면 5000 이상이므로 uptime_seconds > 5000이 출력되었고, 낮은 경우는 skipping이 발생한것을 확인할 수 있습니다.

 

이와 같이 특정 상황을 만족하는 호스트들만 yml에 작성한 내용이 실행될 수 있도록 설정할 수 있습니다.

 

반응형