Sobes.tech
Middle

Qual é a hierarquia de variáveis nos diferentes papéis do DevOps?

sobes.tech IA

Resposta da IA

As variáveis no Ansible têm uma hierarquia estrita de prioridades. O Ansible combina variáveis de várias fontes, sobrescrevendo os valores de prioridade inferior com os de prioridade superior.

Hierarquia (do menor ao maior prioridade):

  1. Valores padrão do papel (Role defaults): Variáveis definidas em defaults/main.yml dentro do papel. Têm a prioridade mais baixa, destinadas a definir valores padrão que podem ser facilmente sobrescritos.
  2. Variáveis no diretório do papel (Role vars): Variáveis definidas em vars/main.yml dentro do papel. Têm uma prioridade mais alta do que as variáveis padrão do papel.
  3. Variáveis do inventário (Inventory variables):
    • Variáveis globais do inventário (group_vars/all / host_vars/all ou no arquivo principal do inventário).
    • Variáveis de grupos do inventário (group_vars/<nome_grupo>). A prioridade depende da ordem dos grupos no inventário e no playbook, mas geralmente os grupos com maior profundidade ou definidos mais tarde têm prioridade mais alta.
    • Variáveis do host do inventário (host_vars/<nome_host> ou no arquivo principal do inventário). Têm prioridade mais alta do que as variáveis de grupo.
  4. Variáveis do play (Play variables): Variáveis definidas diretamente na secção vars do play.
  5. Variáveis de play_hosts (Play vars_files): Variáveis carregadas no play através de vars_files. A ordem em que são listadas determina a prioridade.
  6. Variáveis de facts (Facts): Variáveis recolhidas após executar o módulo gather_facts. Têm alta prioridade, pois representam o estado atual do sistema.
  7. Variáveis de tarefas registadas (Task variables): Variáveis definidas através de register após executar uma tarefa. Têm alta prioridade, disponíveis apenas dentro do play atual após a tarefa.
  8. Variáveis de linha de comando (Command line variables): Variáveis passadas usando a bandeira -e ou --extra-vars ao executar ansible-playbook. Têm a prioridade mais alta e sobrescrevem todas as outras variáveis.

Exemplo de playbook com variáveis:

---
# playbook main.yml
- hosts: webservers
  vars:
    global_var: "global_value_from_play" # Variável do play (prioridade 4)
  roles:
    - webservers # Papel com defaults/main.yml e vars/main.yml (prioridade 1 e 2)
  tasks:
    - name: Imprimir variável
      debug:
        msg: "O valor da variável é: {{ my_variable }}"
      vars: # Variável de tarefa (prioridade 7)
        my_variable: "task_specific_value"

Exemplo de inventário:

# inventário
[webservers]
webserver1 ansible_host=192.168.1.10 # Variável do host (prioridade 3)

[all:vars]
my_variable="inventory_all_value" # Variável global do inventário (prioridade 3)

Exemplo de defaults do papel:

# roles/webservers/defaults/main.yml
---
my_variable: "default_value_from_role" # Variável defaults do papel (prioridade 1)

Exemplo de vars do papel:

# roles/webservers/vars/main.yml
---
my_variable: "vars_value_from_role" # Variável vars do papel (prioridade 2)

Ao executar o playbook ansible-playbook -i inventory main.yml -e "my_variable=extra_vars_value":

  1. Será usada a valor de -e: extra_vars_value (prioridade 8).
  2. Se -e não estiver presente, mas houver uma variável de tarefa, ela será usada: task_specific_value (prioridade 7).
  3. Se não houver variável de tarefa nem -e, será usada a fact (se aplicável).
  4. Depois, a variável do play: global_value_from_play (prioridade 4).
  5. Depois, a variável do host do inventário: ansible_host=192.168.1.10 (prioridade 3).
  6. Depois, a variável do grupo do inventário (group_vars ou no inventário).
  7. Depois, a variável global do inventário: inventory_all_value (prioridade 3).
  8. Depois, a variável vars do papel: vars_value_from_role (prioridade 2).
  9. Finalmente, a variável defaults do papel: default_value_from_role (prioridade 1).

O Ansible pega o primeiro valor encontrado com a prioridade mais alta nesta hierarquia. Compreender esta hierarquia é crucial para depuração e gestão correta da configuração.