ANSIBLE SERIES: h.t.wrt* … ROLES: a DNS example (/etc/resolv.conf)
Olá, de novo! Hoje teremos um conteúdo um pouco mais leve, digamos assim: serão apenas comandos, capturas de tela e breves explanações 😬 Sem tanta teoria, e sim mão-na-massa. Todos de acordo? 🙄 Então vem comigo 😁
>_ ANSIBLE-GALAXY INIT [NAME.YOUR.ROLE.HERE]
Quando se instala o ANSIBLE pela primeira vez em uma máquina, por padrão o mesmo já acompanha diversos utilitários em linha de comando, esses que na prática são ferramentas embarcadas, e que estão sempre prontas para uso imediato (ex: ansible-playbook
, ansible-doc
, ansible-vault
, ansible-config
, ansible-pull
). Sabendo disso, vamos tirar vantagem e ao invés de criar o esqueleto de pastas “na unha”, ou seja, utilizando o comando mkdir
, execute o seguinte comando no terminal:
ansible-galaxy init resolv.conf

E veja o resultado com este outro:
tree roles/resolv.conf

Pois é, exatamente. Criamos uma árvore inteira de diretórios e arquivos para o ANSIBLE com apenas uma instrução … Legal né?
Embora pareça que somos obrigados a editar e preencher cada um destes itens, para que a ROLE em questão funcione apropriadamente, a verdade é que não. E a melhor parte, nesse nosso caso em específico, mexeremos somente com três arquivos. São eles: handlers/main.yml
, tasks/main.yml
e templates/resolv.conf.j2
>_ TASKS/MAIN.YML
Para gerenciar o arquivo /etc/resolv.conf
com o Ansible, primeiro impeça que o NetworkManager o faça antes de você. Use o módulo nativo ini_file
, definindo o parâmetro obrigatório dns=none
na seção [main]
:

---
- name: make sure line 'dns=none' is set in /etc/NetworkManager/NetworkManager.conf
ini_file:
path: /etc/NetworkManager/NetworkManager.conf
state: present
no_extra_spaces: yes
section: main
option: dns
value: none
owner: root
group: root
mode: 0644
backup: yes
notify:
- reload NetworkManager

A segunda tarefa usa o módulo template
para criar a nova configuração a partir do conteúdo de roles/resolv.conf/templates/resolv.conf.j2
e colocá-la em /etc/resolv.conf
no nó de destino:
---
- name: deploy resolv.conf template
template:
src: roles/resolv.conf/templates/resolv.conf.j2
dest: /etc/resolv.conf
owner: root
group: root
mode: 0644
backup: yes
notify:
- reload NetworkManager

>_ HANDLERS/MAIN.YML
Os handlers
são usados para disparar ações que são executadas apenas se uma tarefa fizer alterações no nó de destino. Esses manipuladores
são processados apenas no final de um playbook e executados apenas uma vez, mesmo que tenham sido notificados de alterações por várias tarefas.
No exemplo descrito aqui, o manipulador chamado reload NetworkManager
executa a tarefa definida, mas somente se uma das duas tarefas (ou ambas) de tasks/main.yml
levou a uma alteração no nó de destino:

# cat resolv.conf/handlers/main.yml
---
- name: reload NetworkManager
service:
name: NetworkManager
state: reloaded
Observe que os manipuladores não são executados até que todas as tarefas tenham sido processadas com êxito. Em alguns casos, esse fato pode dificultar a solução de problemas.
>_ TEMPLATES/RESOLV.CONF.J2
Abra um editor de texto, e em seguida, copie e cole:

vim roles/resolv.conf/templates/resolv.conf.j2
### Managed by ANSIBLE Sysadmin
# Cloudflare DNS
1.1.1.1
# Google DNS
8.8.8.8
Salve, feche e prepare as máquinas alvo, deixando-as ligada ou iniciando as mesmas … Tudo isso para posteriormente executarmos o playbook teste …
>_ ROLES/TEST.YML
Reta final, crie um arquivo chamado test.yml
dentro da pasta roles/resolv.conf

vim roles/resolv.conf/test.yml
Novamente, copie e cole o seguinte conteúdo:

---
hosts: all
become: yes
- tasks:
- name: ROLE <> configuring the DNS servers...
roles:
- resolv.conf
Por último, execute o teste e depois confira se tudo ocorreu bem:

sudo ansible-playbook -i tests/inventory tests/test.yml

TE VEJO NA PRÓXIMA 😌 ATÉ MAIS!
>_ REFERÊNCIAS:
https://www.redhat.com/sysadmin/dns-configuration-ansible
https://docs.ansible.com/ansible/latest/collections/community/general/ini_file_module.html
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/template_module.html
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/copy_module.html
[…] que já sabemos como escrever nossas próprias roles (você pode conferir aqui e aqui), será que não existe um meio mais fácil de disponibilizá-las para outras pessoas? Sim! E o seu […]