본문 바로가기

클라우드/앤서블(Ansible)

앤서블 Ansible 작업 제어 2 / 조건문

# 조건문

 

특정 조건에만 작업을 실행 하는것

예를들어 Redhat 계열의 리눅스는 Yum 모듈을 이용해서 패키지를 설치한다 Debian 계열의 리눅스는 apt모듈에 의해 패키지를 설치한다 이런것을을 조건으로 구성한다

 

Ansible의 조건문은 when이라는 키워드를 사용한다 (다른 언어의 if문에 해당된다)

조건에 대한 표현식은 테스트문 또는 필터를 사용할 수 있다

조건문에서 변수를 참조할땐 {{ }} 이중 중괄호를 사용하지 않는다. 바로 변수 사용

 

 

 

 

# 테스트

테스트는 표현식을 평가하고 참(true) 또는 거짓(false)를 반환한다

테스트문  when: 변수 연산 테스트문 (변수를 테스트 하기 위한 테스트문)

필터 when: 변수 |(파이프) 필터이름

 

# 이전 작업의 결과 테스트

플레이북을 실행할 때 특정 task에서 실패를 하면 후속 작업을 진행하지 않는다. ignore_errors를 사용하면 실패를 하더라도 다음작업을 계속 진행하게 된다. 등록변수의 상태 체크

ignore_errors: True 작업이 오류가 날 가능성이 있을 때 오류를 무시한다

when: result is failed  이 작업이 실패하면 (result 변수가 fail이면)

when: result is changed 이 작업이 성공적으로 실행 및 변경이 되었다면

when: result is succeeded 이 작업이 성공적으로 실행이 되었다면 

when: result is skipped 이 작업이 조건문에 의해 실행되지 않았다면

 

 

# 기본 조건문

어떤 변수 값이 어떤 값이면 실행하라

ansible_selinux 상태가 enable이면 실행, enable상태가 아니면 실행하지 않는다

 

# 조건문

 

# 팩트 변수 기반의 조건문

(CentOS 6버전이면 ) or ( Debian 7버전이면) 

조건 두개중 하나가 참이면 실행하라 CentOS 6버전 또는 Debian 7버전이면 실행하라

 

조건을 목록(리스트)으로 나타내면  and 연산이다

 

# 등록 변수 기반의 조건문

contents의 standard output이 아무것도 없으면 이 작업을 실행한다

등록변수의 조건을 보고 작업

 

 

# 변수 기반 조건

true에 따옴표 붙어져있지 않다 = boolean 값

epic또는 monumental 이 boolean 값이면

when: epic 변수가 참이면

when: not epic epic(변수)이 false이면

단순히 불린값을 가지고 있는 형태를 스위치변수(기능을 켜고 끈다)라고 한다

 

 

 

# wordpress 플레이북에 조건문 적용해보기

 

운영 체제 확인

 

데비안계열, 레드햇계열 둘다 워드프레스를 배포할 수 있도록 설정

 

더보기

- name: Install MySQL Package
apt:
update_cache: true
name: mysql-server, python3-pymysql
state: present
when: ansible_facts['os_family'] == "Debian"
- name: Install MariabDB Package
yum:
name: mariadb-server, mariadb-client
state: present
when: ansible_facts['os_family'] == "RedHat"

 

tasks:
  - name: Shut down CentOS 6 systems
    command: /sbin/shutdown -t now
    when:
      - ansible_facts['distribution'] == "CentOS"
      - ansible_facts['distribution_major_version'] == "6"


tasks:
  - name: Check contents for emptiness
    debug:
      msg: "Directory is empty"
    when: contents.stdout == ""


tasks:
  - shell: /usr/bin/foo
    regoster: result
    ignore_errors: True

  - debug:
      msg: "failed"
    when: result is failed

  - debug:
      msg: "changed"
    when: result is changed



           
    
vars:
  epic: true
  monumental: "yes"

tasks:
  - name: Run the command if "epic" or " monumental" is true
    shell: echo "This certainly is epic!"
    when: epic or monumental | bool

  - name: Run the command if "epic" is false
    shell: echo "This certainly isn't epic!"
    when: not epic