paint-brush
Ansible 101: Trabalhando com fatos e modelospor@cloudkungfu
892 leituras
892 leituras

Ansible 101: Trabalhando com fatos e modelos

por cloud-kung-fu4m2024/01/30
Read on Terminal Reader

Muito longo; Para ler

Ansible utiliza variáveis, fatos e modelos para criar fluxos de trabalho de automação adaptáveis. As variáveis permitem o gerenciamento dinâmico da configuração, os fatos fornecem informações específicas do sistema e os modelos geram arquivos de configuração personalizáveis. Essa abordagem garante que os playbooks sejam reutilizáveis e flexíveis em diferentes ambientes.
featured image - Ansible 101: Trabalhando com fatos e modelos
cloud-kung-fu HackerNoon profile picture
0-item

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.

Variáveis e fatos

As variáveis permitem que os parâmetros sejam modificados sem alterar a lógica central do manual.

Como fatos, variáveis e modelos funcionam juntos

  • Tipos de variáveis:
    • 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 }}"

Modelos e arquivos

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

Prática

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.


  1. Clone o repositório.
 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

Variáveis e fatos

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

Modelos e arquivos

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.

Recapitular

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!