** 서종호(가시다)님의 On-Premise K8s Hands-on Study 2주차 학습 내용을 기반으로 합니다. **
어제 포스팅에서 Ansible 설치를 해보고 Ansible의 기본적인 구성 요소들에 대한 설명을 했었다. 설치는 pip3를 통해 간단하게 진행할 수 있으니, 설치는 했다고 가정하고 진행해보려고 한다.
인벤토리 생성
인벤토리는 컨트롤 노드가 관리할 노드를 나열해둔 파일로 INI, YAML 모두 지원한다. 여기에서는 INI로 작성해보려고 한다.
원래는 그냥 나열만 해도 된다.
$ cat inventory
10.10.1.1
10.10.1.2
10.10.1.3
그런데 위와 같이 하면 뭐가 어떤 노드인지 모른다. 그래서 이름을 /etc/hosts 기반으로 바꿔도 된다.
$ cat inventory
tnode1
tnode2
tnode3
이렇게 노드 이름을 붙일 수 있다. 그런데 관리할 노드가 엄청 많아지면 어떤 호스트가 무슨 역할의 노드인지 모를 수 있다. 그래서 그룹을 지어줄 수 있다.
$ cat inventory
[web]
tnode1 ansible_python_interpreter=/usr/bin/python3
tnode2 ansible_python_interpreter=/usr/bin/python3
[db]
tnode3 ansible_python_interpreter=/usr/bin/python3
[all:children]
web
db
$ ansible-inventory -i ./inventory --list | more
{
"_meta": {
"hostvars": {
"tnode1": {
"ansible_all_ipv4_addresses": [
{
"__ansible_unsafe": "10.10.1.11"
},
{
"__ansible_unsafe": "10.0.2.15"
}
],
"ansible_all_ipv6_addresses": [
{
"__ansible_unsafe": "fe80::a00:27ff:fe83:a1fc"
},
{
"__ansible_unsafe": "fd17:625c:f037:2:a00:27ff:fef8:c2eb"
},
{
"__ansible_unsafe": "fe80::a00:27ff:fef8:c2eb"
}
],
"ansible_apparmor": {
"status": {
"__ansible_unsafe": "enabled"
}
},
"ansible_architecture": {
"__ansible_unsafe": "x86_64"
},
"ansible_bios_date": {
"__ansible_unsafe": "12/01/2006"
},
"ansible_bios_vendor": {
"__ansible_unsafe": "innotek GmbH"
},
"ansible_bios_version": {
"__ansible_unsafe": "VirtualBox"
},
"ansible_board_asset_tag": {
"__ansible_unsafe": "NA"
},
"ansible_board_name": {
"__ansible_unsafe": "VirtualBox"
},
"ansible_board_serial": {
"__ansible_unsafe": "0"
},
"ansible_board_vendor": {
"__ansible_unsafe": "Oracle Corporation"
},
"ansible_board_version": {
"__ansible_unsafe": "1.2"
},
"ansible_chassis_asset_tag": {
"__ansible_unsafe": "NA"
},
"ansible_chassis_serial": {
"__ansible_unsafe": "NA"
... < 중략 > ...
이렇게 하면 tnode1, tnode2는 web 그룹이고, tnode3이 db 노드이구나~ 하고 알 수 있다. 그리고 Ansible에서 inventory 작성할 때 다행히도 정규 표현식 같은 표현을 지원한다.
가령, 100개의 web 서버 이름을 넣으려고 하면
[webservers]
web[1:100].example.com
[db-servers]
db[01:09].example.com
## a.dns.example.com, b.dns.example.com, c.dns.example.com을 의미함.
[dns]
[a:c].dns.example.com
이런식으로 작성할 수도 있다고 한다. 와 편해..
인벤토리는 아래와 같이 간단하게 그래프 형태로도 프린트할 수 있다.
$ ansible-inventory -i ./inventory --graph
@all:
|--@ungrouped:
|--@web:
| |--tnode1
| |--tnode2
|--@db:
| |--tnode3
이렇게 만든 inventory 파일을 실제로 적용하려고 하면 ansible.cfg 파일에 적용해주면 된다.
$ cat ansible.cfg
[defaults]
inventory = ./inventory
remote_user = root
ask_pass = false
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
"./inventory" 로 적은 부분으로 인해 inventory 파일을 적용할 수 있다.
플레이북
이제 인벤토리를 작성했으니, 플레이북을 작성해보고 실행해보자. 그런데 그 전에 ad-hoc 커맨드에 대해서 먼저 알아보자.
ad-hoc 커맨드는 플레이북을 실행하지 않고 각각의 관리 노드에 간단하게 ansible을 통해 명령어를 실행해보는 것이다. 간단하게 ping 테스트를 해볼 수 있다.
$ ansible -m ping web
tnode2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
tnode1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
web은 인벤토리에서 설정한데로 tnode1, tnode2이다. 두 노드가 정상적으로 작동중이기 때문에 tnode1 | SUCCESS 와 같이 출력된다. CLI 명령어를 직접 실행하고 싶으면 아래와 같이 "-m shell"을 옵션으로 넣어 실행시키면 된다.
# db 그룹에만 실행
$ ansible -m shell -a uptime db
tnode3 | CHANGED | rc=0 >>
13:01:48 up 16:28, 1 user, load average: 0.00, 0.00, 0.00
# web 그룹에만 실행
$ ansible -m shell -a "free -h" web
tnode1 | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 1.4Gi 347Mi 585Mi 1.0Mi 685Mi 1.1Gi
Swap: 2.9Gi 0B 2.9Gi
tnode2 | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 1.4Gi 349Mi 590Mi 1.0Mi 678Mi 1.1Gi
Swap: 2.9Gi 0B 2.9Gi
# 모든 노드에 실행
$ ansible -m shell -a "tail -n 3 /etc/passwd" all
tnode3 | CHANGED | rc=0 >>
tcpdump:x:72:72::/:/sbin/nologin
vagrant:x:1000:1000::/home/vagrant:/bin/bash
vboxadd:x:991:1::/var/run/vboxadd:/bin/false
tnode1 | CHANGED | rc=0 >>
sshd:x:109:65534::/run/sshd:/usr/sbin/nologin
vagrant:x:1000:1000:vagrant:/home/vagrant:/bin/bash
vboxadd:x:999:1::/var/run/vboxadd:/bin/false
tnode2 | CHANGED | rc=0 >>
sshd:x:109:65534::/run/sshd:/usr/sbin/nologin
vagrant:x:1000:1000:vagrant:/home/vagrant:/bin/bash
vboxadd:x:999:1::/var/run/vboxadd:/bin/false
자 본격적으로 플레이북을 작성해보자.
$ cat first-playbook.yml
---
- hosts: all
tasks:
- name: Print message
debug:
msg: Hello CloudNet@ Ansible Study
$ ansible-playbook first-playbook.yml
PLAY [all] **********************************************************************************************************************************************************************************************************************************
TASK [Print message] ************************************************************************************************************************************************************************************************************************
ok: [tnode2] => {
"msg": "Hello CloudNet@ Ansible Study"
}
ok: [tnode1] => {
"msg": "Hello CloudNet@ Ansible Study"
}
ok: [tnode3] => {
"msg": "Hello CloudNet@ Ansible Study"
}
PLAY RECAP **********************************************************************************************************************************************************************************************************************************
tnode1 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
tnode2 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
tnode3 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
참고로 작성한 플레이북의 yml 파일의 문법을 체크해볼 수도 있다.
# 정상적일 경우
$ ansible-playbook --syntax-check first-playbook.yml
playbook: first-playbook.yml
# 에러를 포함할 경우
$ ansible-playbook --syntax-check first-playbook-with-error.yml
[ERROR]: conflicting action statements: debug, msg
Origin: /root/my-ansible/first-playbook-with-error.yml:4:7
2 - hosts: all
3 tasks:
4 - name: Print message
^ column 7
이제 ssh 서비스를 재시작하는 플레이북을 만들어보자.
---
- hosts: all
tasks:
- name: Restart sshd service
ansible.builtin.service:
name: ssh # sshd
state: restarted
위 플레이북을 실행하면 에러가 발생한다.
$ ansible-playbook restart-service-error.yml
PLAY [all] **********************************************************************************************************************************************************************************************************************************
TASK [Restart sshd service] *****************************************************************************************************************************************************************************************************************
[ERROR]: Task failed: Module failed: Could not find the requested service ssh: host
Origin: /root/my-ansible/restart-service-error.yml:4:7
2 - hosts: all
3 tasks:
4 - name: Restart sshd service
^ column 7
fatal: [tnode3]: FAILED! => {"changed": false, "msg": "Could not find the requested service ssh: host"}
changed: [tnode1]
changed: [tnode2]
PLAY RECAP **********************************************************************************************************************************************************************************************************************************
tnode1 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
tnode2 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
tnode3 : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
tnode3는 RedHat 계열의 노드이다. RedHat 계열에서는 ssh가 아니라 sshd이다. Ansible은 플레이북을 작성할 때 when이라는 키워드를 통해서 조건 값을 넣어줄 수 있다.
$ cat restart-service.yml
- hosts: all
tasks:
- name: Restart SSH on Debian
ansible.builtin.service:
name: ssh
state: restarted
when: ansible_facts['os_family'] == 'Debian'
- name: Restart SSH on RedHat
ansible.builtin.service:
name: sshd
state: restarted
when: ansible_facts['os_family'] == 'RedHat'
$ ansible-playbook restart-service.yml
PLAY [all] **********************************************************************************************************************************************************************************************************************************
TASK [Restart SSH on Debian] ****************************************************************************************************************************************************************************************************************
skipping: [tnode3]
changed: [tnode1]
changed: [tnode2]
TASK [Restart SSH on RedHat] ****************************************************************************************************************************************************************************************************************
skipping: [tnode1]
skipping: [tnode2]
changed: [tnode3]
PLAY RECAP **********************************************************************************************************************************************************************************************************************************
tnode1 : ok=1 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
tnode2 : ok=1 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
tnode3 : ok=1 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
다음 절에서 설명할 것이지만, 미리 좀 말하면 팩트라는 값을 통해서 os 종류를 변수 형태로 가지고 있을 수 있다. ansible_facts['os_family']라고 하면 각 관리 노드가 RedHat 계열인지 Debian 계열인지 등을 알 수 있다.
팩트
팩트를 설명하기 전에 플레이북이 실행되는 과정을 먼저 봐보자.

https://juwon8891.github.io/2026/01/17/k8s-deploy-week2-ansible-basics/
[K8s-Deploy] Week 2 - Ansible 기초
주차 소개 Week 2에서는 Ansible의 기초를 학습합니다. Ansible은 에이전트리스(Agentless) 아키텍처를 기반으로 SSH를 통해 서버를 관리하는 자동화 도구입니다. 선언적 문법(YAML)과 멱등성(Idempotency)을
juwon8891.github.io
위 그림을 보면 SSH Connect 시도 후 Gather facts를 실행하는데, 컨트롤 노드가 관리 노드에 SSH를 붙은 후에 여러 정보들을 수집하는 과정임을 알 수 있다. 수집된 정보들은 ansible_facts를 통해 컨트롤 노드로 수집된다. facts가 어떤 값을 가지고 있는지 알아보면 아래와 같다.
$ cat facts.yml
---
- hosts: db
tasks:
- name: Print all facts
ansible.builtin.debug:
var: ansible_facts
$ ansible-playbook facts.yml
PLAY [db] ***********************************************************************************************************************************************************************************************************************************
TASK [Print all facts] **********************************************************************************************************************************************************************************************************************
ok: [tnode3] => {
"ansible_facts": {
"all_ipv4_addresses": [
"10.0.2.15",
"10.10.1.13"
],
"all_ipv6_addresses": [
"fd17:625c:f037:2:a00:27ff:fe6f:16b4",
"fe80::a00:27ff:fe6f:16b4",
"fe80::a00:27ff:fec1:3efc"
],
"ansible_local": {},
"apparmor": {
"status": "disabled"
},
"architecture": "x86_64",
"bios_date": "12/01/2006",
"bios_vendor": "innotek GmbH",
"bios_version": "VirtualBox",
"board_asset_tag": "NA",
"board_name": "VirtualBox",
"board_serial": "0",
"board_vendor": "Oracle Corporation",
"board_version": "1.2",
"chassis_asset_tag": "NA",
"chassis_serial": "NA",
"chassis_vendor": "Oracle Corporation",
"chassis_version": "NA",
"cmdline": {
"BOOT_IMAGE": "(hd0,msdos2)/boot/vmlinuz-5.14.0-570.52.1.el9_6.x86_64",
"console": "ttyS0,115200n8",
"no_timer_check": true,
"resume": "UUID=2635f2a2-b00d-4ea8-b7ae-83a0dbab13b1",
"ro": true,
"root": "UUID=857c800e-4079-4023-b9be-38c4dc944806"
},
"date_time": {
"date": "2026-01-18",
"day": "18",
"epoch": "1768671545",
"epoch_int": "1768671545",
"hour": "02",
"iso8601": "2026-01-17T17:39:05Z",
"iso8601_basic": "20260118T023905564860",
"iso8601_basic_short": "20260118T023905",
"iso8601_micro": "2026-01-17T17:39:05.564860Z",
"minute": "39",
"month": "01",
"second": "05",
"time": "02:39:05",
"tz": "KST",
"tz_dst": "KST",
"tz_offset": "+0900",
"weekday": "Sunday",
"weekday_number": "0",
"weeknumber": "02",
"year": "2026"
},
"default_ipv4": {
"address": "10.0.2.15",
"alias": "enp0s3",
"broadcast": "10.0.2.255",
"gateway": "10.0.2.2",
"interface": "enp0s3",
"macaddress": "08:00:27:6f:16:b4",
"mtu": 1500,
"netmask": "255.255.255.0",
"network": "10.0.2.0",
"prefix": "24",
"type": "ether"
},
.... <중략> ....
"processor_cores": 2,
"processor_count": 1,
"processor_nproc": 2,
"processor_threads_per_core": 1,
"processor_vcpus": 2,
"product_name": "VirtualBox",
"product_serial": "VirtualBox-1741655f-ab00-4384-9aba-2fa3bd5cec6a",
"product_uuid": "5f654117-00ab-8443-9aba-2fa3bd5cec6a",
"product_version": "1.2",
"python": {
"executable": "/usr/bin/python3",
"has_sslcontext": true,
"type": "cpython",
"version": {
"major": 3,
"micro": 21,
"minor": 9,
"releaselevel": "final",
"serial": 0
},
"version_info": [
3,
9,
21,
"final",
0
]
},
"python_version": "3.9.21",
"real_group_id": 0,
"real_user_id": 0,
"selinux": {
"config_mode": "permissive",
"mode": "permissive",
"policyvers": 33,
"status": "enabled",
"type": "targeted"
},
"selinux_python_present": true,
"service_mgr": "systemd",
"ssh_host_key_ecdsa_public": "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGPshAekxOswu/JODuLJjSH6xr8XTV/HPnnNhle8uCRLOKIBQFDd0AtdFYpjSVO7U2APoNuwzWy0419qz6ftNC0=",
"ssh_host_key_ecdsa_public_keytype": "ecdsa-sha2-nistp256",
"ssh_host_key_ed25519_public": "AAAAC3NzaC1lZDI1NTE5AAAAIEWg0xPy7I/ESDGi6VpaQ1sTPpjxN0I2w/50a5rHwDm9",
"ssh_host_key_ed25519_public_keytype": "ssh-ed25519",
"ssh_host_key_rsa_public": "AAAAB3NzaC1yc2EAAAADAQABAAABgQCUlVAW8dXJHOVUIPotot1kKw5N3t9OOkn8z+UWWtCb9BJz8bshxz590cSxmxynbx+sNzPpF+h8JIirC7/AqKc4+gSWLm+SfyYV+zGZqmKf25rCic2bQ62hdtIk6liXOgfVuMvVWPeXM8L71jhKqQ27Zg9Mm4PwgIMVpMhc/jJkYbeZe5DGli4GoXmO33PTqA3MWY/hWKbhnCSIrkfCMOvQZX+4Gt+Xq+O1XZsvCWJ3Kspt1pxjpopg/vRaQi4Ke1CCbz46KRT1Oc37fUIpwkSEO5B4Ha+wkPJRc1CQwj7sJ4vQ4BCJbq7XUY2/4Q0Vei7TvT8RVK/+pmFgWcTrbNG2z1saKLAEFoADD2JhWPqTiXyQgKrZIyB0AnLfbW+Y2wM12d2ov3mWdV7NsCQpnlfvAGax01RkO0YrGv6kAJaafuxNqzDdcpCX4l5iSZp/mwMnYyBzrFbNJqizwKB3UBZLc+S8c4XllABAJIeBlZHeY0OSah5jlSXvOraLLUdLPZc=",
"ssh_host_key_rsa_public_keytype": "ssh-rsa",
"swapfree_mb": 3096,
"swaptotal_mb": 3096,
"system": "Linux",
"system_capabilities": [],
"system_capabilities_enforced": "False",
"system_vendor": "innotek GmbH",
"systemd": {
"features": "+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 -PWQUALITY +P11KIT -QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD -BPF_FRAMEWORK +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified",
"version": 252
},
"uptime_seconds": 48618,
"user_dir": "/root",
"user_gecos": "root",
"user_gid": 0,
"user_id": "root",
"user_shell": "/bin/bash",
"user_uid": 0,
"userspace_architecture": "x86_64",
"userspace_bits": "64",
"virtualization_role": "guest",
"virtualization_tech_guest": [
"virtualbox"
],
"virtualization_tech_host": [],
"virtualization_type": "virtualbox"
}
}
PLAY RECAP **********************************************************************************************************************************************************************************************************************************
tnode3 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Ansible 팩트의 값을 활용하고 싶으면 아래와 같이 하면 된다. 예를 들어 IPv4 주소를 출력하고 싶다고 하면...
$ cat facts-ipv4.yml
---
- hosts: db
tasks:
- name: Print all facts
ansible.builtin.debug:
msg: >
The default IPv4 address of {{ ansible_facts.hostname }}
is {{ ansible_facts.default_ipv4.address }}
$ ansible-playbook facts-ipv4.yml
PLAY [db] ***********************************************************************************************************************************************************************************************************************************
TASK [Print all facts] **********************************************************************************************************************************************************************************************************************
ok: [tnode3] => {
"msg": "The node's host name is tnode3 and the ip is 10.0.2.15\n"
}
PLAY RECAP **********************************************************************************************************************************************************************************************************************************
tnode3 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
위와 같이 출력이 된다. ansible_facts.default_ipv4.address 를 통해서 접근할 수 있게 된다.
루프
루프는 플레이북 yml 파일을 작성할 때 귀찮은 작업을 줄여주기 위해서 변수 등을 통해 특정 작업을 반복하도록 하는 것이다. 예를 들어보자.
$ cat loop.yaml
---
- hosts: all
vars:
services:
- vboxadd-service # ssh
- rsyslog
tasks:
- name: Check sshd and rsyslog state
ansible.builtin.service:
name: "{{ item }}"
state: started
loop: "{{ services }}"
위 yml 파일의 경우 services라는 변수를 vboxadd-service, rsyslog로 vars에 저장해두었다. 그러면 name: "{{ item }}" 의 item 부분에 차례로 vboxadd-service, rsyslog가 대입되어 실행된다.
조건문
when절을 위에서도 잠깐 소개했었다. 조건문을 변수를 통해서도 아래와 같이 실행해볼 수 있다.
$ cat when.yml
---
- hosts: localhost
vars:
run_my_task: true
tasks:
- name: echo message
ansible.builtin.shell: "echo test"
when: run_my_task
register: result
- name: Show result
ansible.builtin.debug:
var: result
위 플레이북 yml을 해석해보면 run_my_task가 true일 경우에만 shell "echo test"를 실행하는 것이다. 그리고 결과를 result에 저장 하여 결과를 출력한다.
PLAY [localhost] ****************************************************************************************************************************************************************************************************************************
TASK [Print all facts] **********************************************************************************************************************************************************************************************************************
ok: [localhost] => {
"ansible_local": {
"my-custom": {
"packages": {
"db_package": "mariadb-server",
"web_package": "httpd"
},
"users": {
"user1": "ansible",
"user2": "gasida"
}
}
}
}
PLAY RECAP **********************************************************************************************************************************************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
root@server:~/my-ansible# vi when.yml
$ ansible-playbook when.yml
PLAY [localhost] ****************************************************************************************************************************************************************************************************************************
TASK [echo message] *************************************************************************************************************************************************************************************************************************
changed: [localhost]
TASK [Show result] **************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
"result": {
"changed": true,
"cmd": "echo test",
"delta": "0:00:00.015129",
"end": "2026-01-18 13:49:13.705687",
"failed": false,
"msg": "",
"rc": 0,
"start": "2026-01-18 13:49:13.690558",
"stderr": "",
"stderr_lines": [],
"stdout": "test",
"stdout_lines": [
"test"
]
}
}
PLAY RECAP **********************************************************************************************************************************************************************************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
result 변수를 확인할 수 있다. 물론 run_my_task를 false로 수정 수 실행하면 echo가 실행이 안된다.
$ cat when.yml
---
- hosts: localhost
vars:
run_my_task: false
tasks:
- name: echo message
ansible.builtin.shell: "echo test"
when: run_my_task
register: result
- name: Show result
ansible.builtin.debug:
var: result
$ ansible-playbook when.yml
PLAY [localhost] ****************************************************************************************************************************************************************************************************************************
TASK [echo message] *************************************************************************************************************************************************************************************************************************
skipping: [localhost]
TASK [Show result] **************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
"result": {
"changed": false,
"false_condition": "run_my_task",
"skip_reason": "Conditional result was False",
"skipped": true
}
}
PLAY RECAP **********************************************************************************************************************************************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
참고로 when 조건절에 아래와 같이 조건 연산자를 통해서 조건을 부여할 수도 있다.
| ansible_facts[’machine’] == “x86_64” | ansible_facts[’machine’] 값이 x86_64와 같으면 true |
| max_memory == 512 | max_memory 값이 512와 같다면 true |
| min_memory < 128 | min_memory 값이 128보다 작으면 true |
| min_memory > 256 | min_memory 값이 256보다 크면 true |
| min_memory <= 256 | min_memory 값이 256보다 작거나 같으면 true |
| min_memory >= 512 | min_memory 값이 512보다 크거나 같으면 true |
| min_memory != 512 | min_memory 값이 512와 같지 않으면 true |
| min_memory is defined | min_memory 라는 변수가 있으면 true |
| min_memory is not defined | min_memory 라는 변수가 없으면 true |
| memory_available | memory 값이 true이며 true, 이때 해당 값이 1이거나 True 또는 yes면 true |
| not memory_available | memory 값이 false이며 true, 이때 해당 값이 0이거나 False 또는 no면 true |
| ansible_facts[’distribution’] in supported_distros | ansible_facts[’distribution’]의 값이 supported_distros 라는 변수에 있으면 true |
아래는 "in"에 대한 예시이다.
$ cat check-os.yml
---
- hosts: all
vars:
supported_distros:
- Ubuntu
- CentOS
tasks:
- name: Print supported os
ansible.builtin.debug:
msg: "This {{ ansible_facts['distribution'] }} need to use apt"
when: ansible_facts['distribution'] in supported_distros
$ ansible-playbook check-os.yml
PLAY [all] **********************************************************************************************************************************************************************************************************************************
TASK [Print supported os] *******************************************************************************************************************************************************************************************************************
ok: [tnode1] => {
"msg": "This Ubuntu need to use apt"
}
skipping: [tnode3]
ok: [tnode2] => {
"msg": "This Ubuntu need to use apt"
}
PLAY RECAP **********************************************************************************************************************************************************************************************************************************
tnode1 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
tnode2 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
tnode3 : ok=0 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
'Kubernetes' 카테고리의 다른 글
| 워커 노드 Join 하기 (0) | 2026.01.25 |
|---|---|
| kubeadm으로 k8s 구성하기 (0) | 2026.01.25 |
| Ansible: 에이전트 없이 완성하는 자동화 (0) | 2026.01.18 |
| On-Premise K8s Hands-on Study 1주차 (1) | 2026.01.11 |




