Condition
이번엔 조건문에 대해서 알아보자. Ansible에서는 when이라는 키워드를 사용한다. 바로 예제를 보자.
- name: Example
hosts: all
become: true
vars:
users:
- name: john
shell: /bin/bash
enabled: true
- name: alice
shell: /bin/sh
enabled: false
- name: claud
shell: /bin/bash
enabled: true
- name: henry
shell: /bin/sh
enabled: false
- name: jeremy
shell: /bin/bash
enabled: true
- name: may
shell: /bin/sh
enabled: false
tasks:
- name: "Create a user if enabled in Amazon Linux"
user:
name: "{{ item.name }}"
shell: "{{ item.shell }}"
comment: "cwchoiit-ansible"
state: "present"
loop: "{{ users }}"
when: item.enabled and (ansible_facts["distribution"] == "Amazon")
이번엔 hosts를 all로 설정했다. 그러나 모든 호스트에 대해 적용되지 않을 것이다. 왜냐하면 하단 when 키워드를 보면 조건이 있기 때문이다. 우선 loop와 {{}} 변수에 대해서는 이전 포스팅에서 다뤘기 때문에 모두 이해가 간다. 근데 유저를 생성하는데 조건이 있는데 그 조건이 현재 아이템(루프를 돌면서 하나씩 나오는 유저)의 enabled값이 true인 유저만 생성한다는 의미이다. 그리고 그 조건에 and로 이어지는 또 다른 조건이 있다. 배포판이 Amazon인 경우에만 유저를 생성한다. 나는 지금 가지고 있는 호스트 그룹이 Ubuntu와 Amazon 두 가지인데 그 중 Amazon 배포판에만 적용하겠다는 의미가 된다. 이대로 실행해보자. 다음과 같은 결과가 나온다.
우선 보다시피 Ubuntu는 모두 스킵이 됐다. Amazon에서는 enabled가 True인 것들은 Changed가 됐음을 알 수 있다. 그래서 실제로 적용됐는지 Amazon 호스트에 들어가보자. 다음과 같이 enabled가 true 유저들만 생성됐음을 확인할 수 있다.
그리고 조건은 이렇게도 AND로 사용할 수 있다. 여러개를 나열하면 이 조건들은 AND로 묶인다.
- name: "Show items between 10 and 100"
debug:
var: item
loop: [ 0, 192, 154, 456, 7, 2, -1, 55, 234]
when:
- item >= 10
- item <= 100
실행해보면 결과는 다음과 같다. 10과 100사이에 있는 loop 배열안에 숫자만 출력한다.
당연히 OR도 있다.
- name: "Show items not between 10 and 100"
debug:
var: item
loop: [ 0, 192, 154, 456, 7, 2, -1, 55, 234]
when:
- (item < 10) or (item > 100)
실행해보면 10보다 작고 100보다 큰 숫자만 출력한다. 55는 스킵한다.
이번에는 Task에서 실행한 command 모듈의 표준출력을 변수로 받아서 그 변수를 조건으로 사용할 수도 있다.
---
- name: Example
hosts: all
become: true
tasks:
- name: "Print users"
command: "cut -d: -f1 /etc/passwd"
register: uus
- name: "Is there claud"
debug:
msg: "There is no claud"
when: uus.stdout.find('claud') == -1
위 코드를 보면 먼저 실행하는 Task에서 command 모듈로 유저 리스트를 가지고 온다. 저 문장을 해석해보면 /etc/passwd 명령어를 수행해서 나오는 결과를 잘라내는데(cut) 잘라내는 기준인 (delimiter)가 ":"가 되고 그 잘라낸 것 중 앞에것(-f1)만을 가져오는 명령어이다.
그래서 저 명령어를 수행하면 이러한 결과를 얻어낸다.
이 표준출력을 변수 uus에 등록하겠다는 의미가 되고, 그 다음 Task에서 그 변수의 표준출력에서 'claud'라는 값을 찾아낸다. 없다면 -1을 리턴하는데 그럴 때 메세지를 찍어주는 Task이다. 결과는 다음과 같다.
이렇게 조건문을 사용해서 그때 그때 조건에 맞는 작업을 수행할 수 있다.
'IaC(Infrastructure as Code)' 카테고리의 다른 글
Ansible Part. 6 (Loop) (0) | 2024.03.18 |
---|---|
Ansible Part. 5 (Variables) (0) | 2024.03.18 |
Ansible Part. 4 (Handler) (0) | 2024.03.18 |
Ansible Part. 3 (Playbook) (0) | 2024.03.18 |
Ansible Part. 2 (Adhoc) (3) | 2024.03.17 |