[Ansible] #5.1 변수
Ansible
의 변수
에 대해서 알아보자.
- 1. 변수 이름
- 2. 기본 변수 정의 및 참조 기본 변수
- 3. 목록 변수 정의 및 참조
- 4. 사전 변수 정의 및 참조
- 5. 등록 변수
- 6. 변수 정의 위치
- 7. 인벤토리 변수
- 8. 플레이북 변수
- 9. 런타임 - 옵션
- 10. 변수의 우선 순위
- 11. 변수 범위
1. 변수 이름
변수 이름에는 문자
, 숫자
, 밑줄
만 포함할 수 있다.
그러나 이미 예약된 플레이북 키워드나 Python
키워드는 사용할 수 없다. 또한 변수는 숫자로 시작할 수 없다.
- 유효한 변수 이름
- foo
- foo_env
- foo_port
- foo5
- _foo
키워드 DOCS 참조 : playbook-keywords
2. 기본 변수 정의 및 참조 기본 변수
- 기본 변수 정의
- hosts: mgmt
vars:
remote_install_path: /opt/my_app_config
일반적으로 vars
라는 키워드를 사용하고, 그 안에서 변수를 선언한다.
이는 아래 예시 모두 동일하다.
- 기본 변수 참조
template:
src: foo.cfg.j2
dest: '{{ remote_install_path }}'/foo.cfg
변수를 참조할 때는 반드시 이중 중괄호
를 사용한다.
변수가 참조하는 사전의 모든 값을 따옴표
로 인용한다.
기본 변수 테스트
mkdir 02_vars
cd 02_vars
변수 실습용 폴더인 02_vars
폴더를 만들고, 그 안에 vars
폴더를 만든다.
vi var.yaml
- hosts: mgmt
vars:
message: hello world!!!
tasks:
- debug:
msg: "{{ message }}"
- debug:
msg: "hello korea"
- debug:
msg: "MESSAGE: {{ message }}"
ansible-playbook var.yaml
다음은 패키지 설치 예시이다.
vi var2.yaml
- hosts: mgmt
vars:
pkg_name: apache2
tasks:
- apt:
name: "{{ pkg_name }}"
state: present
- service:
name: "{{ pkg_name }}"
state: started
ansible-playbook var2.yaml -b
3. 목록 변수 정의 및 참조
목록(List) 변수
는 여러 개의 값이 목록으로 선언된 변수다.
- 목록 변수 정의
region:
- northeast
- southeast
- midwest
- 목록 변수 참조
region: "{{ region[0] }}"
목록 변수 테스트
vi var3.yaml
- hosts: mgmt
vars:
mylist:
- aaa
- bbb
- ccc
tasks:
- debug:
msg: "{{ mylist[0] }}"
- debug:
msg: "{{ mylist[1] }}"
- debug:
msg: "{{ mylist[2] }}"
ansible-playbook var3.yaml
4. 사전 변수 정의 및 참조
사전(Dictionary) 변수
는 변수에 하나 이상의 사전 값이 선언된 변수다.
- 사전 변수 정의
foo:
field1: one
field2: two
- 사전 변수 참조
foo['field1']
foo.field1
- 대괄호 표기법 : 항상 적절하게 참조됨
- 점 표기법 : 모듈에 따라 일부 키가 Python 사전(Dictionary)의 속성 및 메서드와 충돌할 수 있음
사전 변수 테스트
vi var4.yaml
- hosts: mgmt
vars:
mydict:
a: aaa
b: bbb
tasks:
- debug:
msg: "{{ mydict.a }}"
- debug:
msg: "{{ mydict['a'] }}"
ansible-playbook var4.yaml
5. 등록 변수
등록(Registered) 변수
는 모듈의 반환 값을 저장하는 변수다.
플레이북
은 실행시 리턴 밸류가 나오지 않는다.
즉, 실행 자체에 초점을 맞춘 기능이고, Ad-hoc
의 경우는 리턴 밸류를 출력하므로 주로 디버깅에 사용된다.
플레이북
에서의 디버깅에는 등록 변수
를 주로 사용하게 된다.
- 등록 변수 사용
- hosts: web_servers
tasks:
- name: Run a shell command and register its output as a variable
shell: /usr/bin/foo
register: foo_result
ignore_errors: true
- name: Run a shell command using output of the previous task
shell: /usr/bin/bar
when: foo_result.rc == 5
위와 같이 작성할 수 있다.
실제로 테스트를 통해 이해해보자.
등록 변수 테스트
02_vars
폴더에서 시작하여 아래 명령어로 reg.yaml
파일을 생성한다.
mkdir register
cd register
vi reg.yaml
- hosts: mgmt
gather_facts: no
tasks:
- ping: {}
register: ping_result
- debug:
msg: "{{ ping_result }}"
- debug:
msg: "{{ ping_result.ping }}"
ping
모듈을 실행하는 플레이북을 작성하였다.
register
는 task
의 키워드임을 명심하자.
register
의 값으로 ping_register
라는 임의의 변수명을 지정하였고, 이를 msg
로 출력하면 리턴 밸류를 볼 수 있게 된다.
ansible-playbook reg.yaml
6. 변수 정의 위치
변수를 정의할 수 있는 위치는 다음과 같다.
인벤토리
플레이북(
vars:
)재사용 가능 파일(외부 참조 파일)
역할
명령의
-e
옵션
위에서는 플레이북
내의 vars
키워드에서 변수를 정의하였지만, 그 밖의 다른 곳에서도 변수를 선언할 수 있다.
만약 동일한 변수명으로 인벤토리
, 플레이북
등에서 선언하였을 경우, 우선순위에 따라 그 값이 결정된다.
때문에 변수의 범위를 상정하여 변수를 선언해야 하며, 동일한 변수명으로 여러 곳에서 만들지 않고 변수 범위를 생각해서 선언하도록 하자.
7. 인벤토리 변수
[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestPerChild=900
인벤토리 변수의 예시이다.
host1
, host2
는 호스트 명을 나타내며, 그 이하는 모두 변수를 나타낸다.
즉, 해당 변수는 각 호스트에만 적용되는 변수이며 그것이 각 변수의 범위이다.
이를 호스트 변수
라고 한다.
위의 경우 atlanta
라는 호스트 그룹을 구성하였을 때
host1
에서의 http_port
라는 변수의 값은 80
이 되고,
host2
에서의 http_port
의 값은 303
이 된다.
[atlanta]
host1
host2
[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com
밑은 그룹 변수
라고 하며, [그룹명:vars]
로 나타낼 수 있다.
이렇게 하면 해당 변수들은 atlanta
라는 그룹에 있는 호스트에 공통적으로 적용된다.
8. 플레이북 변수
---
- hosts: all
remote_user: root
vars:
favcolor: blue
vars_files:
- vars/external_vars.yaml
tasks:
- name: This is just a placeholder
command: /bin/echo foo
...
---
# This is external_vars.yaml
somevar: somevalue
password: magic
...
위에서 했던 것 처럼 플레이북에서는 vars
키워드를 사용해서 변수를 선언할 수 있다.
또한 vars_files
키워드로 외부 파일을 참조하는 것도 가능하다.
플레이북 변수 테스트
02_var/vars
폴더에서 시작한다.
vi var5.yaml
- hosts: mgmt
vars_files:
- varfile.yaml
tasks:
- debug:
msg: "{{ myvar }}"
vi varfile.yaml
myvar: hello myvar
ansible-playbook var5.yaml
9. 런타임 - 옵션
키 = 값 형식
ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo"
--extra-vars
옵션은-e
로 축약해서 사용할 수 있다.
이에 대한 변수가 뒤에 오는 문자열이다.
키 = 값
형식 은INI
방식이라고 생각하면 된다.JSON 문자열 형식
ansible-playbook release.yml --extra-vars '{"version":"1.23.45", "other_variable":"foo"}'
JSON 또는 YAML 파일
ansible-playbook release.yml --extra-vars "@some_file.json"
@
를 사용하면 외부 파일을 참조할 수 있다.
10. 변수의 우선 순위
번호가 높을수록 우선 순위가 높다.
- 명령의 옵션 (예 : -u my_user)
- 역할의 기본(defaults) 변수 파일(role_defaults_main.yml)
- 인벤토리 파일의 그룹 변수 / 동적 인벤토리 스크립트의 그룹 변수
- 인벤토리 파일이 있는 경로의 group_vars/all 파일
- 플레이북 파일이 있는 경로의 group_vars/all 파일
- 인벤토리 파일이 있는 경로의 group_vars/* 모든 파일
- 플레이북 파일이 있는 경로의 group_vars/* 모든 파일
- 인벤토리 파일의 호스트 변수 / 동적 인벤토리 스크립트의 호스트 변수
- 인벤토리 파일이 있는 경로의 host_vars/* 모든 파일
- 플레이북 파일이 있는 경로의 host_vars/* 모든 파일
- 호스트의 팩트 변수 / set_fact 모듈에 의해 캐시된 변수
- 플레이의 vars 키워드
- 플레이의 vars_prompt 키워드
- 플레이의 vars_files 키워드
- 역할의 vars 변수 파일(role_vars_main.yml)
- 블록의 vars 키워드
- 작업의 vars 키워드
- include_vars 모듈
- set_facts 모듈 / 등록 변수
- 역할(또는 include_role 모듈)의 파라미터
- include 모듈의 파라미터
- ansible-playbook 명령의 ‘–extra-vars’ 변수
11. 변수 범위
- 전역/플레이북 : 구성 파일, 환경 변수(ansible_*), 명령 줄 옵션(
-e
,--extra-vars
) - 호스트 그룹 : 인벤토리의 그룹 변수
- 호스트 : 인벤토리의 호스트 변수
- 플레이 :
vars
,vars_files
,vars_prompt
등 지시어, 역할의 기본 변수(defaults) 및 변수(vars) - 블록
- 작업
블록은 아직 안배웠으니 넘어가고, 작업에 대해서 살펴보자.
작업 변수 범위 테스트
vi var6.yaml
- hosts: mgmt
vars:
message: hello play
tasks:
- debug:
msg: "{{ message }}"
- debug:
msg: "{{ message }}"
vars:
message: hello task
ansible-playbook var6.yaml
var6.yaml
에는 두 개의 message
변수가 존재하며,
첫 번째 debug
태스크는 기본 변수로 정의된 hello play
를 출력하고,
두 번째 debug
태스크는 작업 범위 내에서 선언된 vars
의 값인 hello task
를 출력한다.