Selecionando Hosts com Padrões Básicos e de Curinga
Nesta etapa, você aprenderá os fundamentos de como direcionar hosts específicos em sua automação Ansible. O cerne disso é o arquivo de inventário Ansible, que lista os servidores que você gerencia, e a diretiva hosts dentro de um playbook, que especifica em quais desses servidores um conjunto de tarefas deve ser executado. Começaremos instalando o Ansible, criando um inventário e um playbook básicos e, em seguida, exploraremos como selecionar hosts usando nomes de grupos e padrões de curinga (wildcard).
Primeiro, vamos garantir que o Ansible esteja instalado em seu ambiente. O Ansible não vem instalado por padrão, portanto, você precisa instalá-lo usando o gerenciador de pacotes DNF. O pacote ansible-core fornece as ferramentas essenciais de linha de comando do Ansible, incluindo ansible-playbook. Execute o seguinte comando:
sudo dnf install -y ansible-core
Você deverá ver uma saída semelhante a esta:
...
Installed:
ansible-core-2.16.x-x.el9.x86_64
...
Complete!
Em seguida, vamos criar um diretório dedicado para este exercício para manter nossos arquivos organizados. Todas as ações subsequentes nesta etapa ocorrerão dentro deste novo diretório:
mkdir -p ~/project/ansible_patterns
cd ~/project/ansible_patterns
Agora, crie um arquivo de inventário. Um inventário é um arquivo de texto que define os hosts e grupos de hosts sobre os quais os comandos, módulos e tarefas Ansible operam. Usaremos o formato INI por sua simplicidade.
Use o editor nano para criar um arquivo chamado inventory:
nano inventory
Adicione o seguinte conteúdo ao arquivo inventory. Isso define dois grupos, webservers e dbservers, cada um contendo dois hosts:
[webservers]
web1.example.com
web2.example.com
[dbservers]
db1.lab.net
db2.lab.net
Salve o arquivo e saia do nano pressionando Ctrl+X, depois Y e Enter.
Com nosso inventário pronto, vamos criar um playbook simples. Este playbook usará o módulo ansible.builtin.debug para exibir uma mensagem, confirmando em qual host a tarefa está sendo executada. Esta é uma ótima maneira de testar padrões de host sem fazer nenhuma alteração real no sistema.
Crie um novo arquivo chamado playbook.yml:
nano playbook.yml
Adicione o seguinte conteúdo YAML. Inicialmente, ele direciona todos os hosts no grupo 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 }}"
Salve e saia do editor. Agora, execute o playbook usando ansible-playbook. A flag -i especifica nosso arquivo de inventário personalizado:
ansible-playbook playbook.yml -i inventory
A saída deve ser semelhante a esta:
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
Como você pode ver, apenas os hosts do grupo webservers foram direcionados. Agora, vamos modificar o playbook para usar um curinga (*). Curingas permitem uma correspondência de padrões mais flexível.
Edite playbook.yml e altere a linha hosts para hosts: "*.lab.net". Lembre-se de colocar padrões que contenham curingas entre aspas:
---
- 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 }}"
Execute o playbook novamente:
ansible-playbook playbook.yml -i inventory
Você deverá ver uma saída semelhante a esta:
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
Desta vez, o play foi executado apenas em hosts cujos nomes terminam com .lab.net. Finalmente, vamos usar a palavra-chave especial all para direcionar todos os hosts definidos no inventário.
Edite playbook.yml uma última vez e altere a linha hosts para 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 }}"
Execute o playbook para ver o resultado:
ansible-playbook playbook.yml -i inventory
A saída mostrará todos os hosts sendo direcionados:
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
O playbook agora é executado em todos os quatro hosts do seu inventário, demonstrando o poder do padrão all.