Como criar modelos no Ansible para criar configurações em nós gerenciados - Parte 7
Nesta Parte 7 da série Ansible, você aprenderá como criar e usar modelos no Ansible para criar configurações personalizadas em nós gerenciados. A modelagem no Ansible é uma maneira fácil e amigável de enviar configurações personalizadas para nós gerenciados que executam sistemas diferentes com edição mínima de arquivos do playbook.
O que é modelagem no Ansible?
Para ter uma ideia melhor do que é um modelo, vamos considerar um gerente de TI redigindo um e-mail para convidar seu departamento para um coquetel. O e-mail é enviado a cada um dos membros e também os convida a acompanhar seus cônjuges.
O e-mail foi customizado de forma que o corpo do e-mail permaneça o mesmo, mas os destinatários e os nomes dos respectivos cônjuges variam. O e-mail passa a ser o modelo, enquanto os destinatários e respectivos cônjuges são variáveis.
Esse foi um exemplo genérico. Ansible usa Jinja2, que é um mecanismo de modelagem moderno para estruturas Python usado para gerar conteúdo ou expressões dinâmicas. A modelagem é extremamente útil ao criar arquivos de configuração personalizados para vários servidores, mas exclusivos para cada um deles.
Jinja2 usa chaves duplas {{ ... }}
para incluir uma variável que foi definida. Para comentários, use {{# #}
e para instruções condicionais use {% … %}
.
Vamos supor que você tenha um modelo de dados de VLANs em sua rede com sistemas host que deseja enviar para suas respectivas VLANs, conforme mostrado.
vlans:
- id: 10
name: LB
- id: 20
name: WB_01
- id: 30
name: WB_02
- id: 40
name: DB
Para renderizar esta configuração, o modelo jinja2 correspondente chamado vlans.j2 apareceria conforme mostrado. Como você pode ver, as variáveis vlan.id e vlan.name foram colocadas entre chaves.
vlan {{ vlan.id }}
name {{ vlan.name }}
Juntando tudo em um manual que coloca diferentes máquinas host, isso apareceria conforme mostrado:
- hosts
tasks:
- name: Rendering VLAN configuration
template:
src: vlans.j2
dest: "vlan_configs/{{ inventory_hostname }}.conf"
Exemplo 1: configurando servidores Web em diferentes distros
Neste exemplo, criaremos arquivos index.html que exibirão informações sobre o nome do host e o sistema operacional de 2 servidores web executando CentOS e Ubuntu .
Configurar
Ubuntu 18 - IP address: 173.82.202.239
CentOS 7 - IP address: 173.82.115.165
O servidor web Apache já foi instalado em ambos os servidores.
Para CentOS 7
Para Ubuntu 18.04
Então, vamos criar um manual test_server.yml conforme mostrado:
---
- hosts: all
become: yes
tasks:
- name: Install index.html
template:
src: index.html.j2
dest: /var/www/html/index.html
mode: 0777
Nosso modelo de arquivo Jinja é index.html.j2, que será enviado para o arquivo index.html em cada servidor web. Lembre-se sempre de colocar a extensão .j2
no final para indicar que é um arquivo jinja2.
Vamos agora criar o arquivo de modelo index.html.j2.
<html>
<center>
<h1> The hostname of this webserver is {{ ansible_hostname }}</h1>
<h3> It is running on {{ ansible_os_family}}system </h3>
</center>
</html>
Este modelo é um arquivo HTML básico onde ansible_hostname e ansible_os_family são variáveis integradas que serão substituídas pelos respectivos nomes de host e sistemas operacionais dos servidores web individuais no navegador.
Agora, vamos executar o manual.
ansible-playbook test_server.yml
Agora vamos recarregar as páginas da web para os servidores CentOS 7 e Ubuntu.
Para CentOS 7
Para Ubuntu 18.04
Como você pode ver, diferentes informações sobre o nome do host e a família do sistema operacional foram exibidas em cada servidor. E é assim que o modelo Jinja2 é legal!
FILTROS:
Às vezes, você pode decidir substituir o valor de uma variável por uma string que aparece de uma determinada maneira.
Exemplo 1: fazer strings aparecerem em letras maiúsculas/minúsculas
Por exemplo, no exemplo anterior, podemos decidir fazer com que as variáveis Ansible apareçam em letras maiúsculas. Para fazer isso, anexe o valor superior à variável. Desta forma o valor da variável é convertido para o formato Maiúsculas.
{{ ansible_hostname | upper }} => CENTOS 7
{{ ansible_os_family | upper }} => REDHAT
Da mesma forma, você pode converter a saída da string em minúsculas anexando o argumento inferior.
{{ ansible_hostname | lower }} => centos 7
{{ ansible_os_family | lower }} => redhat
Exemplo 2: Substitua uma String por Outra
Além disso, você pode substituir uma string por outra.
Por exemplo:
O título do filme é {{ movie_name }} =>
O título do filme é Ring.
Para substituir a saída por outra string, use o argumento replace conforme mostrado:
O título do filme é {{ movie_name | replace (“Ring“, ”Heist”) }} =>
O título do filme é Heist.
Exemplo 3: listas e conjuntos de filtros
Para recuperar o menor valor em uma matriz, use o filtro min.
{{ [ 2, 3, 4, 5, 6, 7 ] | min }} => 2
Da mesma forma, para recuperar o maior número, use o filtro max.
{{ [ 2, 3, 4, 5, 6, 7 ] | max }} => 7
Para exibir valores exclusivos, use o filtro único.
{{ [ 2, 3, 3, 2, 6, 7 ] | unique }} => 2, 3
Use o filtro aleatório para obter um número aleatório entre 0 e o valor.
{{ 50 | random }} => Some random number
ROTAÇÕES :
Assim como nas linguagens de programação, temos loops no Ansible Jinja2.
Por exemplo, para gerar um arquivo contendo uma lista de números use o loop for conforme mostrado no exemplo abaixo:
Exemplo 1:
{% for number in [0, 1, 2, 3, 4, 5, 6, 7] %}
{{ number }}
{% end for %}
Você também pode combinar o loop for com instruções if-else para filtrar e obter determinados valores.
Exemplo 2:
{% for number in [0, 1, 2, 3, 4, 5, 6, 7] %}
{% if number == 5 %}
{{ number }}
{% endif%}
{% endfor %}
E é isso nesta palestra. Junte-se a nós no próximo tópico onde nos aventuraremos a trabalhar com variáveis e fatos ansible.