** 서종호(가시다)님의 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
Posted by 빛나유
,