본문 바로가기

리눅스

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

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