Pesquisa de site

Como trabalhar com variáveis e fatos Ansible - Parte 8


Mencionamos variáveis nesta série Ansible apenas para refrescar um pouco sua mente. Uma variável, assim como em muitas linguagens de programação, é essencialmente uma chave que representa um valor.

O que constitui um nome de variável válido?

Um nome de variável inclui letras, números, sublinhados ou uma combinação de 2 ou de todos eles. Porém, lembre-se que o nome de uma variável deve sempre começar com uma letra e não deve conter espaços.

Vejamos alguns exemplos de nomes de variáveis válidos e inaceitáveis:

Exemplos válidos de nomes de variáveis:

football 
foot_ball
football20 
foot_ball20

Exemplos de nomes de variáveis inválidos:

foot ball
20 
foot-ball

Vamos discutir os tipos de variáveis:

1. Variáveis do manual

As variáveis do Playbook são bastante fáceis e diretas. Para definir uma variável em um manual, basta usar a palavra-chave vars antes de escrever suas variáveis com indentação.

Para acessar o valor da variável, coloque-o entre as chaves duplas entre aspas.

Aqui está um exemplo simples de manual:

- hosts: all
  vars:
    greeting: Hello world! 

  tasks:
  - name: Ansible Basic Variable Example
    debug:
      msg: "{{ greeting }}"

No playbook acima, a variável greeting é substituída pelo valor Hello world! quando o playbook é executado. O playbook simplesmente imprime a mensagem Hello world! quando executado.

Além disso, você pode ter uma lista ou um array de variáveis conforme mostrado:

O manual abaixo mostra uma variável chamada continentes. A variável contém 5 valores diferentes – nomes de continentes. Cada um desses valores pode ser facilmente acessado usando o índice 0 como primeira variável.

O exemplo do manual abaixo recupera e exibe Ásia (Índice 1).

- hosts: all
  vars:
    continents:
      - Africa
      - Asia
      - South America
      - North America
      - Europe
      
  tasks:
  - name: Ansible List variable Example
    debug:
      msg: "{{ continents [1] }}"

A lista de variáveis pode ser estruturada de forma semelhante conforme mostrado:

vars:
    Continents: [Africa, Asia, South America, North America, Europe]

Para listar todos os itens da lista, use o módulo with_items. Isso percorrerá todos os valores da matriz.

- hosts: all
  vars:
    continents: [Africa, Asia, South America, North America, Europe]

  tasks:
  - name: Ansible array variables example
    debug: 
      msg: "{{ item }}"
    with_items:
      - "{{ continents }}"

Outro tipo de variável Ansible é a variável dicionário.

Variáveis de Dicionário também são suportadas no manual. Para definir a variável do dicionário, simplesmente identifique o par chave-valor logo abaixo do nome da variável do dicionário.

hosts: switch_f01

vars:
   http_port: 8080
   default_gateway: 10.200.50.1
   vlans:
       id: 10
       port: 2

No exemplo acima, vlans é a variável do dicionário enquanto id e port são os pares chave-valor.

hosts: switch_f01

vars:
   http_port: 8080
   default_gateway: 
   vlans:
      id: 10
      port: 20

 tasks:
   name: Configure default gateway
   system_configs:
   default_gateway_ip: “{{ default_gateway  }}“


   name: Label port on vlan 10
   vlan_config:
	vlan_id: “{{ vlans[‘id’]  }}“
     port_id: 1/1/ {{ vlans[‘port’]  }}

Para port_id, como estamos iniciando o valor com texto e não com a variável, não são necessárias aspas entre chaves.

2. Variáveis Especiais

Ansible fornece uma lista de variáveis predefinidas que podem ser referenciadas em modelos e manuais do Jinja2, mas não podem ser alteradas ou definidas pelo usuário.

Coletivamente, a lista de variáveis predefinidas do Ansible é chamada de fatos do Ansible e são coletadas quando um playbook é executado.

Para obter uma lista de todas as variáveis do Ansible, use o módulo setup no comando ad-hoc do Ansible conforme mostrado abaixo:

ansible -m setup hostname

Isso exibe a saída no formato JSON conforme mostrado:

ansible -m setup localhost

Na saída, podemos ver que alguns dos exemplos de variáveis especiais do Ansible incluem:

