Ansible 변수
Ansible을 이용하여 시스템의 구성 관리를 자동화할 수 있지만, 모든 시스템이 항상 같은 구성을 가지지 않고 경우에 따라 다른 구성을 가져야 할 수도 있습니다. 예를 들어 해당 시스템의 IP 주소를 찾아 해당 IP 주소로 구성해야할 수도 있습니다.
이 때 Ansible은 변수를 사용하여 시스템 간 차이를 처리합니다.
1. 변수 이름
변수 이름에는 문자, 숫자, 밑줄만 포함할 수 있습니다. 그러나 숫자로 시작할 수는 없습니다. 또한 이미 예약된 플레이북 키워드나 Python 키워드는 사용할 수 없습니다. (예약어는 사용 불가)
- 유효한 변수 이름 Ex)
- foo
- foo_env
- foo_port
- foo5
- _foo
- 유효하지 않은 변수 이름 Ex)
- *foo
- foo-port
- foo port
- foo.port
- 5foo
- 12
◆ Python 예약 키워드
https://docs.python.org/3/reference/lexical_analysis.html#keywords
2. Lexical analysis — Python 3.9.6 documentation
2. Lexical analysis A Python program is read by a parser. Input to the parser is a stream of tokens, generated by the lexical analyzer. This chapter describes how the lexical analyzer breaks a file into tokens. Python reads program text as Unicode code poi
docs.python.org
◆ Playbook 예약 키워드
https://runebook.dev/ko/docs/ansible/reference_appendices/playbooks_keywords
Ansible - 플레이 북 키워드 - 일반적인 플레이 북 개체에서 사용할 수있는 키워드입니다. 키워드는
플레이 북 키워드 일반적인 플레이 북 개체에서 사용할 수있는 키워드입니다. 키워드는 Ansible 동작 구성을위한 여러 소스 중 하나입니다. 참조 제어 방법 Ansible 동작합니다 : 우선 순위 규칙 각
runebook.dev
2. 변수 정의 및 참조
1) 기본 변수
① 기본 변수 정의
remote_install_path: /opt/my_app_config
② 기본 변수 참조
변수를 참조할 때는 반드시 이중 중괄호를 사용하며, 변수가 참조하는 딕셔너리의 value 전체를 따옴표로 인용해야 합니다.
template:
src: foo.cfg.j2
dest: '{{ remote_install_path }}/foo.cfg'
2) 목록(List) 변수
목록 변수는 하나의 변수에 여러 개의 값이 목록으로 선언된 변수입니다.
① 목록 변수 정의
region:
- northeast
- southeast
- midwest
② 목록 변수 참조
목록 변수를 참조할 때는 index 번호를 통해 참조합니다. region[0] 변수의 경우 값은 'northeast' 입니다.
region: "{{ region[0] }}"
3) 사전(Dictionary) 변수
사전 변수는 변수에 하나 이상의 딕셔너리 값이 선언된 변수입니다.
① 사전 변수 정의
foo:
field: one
field: two
② 사전 변수 참조
사전 변수를 참조할 때는 참조하고 싶은 딕셔너리의 key값으로 접근합니다.
foo['field1']
foo.field1
- 대괄호 표기법 ( 변수명[key] ) : 항상 적절하게 참조됩니다.
- 점 표기법 ( 변수명.key ) : 모듈에 따라 일부 키가 Python 사전(Dictionary)의 속성 및 메서드와 충돌할 가능성이 있습니다.
4) 등록(Registered) 변수
등록 변수는 모듈의 반환 값(return value)을 저장하는 변수입니다. 주로 오류를 해결하기 위한 디버깅 목적으로 사용됩니다.
등록 변수 사용
- 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
◆ Ad-hoc 명령에서 모듈을 실행시, 작업의 결과로 모듈의 반환 값이 출력됩니다. (이 때 모듈에 따라 반환 값은 다릅니다.) 그러나 플레이북 실행시에는 모듈의 반환 값이 출력되지 않으므로 '등록 변수'를 이용해 확인할 수 있습니다.
3. 변수 정의 위치
- 변수를 정의할 수 있는 위치
- 인벤토리
- 플레이북
- 재사용 가능 파일 (외부 참조 파일)
- 역할
- 명령의 -e / --extra-vars 옵션
1) 인벤토리 - 호스트 변수
- INI 형식
INI 형식의 인벤토리에서의 변수는 '변수=값' 형태로 선언합니다.
[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestsPerChild=909
- YAML 형식
atlanta:
host1:
http_port: 80
maxRequestsPerChild: 808
host2:
http_port: 303
maxRequestsPerChild: 909
2) 인벤토리 - 그룹 변수
- INI 형식
[atlanta]
host1
host2
[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com
- YAML 형식
atlanta:
hosts:
host1:
host2:
vars:
ntp_server: ntp.atlanta.example.com
proxy: proxy.atlanta.example.com
3) 플레이북 - 변수
플레이에 vars 키워드를 사용하여 변수를 정의합니다.
- hosts: webservers
vars:
http_port: 80
tasks:
- name: ensure apache is at the latest version
apt:
name: apache2
state: present
4) 플레이북 - 변수 파일 포함
플레이에 vars_files 키워드를 사용하여 변수 파일을 포함할 수 있습니다. 변수 파일은 YAML 형식으로 작성됩니다.
- 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
위에서 정의한 변수 파일 vars/external_vars.yaml은 다음과 같습니다.
somevar: somevalue
password: magic
5) 런타임 - 옵션
ansible-playbook 명령에 --extra-vars 또는 -e 옵션을 사용하여 변수를 플레이북에 전달할 수 있습니다. 변수 정의는 YAML 형식이 아닌 키=값 형식이나, JSON 문자열 형식으로 선언하거나, JSON 또는 YAML 파일을 지정할 수 있습니다.
- 키=값 형식
ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo"
- 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"
4. 변수 우선 순위
Ansible은 변수가 적용되는 우선 순위가 있습니다. 마지막으로 갈수록 우선 순위가 높습니다.
1) 명령의 옵션 (예: -u my_user) : -u는 ssh 접속 계정 지정 옵션
2) 역할의 기본(defaults) 변수 파일 (role_defaults_main.yml)
3) 인벤토리 파일의 그룹 변수 / 동적 인벤토리 스크립트의 그룹 변수
4) 인벤토리 파일이 있는 경로의 group_vars/all 파일
5) 플레이북 파일이 있는 경로의 group_vars/all 파일
6) 인벤토리 파일이 있는 경로의 group_vars/* 모든 파일
7) 플레이북 파일이 있는 경로의 group_vars/* 모든 파일
8) 인벤토리 파일의 호스트 변수 / 동적 인벤토리 스크립트의 호스트 변수
9) 인벤토리 파일이 있는 경로의 host_vars/* 모든 파일
10) 플레이북 파일이 있는 경로의 host_vars/* 모든 파일
11) 호스트의 팩트 변수 / set_fact 모듈에 의해 캐시된 변수
12) 플레이의 vars 키워드
13) 플레이의 vars_prompt 키워드
14) 플레이의 vars_files 키워드
15) 역할의 vars 변수 파일 (rol_vars_main.yml)
16) 블록의 vars 키워드
17) 작업의 vars 키워드
18) include_vars 모듈
19) set_facts 모듈 / 등록 변수
20) 역할(또는 include_role 모듈)의 파라미터
21) include 모듈의 파라미터
22) ansible_playbook 명령의 --extra-vars 변수
5. 변수의 범위
변수를 어디에 정의하느냐에 따라 변수를 참조할 수 있는 범위가 한정되어 있습니다. 즉, 변수를 정의하는 위치에 따라 변수가 미치는 범위가 어디까지인지 결정됩니다.
- 전역 / 플레이북 : 구성 파일, 환경 변수(ansible_*), 명령 줄 옵션
- 호스트 그룹 : 인벤토리의 그룹 변수
- 호스트 : 인벤토리의 호스트 변수
- 플레이 : vars, vars_files, vars_prompt 등 지시어, 역할의 기본 변수(defaults) 및 변수(vars)
- 블록
- 작업
6. 변수 정의 위치에 대한 팁
- group_vars/all : 모든 호스트에 공통적으로 적용할 변수 설정
- group_vars/<specific_group> : 특정 호스트 그룹에 공통적으로 적용할 변수 설정
- host_vars/<host> : 특정 호스트에만 적용할 변수 설정
- 플레이 또는 역할에서만 적용할 변수 설정
- 특정 작업에만 적용할 변수 설정
'IaC > Ansible 이론' 카테고리의 다른 글
Ansible 변수 3 | 팩트 변수, 특수 변수, 템플릿(template) (0) | 2021.07.29 |
---|---|
Ansible 변수 2 | 조회(lookup), 프롬프트(vars_prompt), 필터(Filters) (0) | 2021.07.29 |
Ansible 플레이북(Playbook) | YAML 구문, 플레이, 작업, 모듈, 멱등성, 실행, 검증 (0) | 2021.07.28 |
Ansible Ad-Hoc 명령 | -m 옵션, -a 옵션, 모듈의 반환 값(return values) (0) | 2021.07.28 |
Ansible 모듈 및 플러그인 | 모듈 종류, 플러그인 종류, 확인 (0) | 2021.07.28 |