앤서블 변수
앤서블은 플레이북에서 재활용할 수 있도록 변수(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