ansible_architecture
ansible_bios_date
ansible_bios_version
ansible_date_time
ansible_machine
ansible_memefree_mb
ansible_os_family
ansible_selinux

Existem muitas outras variáveis especiais do Ansible, estes são apenas alguns exemplos.

Essas variáveis podem ser usadas em um modelo Jinja2 conforme mostrado:

<html>
<center>
   <h1> The hostname of this webserver is {{ ansible_hostname }}</h1>
   <h3> It is running on {{ ansible_os_family}}system </h3>
</center>
</html>

3. Variáveis de estoque

Por último, na lista, temos variáveis de inventário Ansible. Um inventário é um arquivo no formato INI que contém todos os hosts que serão gerenciados pelo Ansible.

Nos inventários, você pode atribuir uma variável a um sistema host e usá-la posteriormente em um playbook.

[web_servers]

web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=ubuntu http_port=8080

O texto acima pode ser representado em um arquivo YAML do playbook, conforme mostrado:

---
   web_servers:
     web_server_1:
        ansible_user=centos
	   http_port=80

web_server_2:
        ansible_user=ubuntu
	   http_port=8080

Se os sistemas host compartilharem as mesmas variáveis, você poderá definir outro grupo no arquivo de inventário para torná-lo menos complicado e evitar repetições desnecessárias.

Por exemplo:

[web_servers]

web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=centos http_port=80

O acima pode ser estruturado como:

[web_servers]
web_server_1
web_server_2


[web_servers:vars]
ansible_user=centos
http_port=80

E no arquivo YAML do playbook, isso será definido conforme mostrado:

---
   web_servers:
    
     hosts: 
       web_server_1:
	  web_server_2:

     vars: 
        ansible_user=centos
   http_port=80

Fatos Ansible

Ao executar playbooks, a primeira tarefa que o Ansible realiza é a execução da tarefa de configuração. Tenho certeza de que você deve ter encontrado o resultado:

TASK:  [Gathering facts] *********

Os fatos ansible nada mais são do que propriedades do sistema ou informações sobre nós remotos aos quais você se conectou. Essas informações incluem a arquitetura do sistema, a versão do sistema operacional, informações do BIOS, hora e data do sistema, tempo de atividade do sistema, endereço IP e informações de hardware, para mencionar apenas alguns.

Para obter informações sobre qualquer sistema, basta usar o módulo setup conforme mostrado no comando abaixo:

ansible -m setup hostname

Por exemplo:

ansible -m setup database_server

Isso imprime um grande conjunto de dados no formato JSON conforme mostrado:

Os fatos Ansible são úteis para ajudar os administradores de sistema sobre quais operações realizar, por exemplo, dependendo do sistema operacional, eles são capazes de saber quais pacotes de software precisam ser instalados e como devem ser configurados, etc.

Fatos personalizados

Você também sabia que pode criar seus próprios fatos personalizados que podem ser coletados pelo Ansible? Sim você pode. Então, como você faz isso? Vamos mudar de assunto e ver como.

A primeira etapa é criar um diretório /etc/ansible/facts.d no nó gerenciado ou remoto.

Dentro deste diretório, crie um(s) arquivo(s) com extensão .fact. Esses arquivos retornarão dados JSON quando o playbook for executado no nó de controle do Ansible, o que inclui os outros fatos que o Ansible recupera após a execução do playbook.

Aqui está um exemplo de arquivo de fatos personalizado chamado date_time.fact que recupera data e hora.

mkdir -p /etc/ansible/facts.d
vim /etc/ansible/facts.d/date_time.fact

Adicione as seguintes linhas nele.

#!/bin/bash
DATE=`date`
echo "{\"date\" : \"${DATE}\"}"

Salve e saia do arquivo.

Agora atribua as permissões de execução:

chmod +x /etc/ansible/facts.d/date_time.fact

Agora, criei um manual no nó de controle Ansible chamado check_date.yml.

---

- hosts: webservers

  tasks:
   - name: Get custom facts
     debug:
      msg: The custom fact is {{ansible_local.date_time}}

Anexe o arquivo de fatos à variável ansible_local. O ansible_local armazena todos os fatos personalizados.

Agora execute o manual e observe o Ansible recuperando as informações salvas no arquivo de fatos:

ansible_playbook check_date.yml

Conclusão

Isso nos leva ao final deste tutorial sobre como trabalhar com variáveis e fatos Ansible.