728x90
반응형
SMALL
SMALL

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이다. 결과는 다음과 같다.

 

이렇게 조건문을 사용해서 그때 그때 조건에 맞는 작업을 수행할 수 있다.

728x90
반응형
LIST

'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
728x90
반응형
SMALL
SMALL

HCL은 조건문도 사용할 수 있다. Variables와 Condition을 조합해서 한번 조건문을 다뤄보자.

Basic

다음 main.tf 코드를 보자.

provider "aws" {
    region = "ap-northeast-2"
}

variable "is_john" {
  type = bool
  default = true
}

locals {
  message = var.is_john ? "Hello John" : "Oh, Your are not John."
}

output "message" {
  value = local.message
}

 

변수로 is_john이라는 녀석을 선언한다. 이 녀석은 boolean 타입의 변수고 기본값이 true이다.

이 때 로컬 변수 message는 is_john의 값에 따라 값이 달라진다. 이 부분에서 조건문이 사용된다. 삼항 연산자로 익숙하다.

 

이 간단한 코드를 실행해보면 다음과 같은 결과를 얻는다.

 

이 때 is_john의 값을 false로 변경하면 당연히 다음과 같은 결과를 얻는다. 이전에 Variables 포스팅에서 알아보았던 실행 시 옵션으로 변수값을 설정하는 방법으로 실행해보자.

 

 

Advanced

이번엔 이 조건문을 좀 더 응용해서 count와 같이 사용해보자. 왜 count와 같이 사용해야 하는 경우가 생기냐면, 리소스를 생성할 땐 그 리소스를 생성할지 말지를 정할 수 있는 방법이 count가 대표적으로 사용되기 때문이다. 다음 main.tf 파일을 보자.

provider "aws" {
    region = "ap-northeast-2"
}

variable "internet_gateway_enabled" {
  type = bool
  default = true
}

resource "aws_vpc" "this" {
  cidr_block = "10.0.0.0/16"
}

resource "aws_internet_gateway" "this" {
  count = var.internet_gateway_enabled ? 1 : 0

  vpc_id = aws_vpc.this.id
}

 

여기서 보면 AWS 인터넷 게이트웨이 리소스를 변수값에 따라 생성할지 말지를 count로 구분한다. 이렇게 조건문과 count를 같이 사용해서 리소스를 생성할지 말지를 결정할 수도 있다.

 

728x90
반응형
LIST

'IaC(Infrastructure as Code)' 카테고리의 다른 글

Terraform State  (0) 2024.03.07
AWS + Terraform (Loop)  (0) 2024.03.07
AWS + Terraform (For-Each)  (0) 2024.03.06
AWS + Terraform (Module)  (0) 2024.03.06
AWS + Terraform  (2) 2024.03.05

+ Recent posts