리눅스

Ansible에서 사용자 정의 팩트를 정의하고 사용하는 방법

변군Dev 2024. 1. 16. 11:18
728x90

Ansible에서 사용자 정의 팩트를 정의하고 사용하는 방법

사용자 정의 팩트를 정의하면 플레이북이나 템플릿에서 해당 변수를 사용하여 조건을 설정하거나 동적으로 값을 할당할 수 있습니다. 그룹 변수, 호스트 변수, /etc/ansible/facts.d 디렉토리 등이 있습니다.

node Server  
Control node control1  
Managed nodes centos7  
Managed nodes ubuntu22  

관리형 노드에서 facts.d 디렉토리 생성

sudo mkdir -p /etc/ansible/facts.d

facts 파일 생성

cat <<EOF | tee /etc/ansible/facts.d/test.fact
[web_server]
web_name=nginx
web_version=1.24.0
[was_server]
was_name=php-fpm
was_version=8.1.27
EOF
$ cat <<EOF | tee /etc/ansible/facts.d/test.fact
> [web_server]
> web_name=nginx
> web_version=1.24.0
> [was_server]
> was_name=php-fpm
> was_version=8.1.27
> EOF
[web_server]
web_name=nginx
web_version=1.24.0
[was_server]
was_name=php-fpm
was_version=8.1.27

제어 노드에서 사용자가 정의한 facts 변수를 ad-hoc 명령어로 확인

