Usando fatos coletados em tarefas condicionais
Um dos usos mais poderosos dos fatos coletados é a implementação de lógica condicional em seus playbooks. Nesta etapa, criaremos um playbook que usa fatos para tomar decisões sobre quais tarefas executar.
Entendendo tarefas condicionais no Ansible
O Ansible permite que você use a palavra-chave when para executar tarefas condicionalmente com base em variáveis, fatos ou resultados de tarefas. Isso permite que você crie playbooks mais dinâmicos e adaptáveis.
Criando um playbook com tarefas condicionais
Vamos criar um playbook que realiza ações diferentes com base no sistema operacional:
- No WebIDE, navegue até o diretório
/home/labex/project/ansible
- Crie um novo arquivo chamado
conditional_facts_playbook.yml
- Adicione o seguinte conteúdo:
---
- name: Conditional Tasks Based on Facts
hosts: local
gather_facts: true
tasks:
- name: Display OS information
debug:
msg: "Running on {{ ansible_distribution }} {{ ansible_distribution_version }}"
- name: Task for Ubuntu systems
debug:
msg: "This is an Ubuntu system. Would run apt commands here."
when: ansible_distribution == "Ubuntu"
- name: Task for CentOS systems
debug:
msg: "This is a CentOS system. Would run yum commands here."
when: ansible_distribution == "CentOS"
- name: Task for systems with at least 2GB RAM
debug:
msg: "This system has {{ ansible_memtotal_mb }} MB RAM, which is sufficient for our application."
when: ansible_memtotal_mb >= 2048
- name: Task for systems with less than 2GB RAM
debug:
msg: "This system has only {{ ansible_memtotal_mb }} MB RAM, which may not be sufficient."
when: ansible_memtotal_mb < 2048
Este playbook:
- Coleta todos os fatos sobre o sistema
- Exibe as informações do sistema operacional
- Executa tarefas condicionalmente com base no tipo de sistema operacional
- Executa tarefas condicionalmente com base na quantidade de RAM
Executando o playbook condicional
Vamos executar o playbook para ver as tarefas condicionais em ação:
cd ~/project/ansible
ansible-playbook -i hosts conditional_facts_playbook.yml
Como estamos executando no Ubuntu, você deve ver uma saída semelhante a esta:
PLAY [Conditional Tasks Based on Facts] **************************************
TASK [Gathering Facts] *******************************************************
ok: [localhost]
TASK [Display OS information] ************************************************
ok: [localhost] => {
"msg": "Running on Ubuntu 22.04"
}
TASK [Task for Ubuntu systems] ***********************************************
ok: [localhost] => {
"msg": "This is an Ubuntu system. Would run apt commands here."
}
TASK [Task for CentOS systems] ***********************************************
skipping: [localhost]
TASK [Task for systems with at least 2GB RAM] ********************************
ok: [localhost] => {
"msg": "This system has 3907 MB RAM, which is sufficient for our application."
}
TASK [Task for systems with less than 2GB RAM] *******************************
skipping: [localhost]
PLAY RECAP *******************************************************************
localhost : ok=4 changed=0 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0
Observe como algumas tarefas são executadas enquanto outras são ignoradas com base nas condições. A tarefa do CentOS é ignorada porque estamos executando no Ubuntu, e a tarefa "menos de 2GB RAM" é ignorada porque nosso sistema tem mais de 2GB de RAM.
Criando um exemplo mais prático
Agora, vamos criar um exemplo mais prático que pode ser usado em um ambiente real:
- No WebIDE, crie um novo arquivo chamado
practical_conditional_playbook.yml
- Adicione o seguinte conteúdo:
---
- name: Practical Conditional Playbook
hosts: local
gather_facts: true
vars:
app_dir: "/home/labex/project/app"
tasks:
- name: Create application directory
file:
path: "{{ app_dir }}"
state: directory
mode: "0755"
- name: Configure for production environment
copy:
dest: "{{ app_dir }}/config.yml"
content: |
environment: production
memory_limit: high
debug: false
when: ansible_memtotal_mb >= 4096
- name: Configure for development environment
copy:
dest: "{{ app_dir }}/config.yml"
content: |
environment: development
memory_limit: low
debug: true
when: ansible_memtotal_mb < 4096
- name: Display configuration
command: cat {{ app_dir }}/config.yml
register: config_content
- name: Show configuration
debug:
msg: "{{ config_content.stdout_lines }}"
Este playbook:
- Cria um diretório para um aplicativo
- Escreve um arquivo de configuração diferente com base na memória do sistema disponível
- Exibe a configuração resultante
Execute o playbook prático:
ansible-playbook -i hosts practical_conditional_playbook.yml
Este exemplo demonstra como você pode usar fatos coletados para adaptar automaticamente as configurações com base nas características do sistema.