Pesquisa de site

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.