변수 발견하기: facts와 매직 변수
변수 발견하기: facts와 매직 변수
Ansible을 쓰면 원격 시스템이나 Ansible 자체에 대한 정보를 담은 특정 변수를 가져오거나 발견할 수 있어요. 원격 시스템과 관련된 변수를 facts라고 불러요. facts를 쓰면 한 시스템의 동작·상태를 다른 시스템의 구성으로 사용할 수 있어요. 예를 들어 한 시스템의 IP 주소를 다른 시스템의 구성 값으로 쓸 수 있죠. Ansible 자체와 관련된 변수는 **매직 변수(magic variables)**라고 불러요.
facts에는 운영체제, IP 주소, 연결된 파일시스템 등 원격 시스템에 대한 데이터가 담겨요. 이 데이터는 ansible_facts 변수로 접근할 수 있고, 기본적으로 ansible_ 접두사가 붙은 최상위 변수로도 일부 facts에 접근할 수 있어요. 이 동작은 INJECT_FACTS_AS_VARS 설정으로 끌 수 있어요.
출처: 문서
본문
Ansible facts
가능한 모든 facts를 보려면 플레이에 다음 작업을 추가하세요.
- name: Print all available facts
ansible.builtin.debug:
var: ansible_facts
이미 인벤토리를 만들고 작업 가능한 SSH 자격증명을 구성했다면, 명령줄에서 이 ad-hoc ansible 명령으로 인벤토리의 어떤 호스트에 대한 '원시(raw)' 정보도 볼 수 있어요.
ansible <hostname> -m ansible.builtin.setup
facts는 이렇게 생긴 방대한 양의 변수 데이터를 포함해요.
{
"ansible_all_ipv4_addresses": [
"REDACTED IP ADDRESS"
],
"ansible_all_ipv6_addresses": [
"REDACTED IPV6 ADDRESS"
],
"ansible_apparmor": {
"status": "disabled"
},
"ansible_architecture": "x86_64",
"ansible_bios_date": "11/28/2013",
"ansible_bios_version": "4.1.5",
"ansible_cmdline": {
"BOOT_IMAGE": "/boot/vmlinuz-3.10.0-862.14.4.el7.x86_64",
"console": "ttyS0,115200",
"no_timer_check": true,
"nofb": true,
"nomodeset": true,
"ro": true,
"root": "LABEL=cloudimg-rootfs",
"vga": "normal"
},
"ansible_date_time": {
"date": "2018-10-25",
"day": "25",
"epoch": "1540469324",
"hour": "12",
"iso8601": "2018-10-25T12:08:44Z",
"iso8601_basic": "20181025T120844109754",
"iso8601_basic_short": "20181025T120844",
"iso8601_micro": "2018-10-25T12:08:44.109968Z",
"minute": "08",
"month": "10",
"second": "44",
"time": "12:08:44",
"tz": "UTC",
"tz_offset": "+0000",
"weekday": "Thursday",
"weekday_number": "4",
"weeknumber": "43",
"year": "2018"
},
"ansible_default_ipv4": {
"address": "REDACTED",
"alias": "eth0",
"broadcast": "REDACTED",
"gateway": "REDACTED",
"interface": "eth0",
"macaddress": "REDACTED",
"mtu": 1500,
"netmask": "255.255.255.0",
"network": "REDACTED",
"type": "ether"
},
"ansible_default_ipv6": {},
"ansible_device_links": {
"ids": {},
"labels": {
"xvda1": [
"cloudimg-rootfs"
],
"xvdd": [
"config-2"
]
},
"masters": {},
"uuids": {
"xvda1": [
"cac81d61-d0f8-4b47-84aa-b48798239164"
],
"xvdd": [
"2018-10-25-12-05-57-00"
]
}
},
"ansible_devices": {
"xvda": {
"holders": [],
"host": "",
"links": {
"ids": [],
"labels": [],
"masters": [],
"uuids": []
},
"model": null,
"partitions": {
"xvda1": {
"holders": [],
"links": {
"ids": [],
"labels": [
"cloudimg-rootfs"
],
"masters": [],
"uuids": [
"cac81d61-d0f8-4b47-84aa-b48798239164"
]
},
"sectors": "83883999",
"sectorsize": 512,
"size": "40.00 GB",
"start": "2048",
"uuid": "cac81d61-d0f8-4b47-84aa-b48798239164"
}
},
"removable": "0",
"rotational": "0",
"sas_address": null,
"sas_device_handle": null,
"scheduler_mode": "deadline",
"sectors": "83886080",
"sectorsize": "512",
"size": "40.00 GB",
"support_discard": "0",
"vendor": null,
"virtual": 1
},
"xvdd": {
"holders": [],
"host": "",
"links": {
"ids": [],
"labels": [
"config-2"
],
"masters": [],
"uuids": [
"2018-10-25-12-05-57-00"
]
},
"model": null,
"partitions": {},
"removable": "0",
"rotational": "0",
"sas_address": null,
"sas_device_handle": null,
"scheduler_mode": "deadline",
"sectors": "131072",
"sectorsize": "512",
"size": "64.00 MB",
"support_discard": "0",
"vendor": null,
"virtual": 1
},
"xvde": {
"holders": [],
"host": "",
"links": {
"ids": [],
"labels": [],
"masters": [],
"uuids": []
},
"model": null,
"partitions": {
"xvde1": {
"holders": [],
"links": {
"ids": [],
"labels": [],
"masters": [],
"uuids": []
},
"sectors": "167770112",
"sectorsize": 512,
"size": "80.00 GB",
"start": "2048",
"uuid": null
}
},
"removable": "0",
"rotational": "0",
"sas_address": null,
"sas_device_handle": null,
"scheduler_mode": "deadline",
"sectors": "167772160",
"sectorsize": "512",
"size": "80.00 GB",
"support_discard": "0",
"vendor": null,
"virtual": 1
}
},
"ansible_distribution": "CentOS",
"ansible_distribution_file_parsed": true,
"ansible_distribution_file_path": "/etc/redhat-release",
"ansible_distribution_file_variety": "RedHat",
"ansible_distribution_major_version": "7",
"ansible_distribution_release": "Core",
"ansible_distribution_version": "7.5.1804",
"ansible_dns": {
"nameservers": [
"127.0.0.1"
]
},
"ansible_domain": "",
"ansible_effective_group_id": 1000,
"ansible_effective_user_id": 1000,
"ansible_env": {
"HOME": "/home/zuul",
"LANG": "en_US.UTF-8",
"LESSOPEN": "||/usr/bin/lesspipe.sh %s",
"LOGNAME": "zuul",
"MAIL": "/var/mail/zuul",
"PATH": "/usr/local/bin:/usr/bin",
"PWD": "/home/zuul",
"SELINUX_LEVEL_REQUESTED": "",
"SELINUX_ROLE_REQUESTED": "",
"SELINUX_USE_CURRENT_RANGE": "",
"SHELL": "/bin/bash",
"SHLVL": "2",
"SSH_CLIENT": "REDACTED 55672 22",
"SSH_CONNECTION": "REDACTED 55672 REDACTED 22",
"USER": "zuul",
"XDG_RUNTIME_DIR": "/run/user/1000",
"XDG_SESSION_ID": "1",
"_": "/usr/bin/python2"
},
"ansible_eth0": {
"active": true,
"device": "eth0",
"ipv4": {
"address": "REDACTED",
"broadcast": "REDACTED",
"netmask": "255.255.255.0",
"network": "REDACTED"
},
"ipv6": [
{
"address": "REDACTED",
"prefix": "64",
"scope": "link"
}
],
"macaddress": "REDACTED",
"module": "xen_netfront",
"mtu": 1500,
"pciid": "vif-0",
"promisc": false,
"type": "ether"
},
"ansible_eth1": {
"active": true,
"device": "eth1",
"ipv4": {
"address": "REDACTED",
"broadcast": "REDACTED",
"netmask": "255.255.224.0",
"network": "REDACTED"
},
"ipv6": [
{
"address": "REDACTED",
"prefix": "64",
"scope": "link"
}
],
"macaddress": "REDACTED",
"module": "xen_netfront",
"mtu": 1500,
"pciid": "vif-1",
"promisc": false,
"type": "ether"
},
"ansible_fips": false,
"ansible_form_factor": "Other",
"ansible_fqdn": "centos-7-rax-dfw-0003427354",
"ansible_hostname": "centos-7-rax-dfw-0003427354",
"ansible_interfaces": [
"lo",
"eth1",
"eth0"
],
"ansible_is_chroot": false,
"ansible_kernel": "3.10.0-862.14.4.el7.x86_64",
"ansible_lo": {
"active": true,
"device": "lo",
"ipv4": {
"address": "127.0.0.1",
"broadcast": "host",
"netmask": "255.0.0.0",
"network": "127.0.0.0"
},
"ipv6": [
{
"address": "::1",
"prefix": "128",
"scope": "host"
}
],
"mtu": 65536,
"promisc": false,
"type": "loopback"
},
"ansible_local": {},
"ansible_lsb": {
"codename": "Core",
"description": "CentOS Linux release 7.5.1804 (Core)",
"id": "CentOS",
"major_release": "7",
"release": "7.5.1804"
},
"ansible_machine": "x86_64",
"ansible_machine_id": "2db133253c984c82aef2fafcce6f2bed",
"ansible_memfree_mb": 7709,
"ansible_memory_mb": {
"nocache": {
"free": 7804,
"used": 173
},
"real": {
"free": 7709,
"total": 7977,
"used": 268
},
"swap": {
"cached": 0,
"free": 0,
"total": 0,
"used": 0
}
},
"ansible_memtotal_mb": 7977,
"ansible_mounts": [
{
"block_available": 7220998,
"block_size": 4096,
"block_total": 9817227,
"block_used": 2596229,
"device": "/dev/xvda1",
"fstype": "ext4",
"inode_available": 10052341,
"inode_total": 10419200,
"inode_used": 366859,
"mount": "/",
"options": "rw,seclabel,relatime,data=ordered",
"size_available": 29577207808,
"size_total": 40211361792,
"uuid": "cac81d61-d0f8-4b47-84aa-b48798239164"
},
{
"block_available": 0,
"block_size": 2048,
"block_total": 252,
"block_used": 252,
"device": "/dev/xvdd",
"fstype": "iso9660",
"inode_available": 0,
"inode_total": 0,
"inode_used": 0,
"mount": "/mnt/config",
"options": "ro,relatime,mode=0700",
"size_available": 0,
"size_total": 516096,
"uuid": "2018-10-25-12-05-57-00"
}
],
"ansible_nodename": "centos-7-rax-dfw-0003427354",
"ansible_os_family": "RedHat",
"ansible_pkg_mgr": "yum",
"ansible_processor": [
"0",
"GenuineIntel",
"Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz",
"1",
"GenuineIntel",
"Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz",
"2",
"GenuineIntel",
"Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz",
"3",
"GenuineIntel",
"Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz",
"4",
"GenuineIntel",
"Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz",
"5",
"GenuineIntel",
"Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz",
"6",
"GenuineIntel",
"Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz",
"7",
"GenuineIntel",
"Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz"
],
"ansible_processor_cores": 8,
"ansible_processor_count": 8,
"ansible_processor_nproc": 8,
"ansible_processor_threads_per_core": 1,
"ansible_processor_vcpus": 8,
"ansible_product_name": "HVM domU",
"ansible_product_serial": "REDACTED",
"ansible_product_uuid": "REDACTED",
"ansible_product_version": "4.1.5",
"ansible_python": {
"executable": "/usr/bin/python2",
"has_sslcontext": true,
"type": "CPython",
"version": {
"major": 2,
"micro": 5,
"minor": 7,
"releaselevel": "final",
"serial": 0
},
"version_info": [
2,
7,
5,
"final",
0
]
},
"ansible_python_version": "2.7.5",
"ansible_real_group_id": 1000,
"ansible_real_user_id": 1000,
"ansible_selinux": {
"config_mode": "enforcing",
"mode": "enforcing",
"policyvers": 31,
"status": "enabled",
"type": "targeted"
},
"ansible_selinux_python_present": true,
"ansible_service_mgr": "systemd",
"ansible_ssh_host_key_ecdsa_public": "REDACTED KEY VALUE",
"ansible_ssh_host_key_ed25519_public": "REDACTED KEY VALUE",
"ansible_ssh_host_key_rsa_public": "REDACTED KEY VALUE",
"ansible_swapfree_mb": 0,
"ansible_swaptotal_mb": 0,
"ansible_system": "Linux",
"ansible_system_capabilities": [
""
],
"ansible_system_capabilities_enforced": "True",
"ansible_system_vendor": "Xen",
"ansible_uptime_seconds": 151,
"ansible_user_dir": "/home/zuul",
"ansible_user_gecos": "",
"ansible_user_gid": 1000,
"ansible_user_id": "zuul",
"ansible_user_shell": "/bin/bash",
"ansible_user_uid": 1000,
"ansible_userspace_architecture": "x86_64",
"ansible_userspace_bits": "64",
"ansible_virtualization_role": "guest",
"ansible_virtualization_type": "xen",
"gather_subset": [
"all"
],
"module_setup": true
}
위 facts에 나온 첫 번째 디스크의 모델을 템플릿이나 플레이북에서 이렇게 참조할 수 있어요.
{{ ansible_facts['devices']['xvda']['model'] }}
시스템 호스트명을 참조하려면,
{{ ansible_facts['nodename'] }}
setup 모듈 출력에 보이는 ansible_ 접두사는 이 변수들을 주소로 지정할 때는 쓰지 않는다는 점에 주의하세요.
facts는 조건문(Conditionals 참고)과 템플릿에서 쓸 수 있어요. 또한 facts로 특정 기준에 맞는 호스트의 동적 그룹을 만들 수도 있는데, 자세한 내용은 group_by 모듈 문서를 참고하세요.
참고:
ansible_date_time은 Ansible이 각 플레이북 실행 전에 facts를 수집할 때 생성·캐시되므로, 오래 실행되는 플레이북에서는 stale(낡은 값)해질 수 있어요. 플레이북 실행이 오래 걸린다면ansible_date_time대신 pipe 필터(예:lookup('pipe', 'date +%Y-%m-%d.%H:%M:%S'))나 Jinja2 템플릿의now()를 쓰세요.
fact 수집을 위한 패키지 요구사항
일부 배포판에서는 그 facts를 수집하는 데 필요한 패키지가 기본 설치돼 있지 않아 몇몇 fact 값이 빠지거나 기본값으로 설정된 것을 볼 수 있어요. OS 패키지 매니저로 원격 호스트에 필요한 패키지를 설치할 수 있어요. 알려진 의존성은 다음과 같아요.
- Linux 네트워크 fact 수집 —
ip바이너리에 의존하며, 보통iproute2패키지에 포함돼 있어요.
facts 캐싱
등록 변수처럼 facts도 기본적으로 메모리에 저장돼요. 하지만 등록 변수와 달리 facts는 독립적으로 수집되어 반복 사용을 위해 캐시될 수 있어요. 캐시된 facts로는, Ansible이 현재 플레이를 두 번째 시스템에서 먼저 실행하더라도 한 시스템의 facts를 두 번째 시스템을 구성할 때 참조할 수 있어요. 예:
{{ hostvars['asdf.example.com']['ansible_facts']['os_family'] }}
캐싱은 캐시 플러그인에 의해 제어돼요. 기본적으로 Ansible은 현재 플레이북 실행 동안 facts를 메모리에 저장하는 memory 캐시 플러그인을 사용해요. 반복 사용을 위해 Ansible facts를 유지하려면 다른 캐시 플러그인을 선택하세요. 세부 사항은 Cache plugins 문서를 참고하세요.
fact 캐싱은 성능을 향상시킬 수 있어요. 수천 대의 호스트를 관리한다면 fact 캐싱을 밤마다 실행하도록 구성하고, 하루 동안 더 적은 수의 서버 집합에 구성을 주기적으로 관리할 수 있어요. 캐시된 facts가 있으면 적은 수의 서버만 관리할 때도 모든 호스트에 대한 변수·정보에 접근할 수 있어요.
facts 비활성화하기
기본적으로 Ansible은 각 플레이 시작 시 facts를 수집해요. facts를 수집할 필요가 없다면(예: 모든 시스템에 대해 중앙에서 알고 있다면), 확장성(scalability)을 위해 플레이 수준에서 fact 수집을 끌 수 있어요. facts 비활성화는 특히 매우 많은 시스템에서 push 모드일 때나 실험적 플랫폼에서 Ansible을 쓸 때 성능이 크게 좋아질 수 있어요. fact 수집을 끄려면:
- hosts: whatever
gather_facts: false
사용자 정의 facts 추가하기
Ansible의 setup 모듈은 각 호스트에 대한 표준 facts 집합을 자동으로 발견해요. facts에 사용자 정의 값을 추가하려면 사용자 정의 facts 모듈을 작성하거나, ansible.builtin.set_fact 작업으로 임시 facts를 설정하거나, facts.d 디렉터리로 영구적인 사용자 정의 facts를 제공할 수 있어요.
facts.d 또는 로컬 facts
1.3 버전에 새로 추가됐어요.
facts.d에 정적 파일을 추가하면 정적 사용자 정의 facts를, 실행 가능한 스크립트를 추가하면 동적 facts를 넣을 수 있어요. 예를 들어 호스트의 모든 사용자 목록을 만드는 스크립트를 facts.d에 만들어 실행하면 그 목록을 facts에 추가할 수 있어요.
facts.d를 쓰려면 원격 호스트(들)에 /etc/ansible/facts.d 디렉터리를 만드세요. 다른 디렉터리를 선호하면 만들고 fact_path 플레이 키워드로 지정할 수 있어요. 사용자 정의 facts를 제공할 파일을 디렉터리에 추가하세요. 모든 파일 이름은 .fact로 끝나야 해요. 파일은 JSON, INI, 또는 JSON을 반환하는 실행 가능한 파일이 될 수 있어요.
정적 facts를 추가하려면 .fact 확장자의 파일을 추가하기만 하면 돼요. 예를 들어 /etc/ansible/facts.d/preferences.fact를 이 내용으로 만드세요.
[general]
asdf=1
bar=2
참고: 이 파일이 실행 가능하지 않게 하세요 — 실행 가능하면
ansible.builtin.setup모듈이 깨져요.
다음에 fact 수집이 실행되면 facts에 general이라는 해시 변수 fact가 생기고 asdf와 bar를 멤버로 포함해요. 이를 검증하려면 다음을 실행하세요.
ansible <hostname> -m ansible.builtin.setup -a "filter=ansible_local"
그러면 추가된 사용자 정의 fact를 볼 수 있어요.
{
"ansible_local": {
"preferences": {
"general": {
"asdf" : "1",
"bar" : "2"
}
}
}
}
ansible_local 네임스페이스는 facts.d로 만든 사용자 정의 facts를 시스템 facts나 플레이북 다른 곳에 정의된 변수와 분리해서, 변수들이 서로 재정의하지 않게 해요. 이 사용자 정의 fact는 템플릿이나 플레이북에서 이렇게 접근할 수 있어요.
{{ ansible_local['preferences']['general']['asdf'] }}
참고:
key=value쌍의 키 부분은ansible_local변수 안에서 소문자로 변환돼요. 위 예시에서 ini 파일의[general]섹션에XYZ=3이 있었다면,{{ ansible_local['preferences']['general']['xyz'] }}로 접근해야지{{ ansible_local['preferences']['general']['XYZ'] }}가 아니에요. 그 이유는 Ansible이 파이썬의 ConfigParser를 쓰는데, 이 파서가 모든 옵션 이름을optionxform메서드를 통과시키고 이 메서드의 기본 구현이 옵션 이름을 소문자로 변환하기 때문이에요.
facts.d로 원격 호스트에서 스크립트를 실행해 ansible_local 네임스페이스에 동적 사용자 정의 facts를 생성할 수도 있어요. 예를 들어 원격 호스트에 존재하는 모든 사용자 목록을 그 호스트에 대한 fact로 만들 수 있어요. facts.d로 동적 사용자 정의 facts를 만들려면:
원하는 JSON 데이터를 생성하는 스크립트를 작성·테스트하세요. 스크립트를 facts.d 디렉터리에 저장하고
.fact확장자를 붙이세요. Ansible 연결 사용자가 실행할 수 있게 스크립트를 실행 가능하게 만드세요. 스크립트를 실행하고 JSON 출력을ansible_local에 추가하기 위해 facts를 수집하세요.
기본적으로 fact 수집은 각 플레이 시작 시 한 번 실행돼요. 플레이북에서 facts.d로 사용자 정의 fact를 만들면, 그 다음 facts를 수집하는 플레이에서 사용할 수 있어요. 만든 것과 같은 플레이에서 쓰고 싶다면 setup 모듈을 명시적으로 다시 실행해야 해요. 예:
- hosts: webservers
tasks:
- name: Create directory for ansible custom facts
ansible.builtin.file:
state: directory
recurse: true
path: /etc/ansible/facts.d
- name: Install custom ipmi fact
ansible.builtin.copy:
src: ipmi.fact
dest: /etc/ansible/facts.d
- name: Re-read facts after adding custom fact
ansible.builtin.setup:
filter: ansible_local
이 패턴을 자주 쓴다면 facts.d보다 사용자 정의 facts 모듈이 더 효율적이에요.
Ansible에 대한 정보: 매직 변수
사용 중인 파이썬 버전, 인벤토리의 호스트·그룹, 플레이북·역할의 디렉터리 등 Ansible 작업에 대한 정보는 "매직" 변수로 접근할 수 있어요. 연결 변수처럼 매직 변수도 **특수 변수(Special Variables)**예요. 매직 변수 이름은 예약되어 있으니 이 이름으로 변수를 설정하면 안 돼요. environment 변수도 예약돼 있어요.
가장 흔히 쓰는 매직 변수는 hostvars, groups, group_names, inventory_hostname이에요. hostvars로는 플레이북의 어느 시점이든 플레이에서 어떤 호스트에 대해 정의된 변수에도 접근할 수 있어요. hostvars 변수로 Ansible facts에도 접근할 수 있지만, facts를 수집(또는 캐시)한 뒤에만 가능해요. 플레이 객체에 정의된 변수는 특정 호스트를 위한 게 아니므로 hostvars에 매핑되지 않는다는 점에 주의하세요.
다른 노드의 'fact' 값이나 다른 노드에 할당된 인벤토리 변수 값으로 데이터베이스 서버를 구성하고 싶다면, 템플릿이나 액션 줄에서 hostvars를 쓸 수 있어요.
{{ hostvars['test.example.com']['ansible_facts']['distribution'] }}
groups는 인벤토리 안의 모든 그룹(과 호스트) 목록으로, 그룹 안의 모든 호스트를 나열할 수 있어요. 예:
{% for host in groups['app_servers'] %}
# something that applies to all app servers.
{% endfor %}
groups와 hostvars를 함께 쓰면 그룹 안의 모든 IP 주소를 찾을 수 있어요.
{% for host in groups['app_servers'] %}
{{ hostvars[host]['ansible_facts']['eth0']['ipv4']['address'] }}
{% endfor %}
이 접근 방식으로 프런트엔드 프록시 서버가 앱 서버 그룹의 모든 호스트를 가리키게 하거나, 서버 간 올바른 방화벽 규칙을 설정하는 데 쓸 수 있어요. 템플릿을 채우는 작업 전에 그 호스트들의 facts를 캐시하거나 수집해야 해요.
group_names는 현재 호스트가 속한 모든 그룹의 목록(배열)으로, 호스트의 그룹 맴버십(또는 역할)에 따라 달라지는 템플릿 파일을 만들 수 있어요.
{% if 'webserver' in group_names %}
# some part of a configuration file that only applies to webservers
{% endif %}
매직 변수 inventory_hostname(인벤토리에서 구성된 호스트 이름)을 fact 수집이 비활성화됐을 때 ansible_hostname의 대안으로 쓸 수 있어요. 긴 FQDN이 있다면, 첫 마침표까지의 부분만 담고 나머지 도메인은 없는 inventory_hostname_short를 쓸 수 있어요.
현재 플레이·플레이북을 가리키는 다른 유용한 매직 변수도 있어요. 이 변수들은 여러 호스트명으로 템플릿을 채우거나 로드 밸런서 규칙에 목록을 넣을 때 유용해요.
ansible_play_hosts— 현재 플레이에서 아직 활성 상태인 모든 호스트의 목록.ansible_play_batch— 현재 플레이의 현재 '배치'에 범위가 있는 호스트명 목록. 배치 크기는serial로 정의되며, 설정하지 않으면 전체 플레이와 같아져ansible_play_hosts와 같아져요.ansible_playbook_python— Ansible 명령줄 도구를 호출하는 데 쓰인 파이썬 실행 파일의 경로.inventory_dir— Ansible 인벤토리 호스트 파일이 있는 디렉터리의 경로명.inventory_file— Ansible 인벤토리 호스트 파일을 가리키는 경로명과 파일 이름.playbook_dir— 플레이북 기본 디렉터리.role_path— 현재 역할의 경로명. 역할 안에서만 동작해요.ansible_check_mode— 불리언으로,--check로 Ansible을 실행하면True로 설정돼요.
Ansible 버전
1.8 버전에 새로 추가됐어요.
플레이북 동작을 다른 Ansible 버전에 맞게 조정하려면 ansible_version 변수를 쓸 수 있어요. 구조는 다음과 같아요.
{
"ansible_version": {
"full": "2.10.1",
"major": 2,
"minor": 10,
"revision": 1,
"string": "2.10.1"
}
}
더 알아보기 (Learn more)
- Special Variables — 연결 변수와 매직 변수를 포함한 특수 변수 목록
- Conditionals — 조건문에서 facts 사용하기
- group_by 모듈 — criteria에 맞는 동적 그룹 만들기
- Cache plugins — fact 캐싱 구성