ansible -i inventory centos7 -m setup -a 'filter=ansible_local'
centos7 | SUCCESS => {
    "ansible_facts": {
        "ansible_local": {
            "test": {
                "was_server": {
                    "was_name": "php-fpm",
                    "was_version": "8.1.27"
                },
                "web_server": {
                    "web_name": "nginx",
                    "web_version": "1.24.0"
                }
            }
        },
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false
}
ansible -i inventory ubuntu22 -m setup -a 'filter=ansible_local'
ubuntu22 | SUCCESS => {
    "ansible_facts": {
        "ansible_local": {
            "test": {
                "was_server": {
                    "was_name": "php-fpm",
                    "was_version": "8.1.27"
                },
                "web_server": {
                    "web_name": "nginx",
                    "web_version": "1.24.0"
                }
            }
        },
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false
}

제어 노드에서 사용자가 정의한 facts 변수를 플레이북으로 확인

플레이북 작성

vim local_facts_get.yml
---
- name: 그룹 변수가 있는 플레이북 예제(Group Variables)
  hosts: zdocker
  gather_facts: true

  tasks:
    - name: Print local facts
      debug:
        msg: "{{ ansible_local }}"

    - name: "Web Server"
      debug:
        msg: "{{ ansible_local['test']['web_server']['web_name'] }} {{ ansible_local['test']['web_server']['web_version'] }}"

    - name: "Middleware Server"
      debug:
        msg: "{{ ansible_local.test.was_server.was_name }} {{ ansible_local.test.was_server.was_version }}"


### Ansible Playbook Execute
# ansible-inventory -i inventory --graph
#
# ansible-playbook -i inventory tmp/ansible_local.yml

플레이북 실행

ansible-playbook -i inventory tmp/local_facts_get.yml
$ ansible-playbook -i inventory tmp/local_facts_get.yml
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details

PLAY [그룹 변수가 있는 플레이북 예제(Group Variables)] ****************************************************************

TASK [Gathering Facts] *********************************************************************************************
ok: [ubuntu22]
ok: [centos7]

TASK [Print local facts] *******************************************************************************************
ok: [centos7] => {
    "msg": {
        "test": {
            "was_server": {
                "was_name": "php-fpm",
                "was_version": "8.1.27"
            },
            "web_server": {
                "web_name": "nginx",
                "web_version": "1.24.0"
            }
        }
    }
}
ok: [ubuntu22] => {
    "msg": {
        "test": {
            "was_server": {
                "was_name": "php-fpm",
                "was_version": "8.1.27"
            },
            "web_server": {
                "web_name": "nginx",
                "web_version": "1.24.0"
            }
        }
    }
}

TASK [Web Server] **************************************************************************************************
ok: [centos7] => {
    "msg": "nginx 1.24.0"
}
ok: [ubuntu22] => {
    "msg": "nginx 1.24.0"
}

TASK [Middleware Server] *******************************************************************************************
ok: [centos7] => {
    "msg": "php-fpm 8.1.27"
}
ok: [ubuntu22] => {
    "msg": "php-fpm 8.1.27"
}

PLAY RECAP *********************************************************************************************************
centos7                    : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
ubuntu22                   : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

제어 노드에서 사용자가 정의한 facts 변수를 정의하고 확인하는 플레이북

플레이북 작성

vim local_facts_set.yml
---
- name: 예제 플레이북 (그룹 변수 포함)
  hosts: zdocker
  become: yes
  gather_facts: true

  tasks:
    - name: Create facts directory
      file:
        state: directory
        dest: "/etc/ansible/facts.d/"
        recurse: yes
      tags: debug_facts_set

    - name: Create facts file
      file:
        state: touch
        dest: "/etc/ansible/facts.d/test.fact"
      tags: debug_facts_set

    - name: Edit facts file
      copy:
        content: |
          [web_server]
          web_name=nginx
          web_version=1.24.0
          [was_server]
          was_name=php-fpm
          was_version=8.1.27
          [cache_server]
          cache_name=redis
          cache_version=6.1.27
        dest: "/etc/ansible/facts.d/test.fact"
      tags: debug_facts_set

    - name: Print local facts
      debug:
        msg: "{{ ansible_local | safe }}"
      tags: debug_facts_get

    - name: "Web Server"
      debug:
        msg: "{{ ansible_local['test']['web_server']['web_name'] }} {{ ansible_local['test']['web_server']['web_version'] }}"
      tags: debug_facts_get

    - name: "Middleware Server"
      debug:
        msg: "{{ ansible_local.test.was_server.was_name }} {{ ansible_local.test.was_server.was_version }}"
      tags: debug_facts_get

    - name: "Cache Server"
      debug:
        msg: "{{ ansible_local.test.cache_server.cache_name }} {{ ansible_local.test.cache_server.cache_version }}"
      tags: debug_facts_get

플레이북 실행

ansible-playbook -i inventory tmp/local_facts_set.yml
$ ansible-playbook -i inventory tmp/local_facts_set.yml
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details

PLAY [예제 플레이북 (그룹 변수 포함)] *******************************************************************************

TASK [Gathering Facts] **********************************************************************************************
ok: [ubuntu22]
ok: [centos7]

TASK [Create facts directory] ***************************************************************************************
ok: [ubuntu22]
ok: [centos7]

TASK [Create facts file] ********************************************************************************************
changed: [ubuntu22]
changed: [centos7]

TASK [Edit facts file] **********************************************************************************************
ok: [ubuntu22]
ok: [centos7]

TASK [Print local facts] ********************************************************************************************
ok: [centos7] => {
    "msg": {
        "test": {
            "cache_server": {
                "cache_name": "redis",
                "cache_version": "6.1.27"
            },
            "was_server": {
                "was_name": "php-fpm",
                "was_version": "8.1.27"
            },
            "web_server": {
                "web_name": "nginx",
                "web_version": "1.24.0"
            }
        }
    }
}
ok: [ubuntu22] => {
    "msg": {
        "test": {
            "cache_server": {
                "cache_name": "redis",
                "cache_version": "6.1.27"
            },
            "was_server": {
                "was_name": "php-fpm",
                "was_version": "8.1.27"
            },
            "web_server": {
                "web_name": "nginx",
                "web_version": "1.24.0"
            }
        }
    }
}

TASK [Web Server] ***************************************************************************************************
ok: [centos7] => {
    "msg": "nginx 1.24.0"
}
ok: [ubuntu22] => {
    "msg": "nginx 1.24.0"
}

TASK [Middleware Server] ********************************************************************************************
ok: [ubuntu22] => {
    "msg": "php-fpm 8.1.27"
}
ok: [centos7] => {
    "msg": "php-fpm 8.1.27"
}

TASK [Cache Server] *************************************************************************************************
ok: [centos7] => {
    "msg": "redis 6.1.27"
}
ok: [ubuntu22] => {
    "msg": "redis 6.1.27"
}

PLAY RECAP **********************************************************************************************************
centos7                    : ok=8    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
ubuntu22                   : ok=8    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

 

728x90