Ansible 변수 3 | 팩트 변수, 특수 변수, 템플릿(template)
1. 팩트(fact) 변수
팩트 변수는 운영 체제 관련 정보, IP 주소, NIC 정보, 디스크 장치, 배포판, 환경 변수, CPU 정보, 메모리 정보, 마운트 정보 등 관리 노드의 정보를 가진 변수입니다.
ansible_ 로 시작하는 변수로 접근할 수 있습니다.
별도로 설정하지 않는 한, 기본적으로 플레이 실행시 첫 번째 작업으로 해당 호스트의 정보를 팩트 변수로 자동으로 수집하고 메모리에 저장합니다. ( TASK [Gathering Facts] )
1) Ad-hoc 명령에서 팩트 변수 확인
setup 모듈을 이용하여 팩트 변수를 확인할 수 있습니다.
ansible all -m setup
ansible localhost -m setup -a 'filter=ansible_hostname'
2) 팩트 변수 참조
(1) 호스트 이름 참조
{{ ansible_hostname }}
(2) 메모리 크기 참조
{{ ansible_memtotal_mb }}
(3) IPv4 주소 참조
{{ ansible_all_ipv4_addresses }}
(4) sda 장치의 모델 참조
{{ ansible_devices['sda']['model'] }}
(5) NIC 인터페이스 목록 정보 참조
{{ ansible_interfaces }}
(6) NIC 인터페이스의 IP 정보 참조
{{ ansible_enp0s8['ipv4']['address'] }}
(7) 배포판 정보 참조
{{ ansible_distribution }}
3) 팩트 수집 비활성화
플레이북의 플레이 실행 전 기본적으로는 첫 작업으로 setup 모듈을 실행해 팩트 변수를 수집합니다. 팩트 변수가 필요하지 않은 경우, gather_facts 키워드를 통해 팩트 변수 수집을 비활성화합니다. 실제로 팩트를 수집하는 데 몇 초가 걸리기 때문에 팩트 수집을 비활성화하면 성능을 향상시킬 수 있습니다.
- hosts: webservers
gather_facts: no
4) set_fact 모듈
set_fact 모듈을 사용해 플레이북의 작업을 실행하는 중에 새 변수를 정의하거나 기존 변수의 값을 재정의할 수 있습니다.
...
- set_fact:
one_fact: yes
other_fact: no
...
5) 사용자 정의 팩트
사용자 정의 팩트는 각 호스트별 사용자가 직접 정적 팩트 변수를 선언할 수 있습니다. 이렇게 정의된 사용자 정의 팩트는 ansible_local 변수로 참조 가능합 니다.
사용자 정의 팩트를 정의하는 방법은, 각 관리 노드의 /etc/ansible/facts.d 디렉토리에 JSON 또는 INI 파일 형식으로 *.fact 파일을 생성합니다.
사용자 정의 팩트 구성 예 :
foo.example.com 호스트의 /etc/ansible/facts.d/preferences.fact 파일
[general]
asdf=1
bar=2
- 변수 참조 1
ansible foo.example.com -m setup -a "filter=ansible_local"
- 출력
"ansible_local": {
"preferences": {
"general": {
"asdf": "1",
"bar": "2"
}
}
}
- 변수 참조 2
{{ ansible_local['preferences']['general']['asdf'] }}
2. 특수 변수
특수 변수는 미리 예약되어 있으며 사용자가 직접 설정할 수 없습니다. Ansible은 특수 변수의 값을 현재 상태를 반영하도록 재정의합니다.
◆ 특수 변수
Special Variables — Ansible Documentation
Connection variables Connection variables are normally used to set the specifics on how to execute actions on a target. Most of them correspond to connection plugins, but not all are specific to them; other plugins like shell, terminal and become are norma
docs.ansible.com
1) 매직 변수
매직 변수는 Python의 버전, 인벤토리의 호스트 및 그룹, 플레이북 및 역할에 대한 다양한 정보가 정의되어 있습니다.
매직 변수는 다양한데, 인벤토리와 몇 가지 주요 변수를 살펴봅시다.
(1) hostvars
호스트에 세팅된 변수의 값을 가지고 있는 변수입니다.
{{ hostvars['test.example.com']['ansible_facts']['distribution'] }}
(2) groups
특정 그룹의 호스트 목록을 가지고 있는 변수입니다.
{% for host in groups['app_servers'] %}
{{ hostvars[host]['ansible-facts']['eth0']['ipv4']['address'] }}
{% endfor %}
(3) inventory_hostname
팩트 변수 수집이 비활성화된 경우 ansible_hostname 또는 ansible_nodename과 같은 팩트 변수를 사용하지 못합니다. 이런 경우, inventory_hostname을 사용하면 호스트 목록 및 이름을 참조할 수 있습니다.
2) 팩트 변수
- ansible_facts
- ansible_local
3) 연결 변수
- ansible_become_user : become할 때 사용할 유저 정의
- ansible_connection
- ansible_host : ssh로 관리할 host 지정
- ansible_python_interpreter : 파이썬 인터프리터의 위치 정의
- ansible_user : ssh로 연결할 계정 정의
3. 템플릿(template)
Ansible에서 파일을 관리하는 모듈은 여러가지가 있습니다. 파일 생성 및 관리에 사용하는 file 모듈, 파일 복사에 사용하는 copy 및 fetch 모듈, 텍스트 파일 수정에 사용하는 lineinfile 및 blockinfile 등이 있습니다.
특히 copy 및 fetch 모듈은 정적인 파일을 복사하며, lineinfile 및 blockinfile은 동적으로 내용을 수정할 수 있지만 많은 내용을 수정하기에는 그리 효율적이지 않습니다.
Ansible은 Python의 웹 템플릿 엔진인 Jinja2 템플릿을 사용할 수 있습니다. Jinja2는 Ansible에서 변수를 참조해 설정 파일 등을 동적으로 생성하는 데 사용합니다.
◆ Ansible에서 변수 참조, 조건문의 테스트 및 필터는 Jinja2 구문입니다.
1) Jinja2 템플릿 소개
모든 Jinja2 템플릿은 제어 노드(Control Nodes)에서 빌드되며, Jinja2 구문으로 조건문, 반복문 및 플레이북의 변수를 참조할 수 있습니다. 빌드된 템플릿 파일은 관리 노드(Managed Nodes)로 복사됩니다.
다음은 Jinja2 템플릿 예제입니다.
<title>{% block title %}{% endblock %}</title>
<ul>
{% for user in users %}
<li><a href="{{ user.url }}">{{ user.username }}</a></li>
{% endfor %}
</ul>
- {% EXPR %} : 조건문 및 반복문과 같은 논리식
- {{ EXPR }} : 논리식 및 변수 참조
- {# COMMNET #} : 주석
다음은 /etc/hosts 파일을 생성하기 위한 Jinja2 템플릿 예제입니다.
{{ ansible_managed | comment }} # 주석 필터
{# /etc/hosts line #}
{% for host in groups['all'] %}
{{ ansible_facts['default_ipv4']['address'] }} {{ ansible_facts['hostname'] }}
{% endfor %}
2) Jinja2 템플릿 사용
Jinja2 템플릿 파일을 동적으로 빌드하기 위해서는 반드시 template 모듈과 함께 사용해야 합니다.
tasks:
- template:
src: templates/hosts.j2
dest: /etc/hosts
◆ Jinja2 템플릿 파일은 일반적으로 확장명이 필요하지 않으나, 보통 .j2 또는 .jinja2 확장명을 붙여 사용합니다.
3) Jinja2 템플릿 파일 주석 관리
Ansible에서 Jinja2 템플릿으로 제공된 설정 파일은 가급적 Jinja2 템플릿을 이용해서 수정할 것을 권장합니다. 사용자가 해당 파일을 직접 편집하는 것을 지양하고, ansible_manged 변수를 참조하여 수정합니다.
(1) 템플릿 파일 주석
일반적으로 Jinja2 템플릿 가장 첫 줄에 해당 주석(ansible_manged 변수 참조)을 포함합니다.
{{ ansible_managed | comment }} # 주석
{# /etc/hosts line #}
{% for host in groups['all'] %}
{{ ansible_facts['default_ipv4']['address'] }} {{ ansible_facts['hostname'] }}
{% endfor %}
빌드된 템플릿 파일은 다음과 같습니다.
#
# Ansible managed
#
192.168.56.50 ansible-ctrl
...
(2) 템플릿 파일 주석 설정
ansible_managed 변수는 ansible.cfg 설정 파일에서 정의할 수 있습니다.
ansible.cfg 파일에서 ansible_managed 변수 설정 예제 :
[defaults]
ansible_managed = Ansible managed: {file} modified on %Y-%m-%d %H:%M:%S by {uid} on {host}
- {file} : 템플릿 파일의 절대 경로
- {host} : Ansible의 관리 노드 이름
- {uid} : 템플릿 파일의 소유자
- %Y-%m-%d %H:%M:%S : 템플릿 모듈에 의해 파일이 수정된 시간
출력은 다음과 같습니다.
#
# Ansible maanged: hosts.j2 modified on 2021-07-29 21:17:27 by vagrant on web1
#
...