기본 및 와일드카드 패턴으로 호스트 선택하기
이 단계에서는 Ansible 자동화에서 특정 호스트를 대상으로 하는 기본 사항을 배우게 됩니다. 이 과정의 핵심은 관리하는 서버 목록을 제공하는 Ansible 인벤토리 파일과 플레이북 내의 hosts 지시문으로, 이 지시문은 특정 작업 세트가 실행되어야 하는 서버를 지정합니다. Ansible 을 설치하고, 기본 인벤토리 및 플레이북을 생성한 다음, 그룹 이름과 와일드카드 패턴을 사용하여 호스트를 선택하는 방법을 살펴보겠습니다.
먼저 환경에 Ansible 이 설치되어 있는지 확인합니다. Ansible 은 기본적으로 설치되어 있지 않으므로 DNF 패키지 관리자를 사용하여 설치해야 합니다. ansible-core 패키지는 ansible-playbook을 포함한 필수 Ansible 명령줄 도구를 제공합니다. 다음 명령을 실행합니다.
sudo dnf install -y ansible-core
다음과 유사한 출력이 표시되어야 합니다.
...
Installed:
ansible-core-2.16.x-x.el9.x86_64
...
Complete!
다음으로, 파일을 정리하기 위해 이 연습을 위한 전용 디렉토리를 만듭니다. 이 단계의 모든 후속 작업은 이 새 디렉토리 내에서 수행됩니다.
mkdir -p ~/project/ansible_patterns
cd ~/project/ansible_patterns
이제 인벤토리 파일을 만듭니다. 인벤토리는 Ansible 명령, 모듈 및 작업이 작동하는 호스트 및 호스트 그룹을 정의하는 텍스트 파일입니다. 단순성을 위해 INI 형식을 사용합니다.
nano 편집기를 사용하여 inventory라는 파일을 만듭니다.
nano inventory
inventory 파일에 다음 내용을 추가합니다. 이 내용은 각각 두 개의 호스트를 포함하는 webservers와 dbservers라는 두 개의 그룹을 정의합니다.
[webservers]
web1.example.com
web2.example.com
[dbservers]
db1.lab.net
db2.lab.net
파일을 저장하고 Ctrl+X를 누른 다음 Y를 누르고 Enter를 눌러 nano를 종료합니다.
인벤토리가 준비되었으므로 간단한 플레이북을 만듭니다. 이 플레이북은 ansible.builtin.debug 모듈을 사용하여 메시지를 출력하고 작업이 실행되는 호스트를 확인합니다. 이는 시스템에 실제 변경을 가하지 않고 호스트 패턴을 테스트하는 좋은 방법입니다.
playbook.yml이라는 새 파일을 만듭니다.
nano playbook.yml
다음 YAML 내용을 추가합니다. 처음에는 webservers 그룹의 모든 호스트를 대상으로 합니다.
---
- name: Test Host Patterns
hosts: webservers
gather_facts: false
tasks:
- name: Display the inventory hostname
ansible.builtin.debug:
msg: "This task is running on {{ inventory_hostname }}"
편집기를 저장하고 종료합니다. 이제 ansible-playbook을 사용하여 플레이북을 실행합니다. -i 플래그는 사용자 지정 인벤토리 파일을 지정합니다.
ansible-playbook playbook.yml -i inventory
출력은 다음과 같아야 합니다.
PLAY [Test Host Patterns] ******************************************************
TASK [Display the inventory hostname] ******************************************
ok: [web1.example.com] => {
"msg": "This task is running on web1.example.com"
}
ok: [web2.example.com] => {
"msg": "This task is running on web2.example.com"
}
PLAY RECAP *********************************************************************
web1.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web2.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
보시다시피 webservers 그룹의 호스트만 대상으로 지정되었습니다. 이제 와일드카드 (*) 를 사용하도록 플레이북을 수정해 보겠습니다. 와일드카드를 사용하면 더 유연한 패턴 일치가 가능합니다.
playbook.yml을 편집하고 hosts 줄을 hosts: "*.lab.net"으로 변경합니다. 와일드카드가 포함된 패턴은 따옴표로 묶어야 함을 기억하십시오.
---
- name: Test Host Patterns
hosts: "*.lab.net"
gather_facts: false
tasks:
- name: Display the inventory hostname
ansible.builtin.debug:
msg: "This task is running on {{ inventory_hostname }}"
플레이북을 다시 실행합니다.
ansible-playbook playbook.yml -i inventory
다음과 유사한 출력이 표시되어야 합니다.
PLAY [Test Host Patterns] ******************************************************
TASK [Display the inventory hostname] ******************************************
ok: [db1.lab.net] => {
"msg": "This task is running on db1.lab.net"
}
ok: [db2.lab.net] => {
"msg": "This task is running on db2.lab.net"
}
PLAY RECAP *********************************************************************
db1.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
db2.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
이번에는 플레이가 .lab.net으로 끝나는 호스트에서만 실행되었습니다. 마지막으로 특수 키워드 all을 사용하여 인벤토리에 정의된 모든 호스트를 대상으로 지정해 보겠습니다.
playbook.yml을 마지막으로 편집하고 hosts 줄을 hosts: all로 변경합니다.
---
- name: Test Host Patterns
hosts: all
gather_facts: false
tasks:
- name: Display the inventory hostname
ansible.builtin.debug:
msg: "This task is running on {{ inventory_hostname }}"
결과를 보려면 플레이북을 실행합니다.
ansible-playbook playbook.yml -i inventory
출력에는 모든 호스트가 대상으로 지정되었음을 보여줍니다.
PLAY [Test Host Patterns] ******************************************************
TASK [Display the inventory hostname] ******************************************
ok: [web1.example.com] => {
"msg": "This task is running on web1.example.com"
}
ok: [web2.example.com] => {
"msg": "This task is running on web2.example.com"
}
ok: [db1.lab.net] => {
"msg": "This task is running on db1.lab.net"
}
ok: [db2.lab.net] => {
"msg": "This task is running on db2.lab.net"
}
PLAY RECAP *********************************************************************
db1.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
db2.lab.net : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web1.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web2.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
플레이북이 이제 인벤토리의 네 호스트 모두에서 실행되어 all 패턴의 강력함을 보여줍니다.