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
Figura 01.

E veja o resultado com este outro:

tree roles/resolv.conf
Figura 02.

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]:

Figura 03.
---
- 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
Figura 04.

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
Figura 05.

>_ 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:

Figura 06.
# 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:

Figura 07.
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

Figura 08.
vim roles/resolv.conf/test.yml

Novamente, copie e cole o seguinte conteúdo:

Figura 09.
---
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:

Figura 10.
sudo ansible-playbook -i tests/inventory tests/test.yml
Figura 11.

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

1 Comment

Deixe uma resposta

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.