앤서블(ansible)에서 변수(variables) 사용하기
앤서블 변수
앤서블은 플레이북에서 재활용할 수 있도록 변수(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'
변수를 별도의 파일로 관리하고 이를 참조하는 것도 좋은 방법이며 이럴 경우 vars 키워드 대신 vars_files 키워드를 사용합니다.
- name: increase kernel open file max hosts: webservers vars_files: - vars/sysctl_params.yml
이제 vars/sysctl_params.yml 에는 다음 내용을 추가해 주면 됩니다.
my_domain: ec2-user sysctl_file_max: '524288' user_file_max: '262144' user_nproc_max: '10240'
변수 사용하기
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
여러 개의 변수를 사용할 경우 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
runtime 에 변수 덮어쓰기
플레이북에 있는 변수를 수정해야 할 경우 파일을 고쳐도 되지만 런타임에 -e 옵션을 사용해서 해당 변수 값을 파라미터로 넘겨줘도 됩니다.
런타임 파라미터가 플레이북에 지정한 변수보다 우선 순위가 높으므로 ansible 은 이렇게 동일 변수가 정의되어 있으면 우선 순위가 높은 쪽의 변수를 사용합니다.
다음은 user_file_max 변수 값을 수정하는 예제입니다.
$ ansible-playbook main.yml -e "user_file_max=1234"
또는 json 형식으로 지정할 수도 있는데 조금 더 번거롭습니다.
$ ansible-playbook main.yml -e '{"user_file_max":"1234"}'
여러 변수 지정
여러 변수를 지정하려면 공백을 구분자로 해서 변수를 적어주면 됩니다.
$ ansible-playbook main.yml -e "user_file_max=1234 user_nproc_max=1024"
json 형식을 사용할 경우 comma 를 구분자로 써주면 됩니다.
$ ansible-playbook main.yml -e '{"user_file_max":1234,"user_nproc_max":1024}'
파일 사용
여러 변수를 지정하거나 json 형식을 사용할 경우 번거로우므로 변수를 파일에 설정하고 파일을 넘겨주는게 좋습니다.
파일을 사용할 경우 파일명 앞에 @를 붙이면 됩니다.
$ ansible-playbook main.yml -e '@sysctl.json'