Ssoon

[ Part-2 ] 앤서블 기본 사용법 - 조건문 본문

Ansible 101 Study

[ Part-2 ] 앤서블 기본 사용법 - 조건문

구구달스 2024. 1. 20. 14:40
CloudNet@ 가시다님이 진행하는 Ansible 101 Study
"앤서블로 시작하는 인프라 자동화" (한빛미디어) 로 진행

 조건문

  • 특정 족건이 충족 ▶ 작업 또는 플레이 실행

💠 조건 작업 구문

  • when 문
    • 테스트할 조건을 값으로 사용
    • 조건 충족 ▶ 작업 실행
    • 조건 불충족 ▶  작업 작업 skip
  • run_my_task 가 true 인 경우에만 작업 실행
- hosts: localhost
  vars:
    run_my_task: true

  tasks:
    - name: echo messages
      ansible.builtin.shell: "echo test"
      when: run_my_task
  • ansible-playbook 실행

  • run_my_task 을 false 로 수정
- hosts: localhost
  vars:
    run_my_task: false

  tasks:
    - name: echo messages
      ansible.builtin.shell: "echo test"
      when: run_my_task
  • ansible-playbook 실행
  • echo message 태스크가 수행되지 않고 skip

💠 조건 연산자

연산 예시 설명
ansible_fact['machine'] = "x86_64" ansible_fact['machine'] 의 값이 x86_64 와 같으면 true
max_memory == 512 max_memory 값이 512 와 같다면 true
max_memory < 512 max_memory 값이 512 보다 작으면 true
max_memory > 512 max_memory 값이 512 보다 크면 true
max_memory <= 512 max_memory 값이 512 보다 작거나 같으면
max_memory >= 512 max_memory 값이 512 보다 크거나 같으면 
max_memory != 512 max_memory 값이 512 와 같지 않으면
max_memory is difined max_memory 라는 변수가 있으면 true
max_memory is not defined max_memory 라는 변수가 없으면 true
memory_available memory 값이 true이면 true, 
이때 해당 값이 1 이거나 true 또는 yes 면 true
not memory_available memory 값이 false이면 true, 
이때 해당 값이 0 이거나 false 또는 no 면 true
ansible_fact['distribution'] in supported_distros ansible_fact['distribution'] 값이 supported_distros 라는 변수가 있으면 true
  • vars 키워드로 supported_distros 변수를 사전 타입의 값으로 저장
  • when 구문에 ansible_facts['distribution'] in supported_distros 조건문 추가
- hosts: all
  vars:
    supported_distros:
      - Rocky
      - CentOS
  tasks:
    - name: print supported os
      ansible.builtin.debug:
        msg: "this is {{ ansible_facts['distribution'] }} need to use dnf"
      when: ansible_facts['distribution'] in supported_distros
  • ansible-playbook 실행
  • ansible_facts['distribution'] 값이 "Rocky" 나 "CentOS" 면 출력

💠 복수 조건문

  • ansible_facts['distribution'] 값이 "CentOS" 이거나 "Ubuntu" 일 경우에만 실행
- hosts: all

  tasks:
    - name: print os type
      ansible.builtin.debug:
        msg: "os type: {{ ansible_facts['distribution'] }}"
      when: ansible_facts['distribution'] == "CentOS" and ansible_facts['distribution'] == "Ubuntu"
  • ansible-playbook 실행

  • ansible_facts['distribution'] 값이 "CentOS" 이고 ansible_facts['distribution_version'] 이 '8' 일 경우에만 실행
- hosts: all

  tasks:
    - name: print os type
      ansible.builtin.debug:
        msg: >
             os type: {{ ansible_facts['distribution'] }}
             os version: {{ ansible_facts['distribution_version'] }}
      when: ansible_facts['distribution'] == "CentOS" or ansible_facts['distribution_version'] == "8"
  • ansible-playbook 실행

  • 사전 형태 목록으로 표현
- hosts: all

  tasks:
    - name: print os type
      ansible.builtin.debug:
        msg: >
             os type: {{ ansible_facts['distribution'] }}
             os version: {{ ansible_facts['distribution_version'] }}
      when:
        - ansible_facts['distribution'] == "CentOS"
        - ansible_facts['distribution_version'] == "8"
  • ansible-playbook 실행

  • and 연산자와 or 연산자 함께 사용
  • ansible_facts['distribution']  의 값이 "CentOS" 이면서 ansible_facts['distribution_version'] 값이 "8" 이거나 ansible_facts['distribution']  의 값이 "Ubuntu" 이면서 ansible_facts['distribution_version'] 값이 "22.04"  인 경우 실행
- hosts: all

  tasks:
    - name: print os type
      ansible.builtin.debug:
        msg: >
             os type: {{ ansible_facts['distribution'] }}
             os version: {{ ansible_facts['distribution_version'] }}
      when: >
        ( ansible_facts['distribution'] == "CentOS" and
          ansible_facts['distribution_version'] == "8" )
        or
        ( ansible_facts['distribution'] == "Ubuntu" and
          ansible_facts['distribution_version'] == "22.04" )
  • ansible-playbook 실행

💠 반복문과 조건문 사용

  • when 문의 item['mount'] 은 loop 문에서 선언한 ansible_facts의 mounts 중 mount 라는 값고 size_available 값 사용
- hosts: db

  tasks:
    - name: print root directory size
      ansible.builtin.debug:
        msg: "directory {{ item.mount }} size is {{ item.size_available }}"
      loop: "{{ ansible_facts['mounts'] }}"
      when: item['mount'] == "/" and item['size_available'] > 300000000
  • ansible-playbook 실행
  • ansible_fact 에서 mounts 라는 사전 타입 변수값을 반복
  • mount 가 '/' 이고 size_available 값이 '300000000" 보다 큰 경우에만 메시지 출력

  • register 키워드로 작업 변수 사용
  • systemctl 로 rsyslog 가 active 인지 체크  결과를 result 변수에 저장 ▶result.stdout 갑이 active 일 경우만 실행
- hosts: all

  tasks:
    - name: get rsyslog service status
      ansible.builtin.command: systemctl is-active rsyslog
      register: result

    - name: print rsyslog status
      ansible.builtin.debug:
        msg: "rsyslog status is {{ result.stdout }}"
      when: result.stdout == "active"
  • ansible-playbook 실행

 

Comments