No Ansible, variáveis e fatos, juntamente com modelos, são ferramentas fundamentais para a criação de fluxos de trabalho de automação flexíveis. As variáveis permitem gerenciar e alterar suas configurações dinamicamente. Os fatos são um subconjunto especial de variáveis que o Ansible coleta dos sistemas remotos, fornecendo informações específicas do contexto.
Os modelos permitem a geração de arquivos de configuração orientados por variáveis, tornando seus playbooks adaptáveis a ambientes e cenários variados.
Essas ferramentas tornam os playbooks reutilizáveis e adaptáveis, permitindo evitar valores codificados e possibilitando a personalização para diferentes ambientes.
As variáveis permitem que os parâmetros sejam modificados sem alterar a lógica central do manual.
Booleano: valores verdadeiros ou falsos.
Lista: uma coleção ordenada de itens.
Dicionário: Pares de valores-chave para estruturas de dados complexas.
Variáveis registradas: captura a saída de tarefas para usar posteriormente em seu playbook.
Fatos: Variáveis coletadas automaticamente que fornecem detalhes sobre os sistemas remotos que você está gerenciando.
NB: Evite conflitos em nomes de variáveis usando notação de colchetes.
- name: Print the distribution of the target hosts: all vars: curr_time: "{{ now() }}" tasks: - name: Distro Check ansible.builtin.debug: msg: "The target system is {{ ansible_facts['distribution'] }}. Timestamp: {{ curr_time }}"
Os modelos no Ansible usam a linguagem de modelagem Jinja2 para criar arquivos dinamicamente usando interpolação de variáveis, loops e condicionais.
- name: Write distro name hosts: all tasks: - name: Write distro name ansible.builtin.template: src: distro.j2 dest: /root/distro.txt mode: '644' # src: location of jinja2 template file # dest: location it will be copied to # permissions that will be granted to the file
Usaremos a família de sistemas operacionais para determinar se devemos instalar o NGINX do Lighttpd e, em seguida, implantaremos uma página inicial personalizada no host remoto contendo NGINX, tudo sem nomes de host codificados.
git clone https://github.com/perplexedyawdie/ansible-learn.git
2. Mude o diretório para fatos e modelos
cd ansible-learn/facts-and-templates
3. Aumente o ambiente usando docker-compose
docker compose up -d --build
4. SSH no servidor Ansible
ssh -o StrictHostKeyChecking=no -o NoHostAuthenticationForLocalhost=yes root@localhost -p 2200 # password: test123
5. Crie um manual chamado server_setup.yaml
. Aqui, configuraremos o NGINX e o Lighttpd e, em seguida, exibiremos o nome da distribuição para cada host remoto.
- name: Install NGINX on Debian & Lighttpd on RedHat hosts: all vars: dev1: "Debian" dev2: "RedHat" tasks: - name: Install NGINX for Debian-based systems ansible.builtin.apt: name: nginx state: present when: ansible_facts['os_family'] == dev1 - name: Install Lighttpd for RedHat-based systems ansible.builtin.yum: name: lighttpd state: present when: ansible_facts['os_family'] == dev2 - name: Display the distribution ansible.builtin.debug: msg: "The server is running {{ ansible_facts['distribution'] }}"
6. Execute ansible-lint.
ansible-lint server_setup.yaml
7. Execute o manual.
ansible-playbook --key-file /root/.ssh/id_rsa_ansible -u root -i inventory.yaml server_setup.yaml
8. Confirme se a configuração foi bem-sucedida.
ssh -i /root/.ssh/id_rsa_ansible root@server3 nginx -V ssh -i /root/.ssh/id_rsa_ansible root@server2 lighttpd -v ssh -i /root/.ssh/id_rsa_ansible root@server1 lighttpd -v
9. Crie um arquivo de modelo Jinja2 chamado index.html.j2
Ele será preenchido automaticamente com a família e distribuição do sistema operacional.
<html> <head> <title>Welcome to {{ ansible_facts['os_family'] }}</title> </head> <body> <h1>Server running on {{ ansible_facts['distribution'] }}</h1> </body> </html>
10. Crie um manual chamado custom_homepage.yaml.
Estamos implantando a página inicial personalizada criada acima no NGINX e reiniciando o servidor.
- name: Deploy Custom Homepage and restart hosts: all vars: dev1: "Debian" dev2: "RedHat" tasks: - name: Create Homepage with Jinja2 Template for NGINX ansible.builtin.template: src: index.html.j2 dest: /var/www/html/index.html mode: '644' when: ansible_facts['os_family'] == dev1 notify: restart nginx handlers: - name: Restart NGINX listen: "restart nginx" ansible.builtin.service: name: nginx state: restarted when: ansible_facts['os_family'] == dev1
11. Execute o linter.
ansible-lint custom_homepage.yaml
12. Execute o manual.
ansible-playbook --key-file /root/.ssh/id_rsa_ansible -u root -i inventory.yaml custom_homepage.yaml
13. Confirme a implantação visitando http://localhost:2203
no seu navegador.
Esforço incrível! 🙌 Aprendemos como usar variáveis e fatos em um manual e como criar arquivos dinâmicos usando modelos. A seguir, veremos a modularização e o tratamento de erros. Até lá, tome cuidado!