Ansible é uma excelente ferramenta para automatização de tarefas.
Cria-se uma lista de computadores e instalando neles um servidor SSH e Python 3, é possível automatizar a instalação de programas, alteração de configurações e, o meu favorito, atualização dos computadores.
No entanto, há coisas que são diferentes de um sistema para outro, por exemplo caminhos de arquivos de configuração e nomes de pacotes.
Para evitar criar várias e várias tarefas que fazem a mesma coisa
ajustadas para cada sistema (when: ansible_distribution == ...
),
enchendo o playbook com código repetido, Ansible permite a importação
de arquivos de variáveis com o módulo include_vars
, onde podemos
escolher dinamicamente o arquivo de variáveis correspondente ao sistema.
Então podemos criar um arquivo para cada um dos sistemas em uso e seguir em frente. Porém isso acaba por se tornar um pesadelo de manutenção: cada nova variável precisa ser adicionada em TODOS os arquivos de variáveis e, ao criar um arquivo de variáveis novo, é preciso atualizar todas as variáveis possíveis.
Uma alternativa interessante seria uma criar estrutura hierárquica, onde definimos valores padrão para todos, em seguida substituímos com os valores para a família, então com os valores para a distribuição e quem sabe até com valores para certas versões.
Padrão default
/ \
Família Debian FreeBSD
/ \
Distro Debian Ubuntu
Além disso, é importante que a inexistência de algum desses arquivos de especialização não seja um empecilho.
Com um pouco de pesquisa e um pouco de tentativa-e-erro, e com "um pouco" quero dizer interminável, cheguei no código abaixo:
# Arquivo: tasks/default-tasks.yml
---
- name: Carrega variáveis padrão, da família e da distro
ansible.builtin.include_vars: "{{ item }}"
with_fileglob:
- vars/default.yml
- vars/family_{{ ansible_os_family }}.yml
- vars/distro_{{ ansible_distribution }}.yml
Usamos include_vars
, como de costume, porém junto com with_fileglob
.
Este geralmente é usado para encontrar vários
arquivos usando coringas (wildcards) como vars/*.yml
.
Mas aqui não usamos coringas, damos direto o nome do arquivo.
Se o arquivo não é encontrado ele é ignorado.
Abaixo estão exemplos dos arquivos de variáveis padrão e especializado.
# Arquivo: vars/default.yml
---
doas_config_file: /etc/doas.conf
# Arquivo: vars/family_FreeBSD.yml
---
doas_config_file: /usr/local/etc/doas.conf