앤서블 변수

앤서블은 플레이북에서 재활용할 수 있도록 변수(variable)를 지원합니다.

변수는 다음과 같이 반복적이거나 동적인 값을 관리할 때 편리합니다.

  • 여러 사용자를 생성
  • 여러 패키지를 설치
  • 여러 서비스를 재시작

변수 정의하기

변수를 정의하기 좋은 부분중 하나는 플레이북으로 이 안에 변수를 정의할 경우 시작 위치에 있는 vars 블록에 변수를 정의합니다.


다음은 sysctl 로 여러 가지 커널 설정을 변경하기 위해 설정 항목과 설정 값을 변수로 정의한 예제입니다.

- name: increase kernel open file max
  hosts: webservers
  vars: 
    my_domain: ec2-user
    sysctl_file_max: '524288'
    user_file_max:  '262144'
    user_nproc_max: '10240'
YML


변수를 별도의 파일로 관리하고 이를 참조하는 것도 좋은 방법이며 이럴 경우 vars 키워드 대신 vars_files 키워드를 사용합니다.

- name: increase kernel open file max
  hosts: webservers
  vars_files: 
    - vars/sysctl_params.yml
YML


이제 vars/sysctl_params.yml 에는 다음 내용을 추가해 주면 됩니다.

my_domain: ec2-user
sysctl_file_max: '524288'
user_file_max:  '262144'
user_nproc_max: '10240'
YML


변수 사용하기

ansible playbook 에서 변수를 사용하려면 변수 이름을 두 개의 중괄호로 묶어주면 됩니다.

다음은 "{{ sysctl_file_max }}" 이 변수 값인 524288 으로 교체됩니다.

- name: Set kernel file max
    ansible.posix.sysctl:
        name: fs.file-max
        value: "{{ sysctl_file_max }}"
        sysctl_set: yes
        state: present
        reload: yes
YML


여러 개의 변수를 사용할 경우 loop 키워드와 함께 list 내 변수에 접근하기 위한 키를 사용하면 됩니다.

아래처럼 list 형식일 경우 각 항목은 "{{ item }}" 에 접근하면 값을 얻을 수 있습니다.

- name: ensure user file max the large number
    pam_limits:
        domain: "{{ my_domain }}"
        limit_type: "{{ item }}"
        limit_item: nofile
        value:  "{{ user_file_max }}"
    loop:
        - hard
        - soft
YML


runtime 에 변수 덮어쓰기

플레이북에 있는 변수를 수정해야 할 경우 파일을 고쳐도 되지만 런타임에 -e 옵션을 사용해서 해당 변수 값을 파라미터로 넘겨줘도 됩니다.

런타임 파라미터가 플레이북에 지정한 변수보다 우선 순위가 높으므로 ansible 은 이렇게 동일 변수가 정의되어 있으면 우선 순위가 높은 쪽의 변수를 사용합니다.


다음은 user_file_max 변수 값을 수정하는 예제입니다.

$ ansible-playbook main.yml -e "user_file_max=1234"
BASH


또는 json 형식으로 지정할 수도 있는데 조금 더 번거롭습니다.

$ ansible-playbook main.yml -e '{"user_file_max":"1234"}'
BASH

여러 변수 지정

여러 변수를 지정하려면 공백을 구분자로 해서 변수를 적어주면 됩니다.

$ ansible-playbook main.yml -e "user_file_max=1234 user_nproc_max=1024"
BASH


json 형식을 사용할 경우 comma 를 구분자로 써주면 됩니다.

$ ansible-playbook main.yml -e '{"user_file_max":1234,"user_nproc_max":1024}'
BASH

파일 사용

여러 변수를 지정하거나 json 형식을 사용할 경우 번거로우므로 변수를 파일에 설정하고 파일을 넘겨주는게 좋습니다.

파일을 사용할 경우 파일명 앞에 @를 붙이면 됩니다.

$ ansible-playbook main.yml -e '@sysctl.json'
BASH


Ref