Translate

Mostrar mensagens com a etiqueta administração de servidores. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta administração de servidores. Mostrar todas as mensagens

terça-feira, 26 de novembro de 2024

Ansible : Quando um Programador Descobre que Automatizar 500 Servidores Manualmente é um Problema de Lógica — e Também de Sanidade

 

Bellacosa Mainframe apresenta o ansible

☕ Um Café no Bellacosa Mainframe

Ansible sem Mistérios para Programadores COBOL

Quando um Programador Descobre que Automatizar 500 Servidores Manualmente é um Problema de Lógica — e Também de Sanidade

No começo, havia o operador.

Depois veio o administrador de sistemas.

Em seguida, surgiu o programador COBOL, carregando um JCL debaixo do braço, uma caneca de café na mão e a saudável desconfiança de quem já viu um simples espaço em branco causar um desastre em produção.

Então alguém apresentou o Ansible.

— Com isso você pode administrar centenas de máquinas ao mesmo tempo.

O programador COBOL olhou para a tela, viu um arquivo YAML cheio de espaços e perguntou:

— E onde está a coluna 7?

Foi assim que começou esta viagem.

Este artigo é um guia para programadores COBOL iniciantes que desejam entender Ansible sem precisar abandonar tudo o que já aprenderam sobre lógica, processamento em lote, organização de programas, controle operacional e sobrevivência corporativa.

O Ansible pode parecer uma tecnologia completamente diferente do mainframe. Entretanto, quando observamos com cuidado, encontramos conceitos familiares:

  • inventários lembram catálogos de recursos;

  • Playbooks lembram JCLs ou procedimentos operacionais;

  • Roles lembram PROCs reutilizáveis;

  • módulos lembram programas utilitários;

  • variáveis lembram símbolos de JCL;

  • Handlers lembram rotinas executadas somente quando uma condição ocorre;

  • pipelines lembram cadeias de JOBs;

  • idempotência lembra uma operação projetada para não destruir o ambiente ao ser executada novamente.

A principal diferença é que o Ansible foi criado para administrar ambientes distribuídos: Linux, Windows, redes, Cloud, contêineres, APIs e até IBM Z.

Pegue sua toalha, sua caneca e, principalmente, não entre em pânico.


1. O que é Ansible?

Ansible é uma plataforma de automação de tecnologia da informação.

Ele pode ser usado para:

  • configurar servidores;

  • instalar softwares;

  • criar usuários;

  • publicar aplicações;

  • alterar arquivos;

  • administrar serviços;

  • executar comandos;

  • provisionar infraestrutura;

  • automatizar redes;

  • integrar ambientes de Cloud;

  • organizar pipelines;

  • executar operações em z/OS.

Em termos simples, o Ansible permite descrever aquilo que você deseja que aconteça em um ambiente.

Por exemplo:

Quero que o Nginx esteja instalado, iniciado e configurado para subir automaticamente.

Em vez de acessar manualmente cada servidor, o Ansible executa a operação em todas as máquinas definidas.

Considere uma empresa com 300 servidores Linux.

Sem automação, alguém poderia tentar:

Conectar no servidor 1
Instalar o pacote
Copiar o arquivo
Reiniciar o serviço

Conectar no servidor 2
Instalar o pacote
Copiar o arquivo
Reiniciar o serviço

Conectar no servidor 3...

No servidor 137, provavelmente surgiria uma interrupção, uma reunião, uma emergência ou um café particularmente interessante. A partir desse ponto, ninguém teria certeza de quais servidores foram atualizados.

Com Ansible, descrevemos a operação uma vez:

---
- name: Configurar servidores web
  hosts: webservers
  become: true

  tasks:
    - name: Garantir que o Nginx esteja instalado
      ansible.builtin.package:
        name: nginx
        state: present

    - name: Garantir que o Nginx esteja iniciado
      ansible.builtin.service:
        name: nginx
        state: started
        enabled: true

O Ansible se conecta aos servidores, verifica a situação atual e executa apenas as mudanças necessárias.

Essa última parte é fundamental.


2. A ideia de estado desejado

Um script tradicional costuma dizer:

Execute este comando.

O Ansible normalmente diz:

Garanta que o recurso esteja neste estado.

Compare os dois exemplos.

Script imperativo

apt install nginx -y
systemctl start nginx
systemctl enable nginx

O script ordena ações.

Playbook declarativo

- name: Garantir que o Nginx esteja instalado
  ansible.builtin.apt:
    name: nginx
    state: present

- name: Garantir que o Nginx esteja iniciado e habilitado
  ansible.builtin.service:
    name: nginx
    state: started
    enabled: true

O Playbook descreve o resultado desejado.

Essa é uma das bases da chamada Infrastructure as Code, ou infraestrutura como código.

A configuração do ambiente deixa de existir apenas na memória do administrador e passa a ser representada por arquivos versionados, revisáveis e executáveis.

Em outras palavras, a documentação começa a trabalhar.

Uma raridade tão impressionante quanto encontrar uma impressora corporativa que funcione na primeira tentativa.


3. Agentless: o Ansible não exige um agente permanente

Uma das principais características do Ansible é sua arquitetura normalmente classificada como agentless.

Isso significa que, na maioria dos casos, não é necessário instalar um agente dedicado em cada máquina administrada.

O Ansible utiliza mecanismos já existentes.

Em Linux e Unix, geralmente:

SSH

Em Windows:

WinRM
PowerShell

Em equipamentos de rede:

SSH
APIs
NETCONF
HTTPAPI
CLI

Em z/OS, dependendo da Collection e da operação:

SSH
ZOAU
APIs
z/OSMF

O computador de onde o Ansible é executado recebe o nome de Control Node.

As máquinas administradas são chamadas de:

Managed Nodes

A arquitetura básica é:

              CONTROL NODE
                 Ansible
                    |
          -----------------------
          |          |          |
         SSH        SSH        SSH
          |          |          |
       Servidor1  Servidor2  Servidor3

O Control Node contém:

  • Ansible;

  • inventários;

  • Playbooks;

  • variáveis;

  • Roles;

  • Collections;

  • credenciais;

  • arquivos de configuração.

Os Managed Nodes recebem as tarefas.

Curiosidade importante

“Agentless” não significa que absolutamente nada seja necessário na máquina remota.

Muitos módulos para Linux dependem da presença de Python. Outros dispositivos utilizam APIs ou bibliotecas específicas. No z/OS, determinadas automações podem depender do Z Open Automation Utilities.

A ideia correta é:

Não existe normalmente um agente Ansible permanente funcionando em cada host.


4. Inventory: o mapa da galáxia

Antes de viajar, precisamos saber para onde estamos indo.

O Inventory é a lista dos sistemas que serão administrados pelo Ansible.

Um inventário simples no formato INI pode ser:

[webservers]
web01
web02
web03

[databases]
db01
db02

Também podemos usar YAML:

---
all:
  children:
    webservers:
      hosts:
        web01:
        web02:
        web03:

    databases:
      hosts:
        db01:
        db02:

Os grupos permitem executar tarefas em conjuntos específicos.

Exemplo:

ansible webservers -m ping

Somente os servidores do grupo webservers serão testados.

Variáveis no inventário

Podemos informar endereços e usuários:

---
all:
  children:
    webservers:
      hosts:
        web01:
          ansible_host: 192.168.10.11

        web02:
          ansible_host: 192.168.10.12

      vars:
        ansible_user: automation
        ansible_port: 22

O nome web01 funciona como uma identidade lógica.

O endereço real está em:

ansible_host: 192.168.10.11

Isso é semelhante à diferença entre um nome simbólico e o recurso físico correspondente.


5. Inventário estático e inventário dinâmico

Um inventário estático é escrito manualmente.

Ele funciona bem quando os servidores mudam pouco.

Entretanto, ambientes modernos podem crescer e diminuir automaticamente.

Em uma Cloud, hoje podemos ter 40 máquinas. Amanhã, 120. Depois de amanhã, 17, porque algum gerente finalmente percebeu a conta.

Para esses ambientes existe o Dynamic Inventory.

O Ansible consulta uma fonte externa, como:

  • AWS;

  • Azure;

  • Google Cloud;

  • VMware;

  • OpenStack;

  • IBM Cloud;

  • CMDB;

  • ServiceNow;

  • scripts;

  • APIs internas.

O inventário é gerado em tempo de execução.

Assim, não precisamos editar manualmente o arquivo sempre que uma máquina nasce, muda ou desaparece no grande buraco negro do autoscaling.


6. Comandos Ad-Hoc

Os comandos Ad-Hoc são úteis para operações rápidas.

Por exemplo, testar conectividade:

ansible all -m ping

É importante observar que o módulo ping do Ansible não é o mesmo comando ICMP tradicional.

Ele verifica se o Ansible consegue:

  • conectar;

  • autenticar;

  • executar um módulo;

  • receber uma resposta.

Podemos consultar o uptime:

ansible all -m command -a "uptime"

Consultar espaço em disco:

ansible all -m shell -a "df -h"

Copiar um arquivo:

ansible all \
  -m copy \
  -a "src=aviso.txt dest=/tmp/aviso.txt"

Reiniciar um serviço:

ansible webservers \
  -m service \
  -a "name=nginx state=restarted" \
  --become

Os comandos Ad-Hoc são excelentes para diagnóstico e intervenções pontuais.

Porém, se uma operação precisa ser:

  • repetida;

  • auditada;

  • versionada;

  • revisada;

  • executada novamente no futuro;

ela provavelmente deve virar um Playbook.


7. Playbooks: o JCL da automação distribuída

Um Playbook é um arquivo YAML que descreve uma ou mais automações.

Para um programador COBOL, podemos fazer uma analogia aproximada:

JCL define uma execução em mainframe.
Playbook define uma automação em um conjunto de hosts.

Um Playbook básico:

---
- name: Configurar servidores de aplicação
  hosts: appservers
  become: true

  tasks:
    - name: Instalar Java
      ansible.builtin.package:
        name: java-17-openjdk
        state: present

    - name: Criar diretório da aplicação
      ansible.builtin.file:
        path: /opt/minha-app
        state: directory
        owner: app
        group: app
        mode: "0750"

Os principais elementos são:

name:
hosts:
become:
vars:
tasks:
handlers:
roles:

name

É a descrição do Play ou da tarefa.

name: Instalar Java

Escolha nomes claros. Quando algo falhar às três da manhã, “Executar coisa” não será uma descrição reconfortante.

hosts

Define os alvos:

hosts: appservers

become

Solicita elevação de privilégio:

become: true

É semelhante ao uso de sudo.

tasks

Contém as tarefas a executar.


8. YAML: o universo onde os espaços têm poder

YAML é uma linguagem de serialização de dados muito utilizada em automação.

Ela é legível, mas possui uma característica inquietante:

A indentação faz parte da estrutura.

Exemplo correto:

tasks:
  - name: Instalar Nginx
    ansible.builtin.package:
      name: nginx
      state: present

Exemplo incorreto:

tasks:
  - name: Instalar Nginx
      ansible.builtin.package:
    name: nginx

Para quem conhece COBOL, isso não deveria causar tanto choque. Afinal, fomos treinados por décadas a respeitar colunas, níveis, pontos e estruturas.

Regras práticas

Use espaços, não TAB.

Mantenha uma indentação consistente, normalmente dois espaços.

Inicie arquivos com:

---

Use aspas quando um valor puder ser interpretado incorretamente:

mode: "0644"

Valide a sintaxe:

ansible-playbook playbook.yml --syntax-check

Use análise de qualidade:

ansible-lint playbook.yml

Easter egg para veteranos

YAML significa originalmente “Yet Another Markup Language”.

Posteriormente, o significado passou a ser “YAML Ain’t Markup Language”, uma sigla recursiva.

Ou seja, a própria linguagem entrou em uma discussão existencial sobre o que ela é. Algo perfeitamente normal no universo da tecnologia.


9. Módulos: os utilitários do Ansible

Os módulos são unidades de trabalho.

Exemplos:

package
apt
dnf
copy
template
file
user
group
service
systemd
uri
command
shell
debug
assert
fail

Um módulo realiza uma operação específica.

Exemplo:

- name: Criar usuário
  ansible.builtin.user:
    name: vagner
    state: present
    shell: /bin/bash

A forma totalmente qualificada:

ansible.builtin.user

é chamada de FQCN, ou Fully Qualified Collection Name.

Ela mostra exatamente de onde vem o módulo.

Isso evita ambiguidades entre módulos com nomes semelhantes.

command ou shell?

command executa diretamente um programa:

- name: Consultar uptime
  ansible.builtin.command:
    cmd: uptime

shell executa por meio de um shell:

- name: Procurar processo
  ansible.builtin.shell:
    cmd: "ps -ef | grep nginx"

Use shell apenas quando precisar de:

  • pipes;

  • redirecionamento;

  • curingas;

  • expansão de variáveis;

  • operadores como &&.

Sempre que existir um módulo específico, prefira o módulo.

Ruim:

- name: Criar usuário
  ansible.builtin.shell:
    cmd: useradd vagner

Melhor:

- name: Garantir que o usuário exista
  ansible.builtin.user:
    name: vagner
    state: present

10. Idempotência: executar novamente sem destruir o universo

Idempotência é uma das palavras centrais no Ansible.

Uma operação idempotente produz o mesmo estado final mesmo quando executada várias vezes.

Considere:

- name: Garantir que o diretório exista
  ansible.builtin.file:
    path: /opt/app
    state: directory

Na primeira execução:

Diretório não existe.
Ansible cria.
Resultado: changed

Na segunda:

Diretório já existe.
Nenhuma alteração.
Resultado: ok

Na terceira:

Continua existindo.
Resultado: ok

Esse comportamento é vital em automação.

Um Playbook não deve depender da esperança de que alguém se lembre se ele já foi executado.

Analogia com COBOL

Imagine um programa batch que recebe um arquivo e insere registros sem verificar duplicidade.

Executá-lo duas vezes pode produzir registros duplicados.

Um processamento idempotente verifica se o dado já existe ou utiliza uma chave que impede duplicação.

No Ansible, os módulos são projetados para verificar o estado antes de agir.


11. Variáveis

Variáveis tornam os Playbooks flexíveis.

vars:
  package_name: nginx
  service_name: nginx
  http_port: 80

Uso:

- name: Instalar pacote
  ansible.builtin.package:
    name: "{{ package_name }}"
    state: present

As chaves duplas:

{{ package_name }}

indicam uma expressão Jinja2.

Variáveis podem vir de diversos lugares:

  • Playbook;

  • Inventory;

  • group_vars;

  • host_vars;

  • Role;

  • linha de comando;

  • arquivos externos;

  • facts;

  • Vault.

group_vars e host_vars

Variáveis para um grupo:

group_vars/webservers.yml
---
http_port: 8080
package_name: nginx

Variáveis para um host:

host_vars/web01.yml
---
http_port: 9090

O host web01 poderá usar um valor específico.


12. Facts: o Ansible investigando o sistema

Facts são informações coletadas dos hosts.

Exemplos:

  • hostname;

  • sistema operacional;

  • versão;

  • kernel;

  • CPU;

  • memória;

  • interfaces;

  • endereços IP;

  • discos;

  • arquitetura.

Podemos visualizar facts:

ansible all -m setup

No Playbook:

- name: Mostrar distribuição
  ansible.builtin.debug:
    msg: "Sistema: {{ ansible_facts['distribution'] }}"

Podemos tomar decisões:

- name: Instalar Apache em sistemas Red Hat
  ansible.builtin.dnf:
    name: httpd
    state: present
  when: ansible_facts['os_family'] == 'RedHat'

Outro exemplo:

- name: Instalar Apache em Debian
  ansible.builtin.apt:
    name: apache2
    state: present
  when: ansible_facts['os_family'] == 'Debian'

Facts permitem escrever Playbooks adaptáveis.

Entretanto, coletar facts possui custo.

Quando não forem necessários:

gather_facts: false

Em milhares de máquinas, evitar uma coleta desnecessária pode economizar bastante tempo.


13. Condicionais

A cláusula when decide se uma tarefa será executada.

- name: Reiniciar serviço somente em produção
  ansible.builtin.service:
    name: app
    state: restarted
  when: environment == "production"

Verificar se uma variável existe:

when: app_port is defined

Verificar se não existe:

when: app_port is not defined

Comparação numérica:

when: free_space_mb | int < 1000

Para quem vem do COBOL:

IF condição
    EXECUTE tarefa
END-IF

No Ansible:

when: condição

O princípio é o mesmo. Apenas trocaram o END-IF por uma indentação que observa você em silêncio.


14. Loops

Loops repetem tarefas.

- name: Instalar pacotes
  ansible.builtin.package:
    name: "{{ item }}"
    state: present
  loop:
    - nginx
    - git
    - curl

Para um programador COBOL, isso lembra:

PERFORM VARYING WS-I FROM 1 BY 1
    UNTIL WS-I > 3

Podemos trabalhar com estruturas:

- name: Criar usuários
  ansible.builtin.user:
    name: "{{ item.name }}"
    groups: "{{ item.groups }}"
    state: present

  loop:
    - name: ana
      groups: developers

    - name: bruno
      groups: operations

    - name: carla
      groups: auditors

Cada item possui propriedades.


15. Register: guardando o resultado

A palavra register armazena o resultado de uma tarefa.

- name: Consultar espaço em disco
  ansible.builtin.command:
    cmd: df -P /opt
  register: disk_result
  changed_when: false

Depois:

- name: Mostrar saída
  ansible.builtin.debug:
    var: disk_result.stdout

Um resultado pode conter:

stdout
stderr
rc
changed
failed
results

Podemos reagir ao código de retorno:

- name: Falhar quando o comando retornar erro
  ansible.builtin.fail:
    msg: "A verificação falhou."
  when: disk_result.rc != 0

Essa lógica é familiar para qualquer pessoa que já analisou RETURN-CODE, MAXCC, SQLCODE ou um ABEND que decidiu surgir cinco minutos antes do fim do expediente.


16. Handlers: agir apenas quando algo mudou

Handlers são tarefas executadas quando notificadas por outra tarefa.

Exemplo:

tasks:
  - name: Publicar configuração do Nginx
    ansible.builtin.template:
      src: nginx.conf.j2
      dest: /etc/nginx/nginx.conf
    notify: Reiniciar Nginx

handlers:
  - name: Reiniciar Nginx
    ansible.builtin.service:
      name: nginx
      state: restarted

O Handler somente será acionado quando o arquivo for alterado.

Se não houver mudança:

Nenhum restart.

Se dez tarefas notificarem o mesmo Handler:

O Handler normalmente executa uma vez ao final do Play.

Isso evita reinicializações desnecessárias.

Analogia

Imagine dez etapas atualizando parâmetros de uma aplicação.

Sem Handler:

Altera parâmetro.
Reinicia.

Altera outro parâmetro.
Reinicia.

Altera certificado.
Reinicia.

Com Handler:

Executa todas as alterações.
Reinicia uma vez.

Menos indisponibilidade, menos risco e menos oportunidades para o servidor desenvolver personalidade própria.


17. Tags

Tags permitem executar partes específicas do Playbook.

- name: Instalar aplicação
  ansible.builtin.package:
    name: minha-app
    state: present
  tags:
    - install
    - application

Execução:

ansible-playbook site.yml --tags install

Pular tarefas:

ansible-playbook site.yml --skip-tags debug

Tags são úteis para:

  • manutenção;

  • instalação;

  • configuração;

  • validação;

  • depuração;

  • operações seletivas.

Porém, use com cuidado.

Executar apenas uma etapa pode ignorar dependências anteriores.

Um Playbook deve continuar coerente mesmo quando dividido por tags.


18. Roles: organizando a automação

Quando um Playbook cresce, ele pode virar uma criatura de milhares de linhas que ninguém deseja encontrar em um corredor escuro.

Roles resolvem esse problema.

Uma Role organiza arquivos por finalidade:

roles/
└── webserver/
    ├── tasks/
    │   └── main.yml
    ├── handlers/
    │   └── main.yml
    ├── defaults/
    │   └── main.yml
    ├── vars/
    │   └── main.yml
    ├── templates/
    ├── files/
    ├── meta/
    │   └── main.yml
    └── README.md

Diretórios principais

tasks contém as tarefas.

handlers contém os Handlers.

defaults contém variáveis padrão de baixa precedência.

vars contém variáveis da Role.

templates contém arquivos Jinja2.

files contém arquivos estáticos.

meta pode declarar dependências.

Uso:

---
- name: Configurar servidores web
  hosts: webservers
  become: true

  roles:
    - common
    - security
    - webserver

Analogia com mainframe

Uma Role pode ser comparada a uma PROC ou componente reutilizável.

Em vez de repetir passos em todos os Playbooks, centralizamos a lógica.


19. Templates e Jinja2

Templates permitem gerar arquivos diferentes para cada máquina.

Exemplo:

server {
    listen {{ http_port }};
    server_name {{ inventory_hostname }};

    location / {
        proxy_pass http://127.0.0.1:{{ app_port }};
    }
}

O arquivo pode ser chamado:

nginx.conf.j2

A tarefa:

- name: Gerar configuração
  ansible.builtin.template:
    src: nginx.conf.j2
    dest: /etc/nginx/conf.d/app.conf
    owner: root
    group: root
    mode: "0644"
  notify: Recarregar Nginx

O mesmo template produz configurações diferentes com base nas variáveis de cada host.

Condicionais no template

{% if environment == "production" %}
log_level error;
{% else %}
log_level debug;
{% endif %}

Loops no template

{% for server in backend_servers %}
server {{ server }};
{% endfor %}

Filtros

{{ app_name | upper }}
{{ user_name | lower }}
{{ value | default('desconhecido') }}

Jinja2 transforma dados em arquivos de configuração.

É como uma combinação de STRING, edição de relatórios, geração de parâmetros e um toque de magia burocrática.


20. Ansible Vault

Nunca grave senhas diretamente no Playbook.

Não faça isto:

db_password: admin123

Também não faça isto seguido da frase:

Depois eu removo.

Essa frase é uma das principais causas de segredos permanentes em repositórios.

O Ansible Vault criptografa arquivos ou variáveis.

Criar arquivo:

ansible-vault create secrets.yml

Criptografar arquivo existente:

ansible-vault encrypt secrets.yml

Editar:

ansible-vault edit secrets.yml

Visualizar:

ansible-vault view secrets.yml

Executar Playbook:

ansible-playbook site.yml --ask-vault-pass

Também podemos usar um arquivo de senha controlado:

ansible-playbook site.yml \
  --vault-password-file /caminho/protegido/vault.pass

Segurança adicional

Em tarefas que manipulam segredos:

- name: Configurar credencial
  ansible.builtin.debug:
    msg: "{{ db_password }}"
  no_log: true

O no_log impede a exibição do conteúdo sensível.

Entretanto, ele também reduz informações de diagnóstico. Use somente onde necessário.

Vault não resolve tudo

Ainda é necessário controlar:

  • quem possui a senha;

  • rotação de credenciais;

  • segregação entre ambientes;

  • auditoria;

  • armazenamento seguro;

  • acesso da pipeline.

Em ambientes maiores, podem ser usados:

  • HashiCorp Vault;

  • CyberArk;

  • AWS Secrets Manager;

  • Azure Key Vault;

  • IBM Cloud Secrets Manager;

  • credenciais protegidas do Jenkins;

  • Ansible Automation Platform Credentials.


21. Tratamento de erros com Block, Rescue e Always

Ansible possui uma estrutura semelhante ao tratamento de exceções.

- name: Atualizar aplicação
  block:
    - name: Publicar nova versão
      ansible.builtin.copy:
        src: app.jar
        dest: /opt/app/app.jar

    - name: Reiniciar aplicação
      ansible.builtin.service:
        name: app
        state: restarted

  rescue:
    - name: Restaurar versão anterior
      ansible.builtin.copy:
        src: app.jar.backup
        dest: /opt/app/app.jar

    - name: Informar falha
      ansible.builtin.debug:
        msg: "Falha detectada. Rollback executado."

  always:
    - name: Registrar encerramento
      ansible.builtin.debug:
        msg: "Processo de atualização encerrado."

block contém a operação principal.

rescue executa quando uma tarefa do bloco falha.

always executa independentemente do resultado.

Outros controles

Ignorar erro:

ignore_errors: true

Use com extrema cautela.

Definir falha personalizada:

failed_when: disk_result.rc != 0

Definir mudança personalizada:

changed_when: false

Retry:

- name: Aguardar aplicação responder
  ansible.builtin.uri:
    url: http://localhost:8080/health
    status_code: 200
  register: health
  retries: 10
  delay: 5
  until: health.status == 200

Isso tenta até dez vezes, aguardando cinco segundos entre as tentativas.


22. Ansible Galaxy e Collections

Ansible Galaxy é um catálogo de conteúdo reutilizável.

Podemos encontrar:

  • Roles;

  • Collections;

  • módulos;

  • plugins;

  • exemplos;

  • documentação.

Instalar uma Role:

ansible-galaxy role install geerlingguy.nginx

Instalar uma Collection:

ansible-galaxy collection install community.general

Uma Collection agrupa diferentes tipos de conteúdo.

Exemplos:

community.general
ansible.posix
amazon.aws
azure.azcollection
community.vmware
ibm.ibm_zos_core

Role versus Collection

Role:

Automação organizada para uma finalidade.

Collection:

Pacote maior contendo módulos, plugins, Roles, documentação e outros recursos.

requirements.yml

Dependências devem ser declaradas:

---
collections:
  - name: community.general
    version: 10.4.0

  - name: ansible.posix
    version: 1.6.2

roles:
  - name: geerlingguy.nginx
    version: 3.2.0

Instalação:

ansible-galaxy install -r requirements.yml

Fixar versões aumenta a previsibilidade.

Sem isso, uma atualização externa pode transformar uma pipeline estável em uma aventura filosófica sobre compatibilidade.

Cuidado com conteúdo externo

Antes de usar uma Role ou Collection, avalie:

  • autor;

  • reputação;

  • documentação;

  • atualização;

  • testes;

  • código;

  • licenciamento;

  • versões suportadas;

  • dependências;

  • permissões exigidas.

Não execute conteúdo desconhecido com privilégios administrativos apenas porque ele possui um ícone simpático.


23. Estrutura profissional de projeto

Um projeto organizado pode ter:

ansible-project/
├── ansible.cfg
├── requirements.yml
├── README.md
├── inventories/
│   ├── dev/
│   │   ├── hosts.yml
│   │   └── group_vars/
│   ├── test/
│   │   ├── hosts.yml
│   │   └── group_vars/
│   └── prod/
│       ├── hosts.yml
│       └── group_vars/
├── playbooks/
│   ├── site.yml
│   ├── deploy.yml
│   └── rollback.yml
├── roles/
│   ├── common/
│   ├── security/
│   ├── webserver/
│   └── application/
├── templates/
└── files/

Essa estrutura separa:

  • ambientes;

  • código;

  • configurações;

  • dados;

  • dependências;

  • documentação.

Dica

Nunca misture produção e desenvolvimento no mesmo inventário sem uma razão extremamente boa, três aprovações e talvez a presença de um adulto responsável.


24. Boas práticas

Use módulos idempotentes

Prefira:

ansible.builtin.user
ansible.builtin.package
ansible.builtin.service
ansible.builtin.copy

em vez de comandos arbitrários.

Utilize FQCN

Prefira:

ansible.builtin.copy

em vez de:

copy

Escreva nomes claros

Ruim:

- name: Fazer ajuste

Melhor:

- name: Publicar configuração TLS do portal corporativo

Valide arquivos antes de substituir

- name: Publicar configuração do Nginx
  ansible.builtin.template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
    validate: "nginx -t -c %s"

O Ansible valida o arquivo antes de colocá-lo em produção.

Use privilégio mínimo

Evite aplicar:

become: true

em tudo quando apenas algumas tarefas precisam de privilégios.

Documente

Mantenha um README.md com:

  • finalidade;

  • requisitos;

  • variáveis;

  • exemplos;

  • dependências;

  • procedimento de execução;

  • rollback;

  • responsáveis.

Teste antes da produção

Use:

ansible-playbook site.yml --syntax-check

Depois:

ansible-playbook site.yml --check --diff

Por fim, execute em um ambiente de teste.

O modo Check ajuda, mas não é perfeito. Nem todos os módulos simulam integralmente as mudanças.


25. Desempenho

Facts

Desative quando não forem necessários:

gather_facts: false

Forks

Em ansible.cfg:

[defaults]
forks = 30

Isso controla quantos hosts podem ser processados paralelamente.

Aumentar o número pode acelerar a execução, mas também pode:

  • sobrecarregar o Control Node;

  • saturar a rede;

  • sobrecarregar APIs;

  • atingir limites dos servidores;

  • aumentar o impacto de uma falha.

SSH Multiplexing

[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s
pipelining = True

Isso permite reutilizar conexões SSH.

Serial

Atualize grupos menores:

- name: Atualização gradual
  hosts: webservers
  serial: 5

O Ansible processa cinco servidores por vez.

Essa estratégia é importante em produção.


26. Git, Jenkins e Ansible

Um fluxo DevOps comum é:

Desenvolvedor altera código
        ↓
Git recebe a mudança
        ↓
Pull Request é revisado
        ↓
Jenkins inicia a pipeline
        ↓
Sintaxe é validada
        ↓
Lint é executado
        ↓
Playbook é testado
        ↓
Ansible executa o deploy
        ↓
Resultado é registrado

Git armazena e versiona.

Jenkins coordena.

Ansible executa.

Podemos resumir assim:

Git       = fonte oficial
Jenkins   = maestro
Ansible   = executor
Inventory = mapa
Playbook  = plano operacional

Exemplo de pipeline

pipeline {
    agent any

    stages {
        stage('Checkout') {
            steps {
                git url: 'https://git.example/ansible.git'
            }
        }

        stage('Syntax Check') {
            steps {
                sh '''
                  ansible-playbook \
                    playbooks/deploy.yml \
                    --syntax-check
                '''
            }
        }

        stage('Lint') {
            steps {
                sh 'ansible-lint playbooks/deploy.yml'
            }
        }

        stage('Dry Run') {
            steps {
                sh '''
                  ansible-playbook \
                    -i inventories/test/hosts.yml \
                    playbooks/deploy.yml \
                    --check --diff
                '''
            }
        }

        stage('Deploy') {
            steps {
                sh '''
                  ansible-playbook \
                    -i inventories/prod/hosts.yml \
                    playbooks/deploy.yml \
                    --serial 2
                '''
            }
        }
    }
}

27. Rolling Update

Em produção, raramente devemos atualizar todos os servidores de uma vez.

Um fluxo seguro pode ser:

  1. retirar servidor do balanceador;

  2. parar aplicação;

  3. instalar versão;

  4. iniciar aplicação;

  5. testar saúde;

  6. recolocar servidor;

  7. avançar para o próximo.

Exemplo:

---
- name: Atualização gradual
  hosts: webservers
  serial: 1
  become: true

  pre_tasks:
    - name: Retirar host do balanceador
      ansible.builtin.uri:
        url: "https://lb.example/api/remove/{{ inventory_hostname }}"
        method: POST
      delegate_to: localhost

  tasks:
    - name: Publicar aplicação
      ansible.builtin.copy:
        src: app.jar
        dest: /opt/app/app.jar
      notify: Reiniciar aplicação

  handlers:
    - name: Reiniciar aplicação
      ansible.builtin.service:
        name: app
        state: restarted

  post_tasks:
    - name: Aguardar aplicação responder
      ansible.builtin.uri:
        url: "http://{{ inventory_hostname }}:8080/health"
        status_code: 200
      register: health
      retries: 10
      delay: 5
      until: health.status == 200

    - name: Recolocar host no balanceador
      ansible.builtin.uri:
        url: "https://lb.example/api/add/{{ inventory_hostname }}"
        method: POST
      delegate_to: localhost

Isso é uma implantação controlada, não uma aposta coletiva.


28. Troubleshooting: quando a nave não responde

Erro de YAML

Valide:

ansible-playbook site.yml --syntax-check

Use:

ansible-lint site.yml

Problemas de inventário

Mostrar estrutura:

ansible-inventory \
  -i inventories/prod/hosts.yml \
  --graph

Mostrar host:

ansible-inventory \
  -i inventories/prod/hosts.yml \
  --host web01

Listar hosts:

ansible webservers \
  -i inventories/prod/hosts.yml \
  --list-hosts

Problemas de SSH

ansible all -m ping -vvv

Verifique:

  • endereço;

  • DNS;

  • porta;

  • usuário;

  • chave;

  • senha;

  • firewall;

  • Python remoto;

  • sudo;

  • jump host;

  • host key.

Erros de permissão

Use become quando necessário:

become: true

Mas também investigue:

  • dono;

  • grupo;

  • modo;

  • ACL;

  • SELinux;

  • AppArmor;

  • filesystem somente leitura;

  • espaço em disco.

Nem todo Permission denied é resolvido adicionando mais privilégio. Às vezes isso apenas transforma um pequeno erro em um erro com autoridade.

Debug

- name: Mostrar variável
  ansible.builtin.debug:
    var: minha_variavel

Limitar execução

ansible-playbook site.yml --limit web01

Verbosidade

ansible-playbook site.yml -v
ansible-playbook site.yml -vv
ansible-playbook site.yml -vvv
ansible-playbook site.yml -vvvv

Quanto mais letras v, mais detalhes.

Eventualmente você descobrirá informações que não sabia que existiam e algumas que preferiria continuar não sabendo.


29. Precedência de variáveis

Ansible pode receber a mesma variável de diversos lugares.

Por exemplo:

defaults da Role
Inventory
group_vars
host_vars
facts
Playbook
task
set_fact
extra-vars

Quando vários lugares definem o mesmo nome, uma regra de precedência decide qual valor vence.

Linha de comando:

ansible-playbook site.yml -e "http_port=9090"

extra-vars possui precedência elevada.

Isso é útil, mas pode causar resultados inesperados.

Para descobrir o valor:

- name: Exibir porta
  ansible.builtin.debug:
    var: http_port

Para inspecionar variáveis de um host:

ansible-inventory \
  -i inventory.yml \
  --host web01

Dica

Evite reutilizar o mesmo nome de variável em muitos níveis.

Um nome claro reduz conflitos:

webserver_http_port
database_connection_port
application_health_port

30. Ansible no IBM Z

Ansible também pode automatizar z/OS.

Uma Collection importante é:

ibm.ibm_zos_core

Ela permite trabalhar, dependendo do ambiente e da configuração, com operações como:

  • datasets;

  • membros de PDS e PDSE;

  • USS;

  • JCL;

  • JOBs;

  • comandos;

  • cópia de arquivos;

  • encode e decode;

  • módulos específicos de z/OS.

Exemplo: submeter JCL

---
- name: Executar JOB no z/OS
  hosts: zos
  gather_facts: false

  tasks:
    - name: Submeter JCL de compilação
      ibm.ibm_zos_core.zos_job_submit:
        src: USER.JCL(COMPILE)
        location: data_set
        wait_time_s: 60
        return_output: true
      register: job_result

    - name: Mostrar resultado
      ansible.builtin.debug:
        var: job_result

Validar retorno

- name: Interromper se o retorno for maior que 4
  ansible.builtin.fail:
    msg: "Compilação COBOL falhou."
  when:
    - job_result.jobs is defined
    - job_result.jobs | length > 0
    - job_result.jobs[0].ret_code.code | int > 4

Possível pipeline COBOL

Código COBOL alterado
        ↓
Commit no Git
        ↓
Jenkins inicia pipeline
        ↓
Ansible envia fontes
        ↓
Ansible submete JCL
        ↓
Compilação é monitorada
        ↓
Return Code é validado
        ↓
Testes são executados
        ↓
LOADLIB é promovida
        ↓
CICS é atualizado

O Ansible não substitui COBOL, JCL, Db2, CICS ou z/OS.

Ele coordena e automatiza tarefas ao redor deles.


31. Ansible, COBOL e a arte de pensar em processos

O programador COBOL possui uma vantagem inesperada ao aprender Ansible.

COBOL ensina:

  • organização;

  • clareza;

  • processamento determinístico;

  • controle de retorno;

  • separação de responsabilidades;

  • atenção ao formato;

  • preocupação com reinício;

  • auditabilidade;

  • tratamento de erros;

  • previsibilidade operacional.

Essas qualidades são essenciais em automação.

Um bom Playbook precisa ser:

Legível
Repetível
Idempotente
Testável
Versionado
Auditável
Seguro
Recuperável

Em outras palavras, Ansible moderno precisa exatamente da disciplina que os ambientes mainframe cultivam há décadas.

A indústria às vezes apresenta infraestrutura como código como uma descoberta revolucionária.

O programador mainframe olha para JCLs, PROCs, parâmetros, bibliotecas controladas e processamento automatizado e pensa:

Interessante. Agora colocaram YAML.


32. Perguntas comuns de entrevistas

O que é Ansible?

Ansible é uma plataforma de automação usada para configuração, implantação, provisionamento e orquestração. Normalmente utiliza SSH ou mecanismos remotos semelhantes e descreve automações em Playbooks YAML.

Por que é agentless?

Porque normalmente não exige um agente Ansible permanente nos hosts administrados. Utiliza SSH, WinRM, APIs ou conexões específicas.

Inventory e Playbook são iguais?

Não.

Inventory informa onde executar.

Playbook informa o que executar.

Módulo e Role são iguais?

Não.

Módulo executa uma operação específica.

Role organiza uma automação completa e reutilizável.

command e shell são iguais?

Não.

command executa diretamente um programa.

shell passa o comando por um shell, permitindo pipes e redirecionamentos.

Variáveis e facts são iguais?

Variáveis são valores definidos ou recebidos.

Facts são informações coletadas dos hosts.

O que é Vault?

É o recurso de criptografia de dados sensíveis do Ansible.

O que são Handlers?

São tarefas executadas quando notificadas, normalmente em resposta a uma mudança.

O que é idempotência?

É a propriedade de atingir o mesmo estado final mesmo quando a automação é executada repetidamente.


33. Laboratório inicial passo a passo

Passo 1 — Instalar Ansible

Em distribuições baseadas em Debian ou Ubuntu:

sudo apt update
sudo apt install ansible -y

Validar:

ansible --version

Passo 2 — Criar diretório

mkdir -p ~/ansible-lab
cd ~/ansible-lab

Passo 3 — Criar inventário

# inventory.ini

[local]
localhost ansible_connection=local

Passo 4 — Testar

ansible all -i inventory.ini -m ping

Resultado esperado:

localhost | SUCCESS

Passo 5 — Criar Playbook

# primeiro-playbook.yml
---
- name: Primeiro laboratório Ansible
  hosts: local
  gather_facts: true

  tasks:
    - name: Mostrar sistema operacional
      ansible.builtin.debug:
        msg: >
          Estou executando em
          {{ ansible_facts['distribution'] }}
          {{ ansible_facts['distribution_version'] }}

    - name: Criar diretório de laboratório
      ansible.builtin.file:
        path: /tmp/ansible-lab
        state: directory
        mode: "0755"

    - name: Criar arquivo
      ansible.builtin.copy:
        dest: /tmp/ansible-lab/mensagem.txt
        content: |
          Não entre em pânico.
          O Ansible chegou até aqui.
        mode: "0644"

Passo 6 — Verificar sintaxe

ansible-playbook \
  -i inventory.ini \
  primeiro-playbook.yml \
  --syntax-check

Passo 7 — Simular

ansible-playbook \
  -i inventory.ini \
  primeiro-playbook.yml \
  --check --diff

Passo 8 — Executar

ansible-playbook \
  -i inventory.ini \
  primeiro-playbook.yml

Passo 9 — Executar novamente

ansible-playbook \
  -i inventory.ini \
  primeiro-playbook.yml

Na primeira execução, algumas tarefas terão:

changed

Na segunda, deverão retornar:

ok

Você acabou de observar idempotência funcionando.


34. Curiosidades e Easter Eggs

O nome Ansible

O termo “ansible” ficou conhecido na ficção científica como um dispositivo de comunicação instantânea entre grandes distâncias.

O nome combina bem com uma ferramenta que envia instruções para sistemas remotos.

A maioria dos problemas não está no YAML

Quando um Playbook falha, o instinto inicial é culpar a indentação.

Muitas vezes o verdadeiro problema é:

  • DNS;

  • SSH;

  • permissão;

  • variável;

  • pacote inexistente;

  • caminho incorreto;

  • serviço com outro nome;

  • Python ausente;

  • firewall;

  • sistema operacional diferente.

Ou, como diria um operador veterano:

O erro está exatamente onde o sistema disse que está, exceto quando não está.

changed não significa necessariamente sucesso funcional

Uma tarefa pode alterar um arquivo corretamente e ainda assim produzir uma configuração inválida para a aplicação.

Por isso, use:

  • validate;

  • testes;

  • health checks;

  • asserts;

  • rollback;

  • ambiente de homologação.

Automação ruim automatiza erros

Se um procedimento manual ruim for transformado em código sem revisão, teremos apenas um erro mais rápido, mais consistente e capaz de atingir centenas de máquinas simultaneamente.

A automação amplifica competência.

Infelizmente, também amplifica incompetência.

A resposta para tudo não é 42

Em Ansible, frequentemente é:

--check --diff -vvv

Não resolve tudo, mas oferece boas pistas.


35. O verdadeiro salto mental

O aprendiz pergunta:

Qual comando devo usar?

O profissional pergunta:

Qual estado desejo garantir?

O aprendiz escreve:

shell: systemctl restart nginx

O profissional pergunta:

Por que reiniciar? Houve mudança? Posso validar antes? Posso recarregar em vez de reiniciar?

O aprendiz cria um Playbook para funcionar uma vez.

O profissional cria uma automação para:

  • executar repetidamente;

  • falhar com clareza;

  • registrar evidências;

  • preservar segurança;

  • limitar impacto;

  • permitir rollback;

  • ser compreendida por outra pessoa.

Esse é o ponto em que Ansible deixa de ser uma coleção de arquivos YAML e se torna engenharia.


Conclusão — Não entre em pânico, versione o Playbook

Ansible não é apenas uma ferramenta para executar comandos em vários servidores.

Ele representa uma forma estruturada de administrar sistemas.

Com ele, podemos transformar operações manuais em processos:

  • repetíveis;

  • previsíveis;

  • auditáveis;

  • seguros;

  • versionados;

  • testáveis;

  • reutilizáveis.

Para um programador COBOL, muitos conceitos são menos alienígenas do que parecem.

O Inventory define os destinos.

O Playbook organiza a execução.

As Tasks representam passos.

Os módulos realizam operações.

As variáveis parametrizam.

Os Facts descrevem o ambiente.

Os Handlers reagem às mudanças.

As Roles organizam componentes.

As Collections distribuem funcionalidades.

O Vault protege segredos.

Git registra a história.

Jenkins coordena o fluxo.

Ansible executa.

E o z/OS, apesar de observar toda essa modernidade com a serenidade de quem já sobreviveu a inúmeras previsões de extinção, também pode participar dessa automação.

O melhor caminho para aprender é começar pequeno.

Crie um inventário.

Execute um ping.

Escreva um Playbook.

Crie um arquivo.

Instale um pacote.

Use uma variável.

Adicione uma condição.

Implemente um Handler.

Transforme o código em uma Role.

Coloque no Git.

Adicione testes.

Integre a uma pipeline.

Automatize um processo real.

Depois, execute tudo novamente.

Se o resultado continuar previsível, você estará no caminho correto.

Se o ambiente desaparecer, verifique se usou:

state: absent

em algum lugar particularmente inconveniente.

No universo da automação, como no mainframe, toda grande jornada começa com uma pequena instrução.

No COBOL:

PROCEDURE DIVISION.

No Ansible:

---

E em qualquer viagem técnica realmente perigosa:

Não entre em pânico. Faça backup, valide a sintaxe e nunca teste pela primeira vez em produção.

sábado, 16 de maio de 2020

Ansible sem Mistérios no Windows

Bellacosa Mainframe e o ansible sem misterios no Windows


☕ Um Café no Bellacosa Mainframe

Ansible sem Mistérios no Windows

O guia do Programador COBOL Padawan para automatizar Linux, Apache, Java, WebSphere e IBM Z sem abandonar o legado

Existe um momento na carreira de todo Programador COBOL em que ele percebe uma verdade desconfortável:

o programa pode estar perfeito, mas existe um universo inteiro entre o código-fonte e a produção.

É preciso compilar.

Fazer o link-edit.

Copiar módulos de carga.

Executar testes.

Atualizar bibliotecas.

Submeter JCL.

Configurar servidores.

Alterar arquivos.

Reiniciar serviços.

Verificar logs.

Validar portas.

Confirmar se a aplicação voltou a responder.

E, muitas vezes, repetir tudo isso em desenvolvimento, homologação, contingência e produção.

Durante décadas, essas tarefas foram realizadas por meio de procedimentos escritos em documentos, planilhas, scripts isolados e valiosos conhecimentos armazenados na memória de profissionais veteranos.

Funcionava?

Sim.

Mas também criava uma perigosa dependência de operações manuais.

Um comando digitado incorretamente, um membro copiado para a biblioteca errada ou uma configuração esquecida poderia transformar uma implantação aparentemente simples em um incidente digno de um alerta vermelho na ponte da USS Enterprise.

É justamente nesse espaço que entra o Ansible.

Ele não veio para substituir COBOL, JCL, CICS, Db2, IMS, Linux, Java ou WebSphere.

Ele veio para orquestrar essas tecnologias, transformando procedimentos manuais em automações documentadas, repetíveis, versionáveis e auditáveis.

Portanto, sente-se na cadeira de comando, Padawan. Neste artigo construiremos um laboratório gratuito no Windows, instalaremos o Ansible, criaremos nossos primeiros Playbooks, configuraremos Apache e Java e entenderemos como essa ferramenta se conecta ao universo do IBM Z.


1. Afinal, o que é o Ansible?

O Ansible é uma tecnologia de automação de TI capaz de executar tarefas como:

  • configuração de servidores;

  • instalação de programas;

  • implantação de aplicações;

  • provisionamento de infraestrutura;

  • execução de comandos;

  • administração de serviços;

  • automação de redes;

  • integração de ambientes híbridos;

  • orquestração de processos com várias etapas.

Em vez de um administrador acessar manualmente cada máquina, o Ansible recebe uma descrição do que deve ser feito e executa essas ações nos equipamentos selecionados.

A documentação oficial define o Ansible como uma tecnologia aberta capaz de descrever e automatizar ambientes de TI, desde pequenos laboratórios domésticos até infraestruturas corporativas de grande escala. (Ansible Docs)

Imagine que uma empresa tenha:

  • 40 servidores Linux;

  • 12 servidores Apache;

  • 8 instâncias de WebSphere;

  • 4 ambientes Java;

  • um IBM Z;

  • dezenas de regiões CICS;

  • centenas de bibliotecas e jobs.

Sem automação, alguém precisaria entrar máquina por máquina para realizar as alterações.

Com Ansible, podemos escrever uma instrução como:

- name: Garantir que o Apache esteja instalado
  ansible.builtin.apt:
    name: apache2
    state: present

Essa pequena tarefa declara um estado desejado:

“O pacote Apache deve estar instalado.”

O Ansible analisa o ambiente e tenta conduzi-lo até esse estado.

Essa diferença é fundamental.

Em um Shell Script tradicional, normalmente escrevemos uma sequência de comandos:

apt update
apt install apache2
systemctl start apache2

No Ansible, descrevemos principalmente o resultado que queremos alcançar.

Essa abordagem aproxima a infraestrutura do desenvolvimento de software.


2. Infraestrutura como código

Durante muito tempo, a infraestrutura foi tratada como algo quase artesanal.

Um especialista configurava um servidor.

Outro alterava uma propriedade.

Um terceiro modificava o firewall.

Cada mudança poderia ser registrada em um chamado, mas nem sempre era possível reconstruir exatamente o ambiente apenas lendo a documentação.

A Infraestrutura como Código, conhecida pela sigla IaC — Infrastructure as Code, muda essa lógica.

Configurações passam a ser armazenadas em arquivos.

Esses arquivos podem ser:

  • revisados;

  • comparados;

  • versionados no Git;

  • submetidos à aprovação;

  • testados;

  • executados novamente;

  • reutilizados em outros ambientes.

Para um Programador COBOL, a analogia é simples.

Imagine que a configuração de um servidor seja como um programa executável sem código-fonte.

Ele funciona, mas ninguém sabe exatamente como foi construído.

O Ansible devolve o “fonte” da infraestrutura.

O Playbook passa a representar a sequência lógica usada para construir ou configurar aquele ambiente.


3. Como o Ansible funciona?

O Ansible trabalha, de maneira simplificada, com dois lados:

┌──────────────────────────────┐
│       CONTROL NODE           │
│                              │
│ Ansible                      │
│ Inventários                  │
│ Playbooks                    │
│ Variáveis                    │
│ Credenciais                  │
└──────────────┬───────────────┘
               │
          SSH, APIs ou
       protocolos específicos
               │
 ┌─────────────┼───────────────┐
 │             │               │
 ▼             ▼               ▼
Linux       IBM Z          Windows
Apache      z/OS           Servidores
Java        USS            corporativos

O Control Node é a máquina onde o Ansible é executado.

Os Managed Nodes são os sistemas administrados.

Em ambientes Linux e Unix, a comunicação costuma ocorrer por SSH.

Para administrar Windows como destino, o Ansible pode utilizar mecanismos como WinRM. A documentação também oferece módulos específicos para instalar programas, administrar atualizações, usuários, grupos, serviços e outros componentes do Windows. (Ansible Docs)

No IBM Z, a comunicação depende da coleção utilizada e dos pré-requisitos configurados. A coleção IBM z/OS Core, por exemplo, permite que o Ansible execute módulos no z/OS e devolva os resultados ao controlador. (IBM GitHub)


4. O que significa dizer que o Ansible é “agentless”?

Muitas plataformas de administração precisam instalar permanentemente um agente em cada servidor.

Esse agente fica ativo, recebe comandos e informa o estado da máquina.

O Ansible adota uma abordagem diferente em muitos de seus cenários: ele normalmente utiliza mecanismos já existentes no sistema, como SSH, bibliotecas Python ou APIs.

Isso reduz a necessidade de manter um programa específico do Ansible permanentemente executando em cada Linux administrado.

Mas “agentless” não significa “sem requisitos”.

A máquina de destino ainda pode precisar de:

  • SSH configurado;

  • usuário autorizado;

  • Python compatível;

  • permissões administrativas;

  • bibliotecas adicionais;

  • APIs ou componentes específicos.

No z/OS, por exemplo, diferentes versões da coleção podem exigir combinações específicas de ansible-core, IBM Open Enterprise SDK for Python e Z Open Automation Utilities, o ZOAU. Por isso, sempre é necessário conferir a matriz de requisitos da versão utilizada. (IBM GitHub)

Esse é um erro comum do Padawan:

“Se não tem agente, então não precisa preparar nada.”

Precisa, sim.

A ausência de um agente próprio apenas simplifica parte da arquitetura.


5. Posso instalar Ansible no Windows?

A resposta correta é:

podemos estudar e executar Ansible em uma máquina Windows usando WSL, mas o Ansible não é executado nativamente no Windows como Control Node tradicional.

A documentação oficial informa que o Windows não é suportado como Control Node nativo, mas que é possível executar Ansible no Windows por meio do Windows Subsystem for Linux — WSL ou de um contêiner. A mesma documentação alerta que o uso de WSL como controlador não é suportado para sistemas de produção. Para aprendizado, testes locais e desenvolvimento, entretanto, ele é uma excelente estação de treinamento. (Ansible Docs)

Nossa arquitetura de laboratório será esta:

Windows 11
│
├── PowerShell
├── Navegador
├── Visual Studio Code
│
└── WSL 2
    └── Ubuntu
        ├── Bash
        ├── Python
        ├── Git
        ├── Ansible
        ├── Apache
        ├── Java
        └── Playbooks YAML

O Windows continuará sendo sua nave principal.

O Ubuntu no WSL será a sala de máquinas onde o Ansible será executado.


6. O que é WSL?

WSL significa Windows Subsystem for Linux.

Ele permite executar uma distribuição GNU/Linux diretamente no Windows, incluindo ferramentas de linha de comando, Bash, gerenciadores de pacotes e aplicações Linux, sem exigir uma instalação dual boot. A Microsoft apresenta o WSL justamente como uma maneira de utilizar ambientes Linux e Windows na mesma estação. (Microsoft Learn)

Para o nosso laboratório, usaremos o WSL 2.

Ele oferece um ambiente Linux muito mais próximo de uma instalação real, sendo adequado para estudar:

  • Bash;

  • SSH;

  • Git;

  • Python;

  • Ansible;

  • Apache;

  • Java;

  • Docker;

  • ferramentas DevOps.

Easter egg da Frota Estelar

O WSL é como o Holodeck da Enterprise.

Você continua fisicamente dentro do Windows, mas entra em um ambiente Linux suficientemente convincente para executar ferramentas, criar arquivos, instalar serviços e praticar comandos como se estivesse em outra nave.

A diferença é que, se o laboratório der errado, você não precisará chamar o Chefe O’Brien.

Na maioria das vezes.


7. Passo a passo: instalando o WSL 2

Abra o PowerShell como administrador.

Execute:

wsl --install

Esse é o método simplificado recomendado atualmente pela Microsoft. Ele habilita os componentes necessários e normalmente instala o Ubuntu como distribuição padrão. Depois da instalação, o computador poderá solicitar uma reinicialização. (Microsoft Learn)

Após reiniciar, abra novamente o PowerShell e execute:

wsl --list --verbose

Ou a forma abreviada:

wsl -l -v

Você deverá encontrar algo semelhante a:

  NAME      STATE           VERSION
* Ubuntu    Stopped         2

Caso o Ubuntu apareça como WSL 1, execute:

wsl --set-version Ubuntu 2

Para determinar que novas distribuições utilizem WSL 2 por padrão:

wsl --set-default-version 2

Novas instalações feitas por wsl --install normalmente já utilizam o WSL 2 por padrão. (Microsoft Learn)

Quando abrir o Ubuntu pela primeira vez, será necessário criar:

  • um nome de usuário Linux;

  • uma senha Linux.

Você pode escolher:

bellacosa

ou:

cobolpadawan

Ao digitar a senha no terminal Linux, nenhum asterisco aparecerá.

Não é erro.

Não é travamento.

Não é interferência dos Borg.

O Linux simplesmente não exibe os caracteres da senha.


8. Preparando o Ubuntu

Abra o Ubuntu e execute:

sudo apt update
sudo apt upgrade -y

O primeiro comando atualiza a lista de pacotes disponíveis.

O segundo instala as atualizações.

Depois, instale algumas ferramentas úteis:

sudo apt install git python3 python3-pip openssh-client nano curl -y

Essas ferramentas terão funções importantes:

  • git: versionamento;

  • python3: execução de módulos;

  • pip: instalação de pacotes Python;

  • openssh-client: conexões SSH;

  • nano: editor simples;

  • curl: testes de páginas e APIs.


9. Instalando o Ansible

Para um laboratório inicial no Ubuntu, podemos utilizar:

sudo apt install ansible -y

Depois, confirme:

ansible --version

A saída deve apresentar informações como:

ansible [core ...]
config file = ...
python version = ...
jinja version = ...

A documentação oficial também descreve métodos de instalação por pacotes das distribuições e por ferramentas do ecossistema Python. A melhor escolha depende do objetivo: simplicidade para estudo, controle rigoroso de versões, desenvolvimento de coleções ou uso corporativo. (Ansible Docs)

Para nosso primeiro Holodeck, o pacote do Ubuntu é suficiente.


10. Criando a estrutura do laboratório

No Ubuntu, execute:

mkdir -p ~/ansible-lab
cd ~/ansible-lab

Verifique:

pwd

O resultado deverá ser semelhante a:

/home/bellacosa/ansible-lab

Crie algumas pastas:

mkdir -p playbooks inventory files templates roles

Nossa estrutura ficará assim:

ansible-lab/
├── inventory/
├── playbooks/
├── files/
├── templates/
└── roles/

Não precisamos usar todas imediatamente.

Mas estamos preparando o laboratório para crescer de maneira organizada.


11. Inventário: o mapa estelar do Ansible

O inventário informa ao Ansible quais máquinas podem ser administradas.

Crie o arquivo:

nano inventory/hosts.ini

Digite:

[local]
localhost ansible_connection=local

Salve pressionando:

Ctrl + O
Enter
Ctrl + X

Esse inventário cria um grupo chamado local.

Dentro dele existe uma máquina:

localhost

A variável:

ansible_connection=local

informa que a execução será feita diretamente no Ubuntu do WSL, sem abrir uma conexão SSH.

A documentação do Ansible considera inventários, Playbooks, plays, tasks, roles e collections entre seus conceitos fundamentais. (Ansible Docs)

Pense no inventário como um mapa estelar:

[web]
web01
web02

[database]
db01

[mainframe]
zos01

[producao]
web01
web02
db01
zos01

Você pode agrupar os alvos por:

  • tecnologia;

  • ambiente;

  • localização;

  • aplicação;

  • função;

  • criticidade.


12. O primeiro contato: o módulo ping

Execute:

ansible all -i inventory/hosts.ini -m ping

Resultado esperado:

localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Esse ping não é exatamente o mesmo comando de rede usado para testar ICMP.

O módulo do Ansible verifica se ele consegue executar corretamente no destino e obter uma resposta.

Podemos decompor o comando:

ansible

Programa usado para executar uma ação rápida.

all

Todos os hosts do inventário.

-i inventory/hosts.ini

Arquivo de inventário utilizado.

-m ping

Módulo que será executado.

Esse tipo de comando é chamado de ad hoc command.

São ordens rápidas, úteis para consultas, diagnósticos e pequenas operações.


13. Coletando informações do Linux

Execute:

ansible all -i inventory/hosts.ini -m setup

O Ansible retornará uma grande quantidade de informações:

  • distribuição Linux;

  • versão do sistema;

  • processadores;

  • memória;

  • interfaces de rede;

  • endereços IP;

  • arquitetura;

  • variáveis do ambiente;

  • discos;

  • hostname.

Essas informações são chamadas de facts.

Podemos filtrar a resposta:

ansible all -i inventory/hosts.ini -m setup \
  -a "filter=ansible_distribution*"

Ou consultar a memória:

ansible all -i inventory/hosts.ini -m setup \
  -a "filter=ansible_memtotal_mb"

Os facts podem ser usados nos Playbooks para tomar decisões.

Exemplo conceitual:

- name: Instalar pacote no Ubuntu
  ansible.builtin.apt:
    name: apache2
    state: present
  when: ansible_distribution == "Ubuntu"

Assim, a automação pode adaptar-se ao sistema encontrado.


14. O que é um Playbook?

Um Playbook é um arquivo YAML que descreve uma ou mais automações.

A documentação oficial explica que Playbooks reúnem tarefas e módulos para executar mudanças de maneira organizada nos sistemas selecionados. (Ansible Docs)

Crie:

nano playbooks/primeiro-playbook.yml

Conteúdo:

---
- name: Primeiro treinamento Bellacosa Mainframe
  hosts: local
  connection: local
  gather_facts: true

  tasks:
    - name: Criar diretório do laboratório
      ansible.builtin.file:
        path: /tmp/bellacosa-lab
        state: directory
        mode: "0755"

    - name: Criar mensagem para o Padawan
      ansible.builtin.copy:
        dest: /tmp/bellacosa-lab/mensagem.txt
        content: |
          Laboratório Ansible em funcionamento.
          Automação autorizada pela Frota Estelar.
          O COBOL continua vivo.
        mode: "0644"

    - name: Mostrar a distribuição Linux
      ansible.builtin.debug:
        msg: "Sistema detectado: {{ ansible_distribution }} {{ ansible_distribution_version }}"

Execute:

ansible-playbook \
  -i inventory/hosts.ini \
  playbooks/primeiro-playbook.yml

Confira o arquivo:

cat /tmp/bellacosa-lab/mensagem.txt

15. Entendendo o YAML sem entrar em um buraco negro

YAML é um formato de serialização muito utilizado em configurações.

Sua estrutura depende fortemente de indentação.

Exemplo:

tripulante:
  nome: Bellacosa
  funcao: Programador COBOL
  nivel: Padawan
  tecnologias:
    - COBOL
    - JCL
    - Ansible

O YAML possui:

  • pares de chave e valor;

  • listas;

  • objetos aninhados;

  • valores booleanos;

  • números;

  • textos.

No Ansible:

- name: Criar arquivo
  ansible.builtin.file:
    path: /tmp/teste.txt
    state: touch

Temos:

  • uma tarefa;

  • um nome descritivo;

  • um módulo;

  • parâmetros enviados ao módulo.

Regra de ouro

Use espaços.

Não utilize tabulação.

Uma indentação incorreta pode impedir a leitura do arquivo ou, pior, alterar sua estrutura lógica.

Para verificar a sintaxe:

ansible-playbook \
  -i inventory/hosts.ini \
  playbooks/primeiro-playbook.yml \
  --syntax-check

16. Idempotência: a disciplina vulcana

Execute novamente o primeiro Playbook.

Na primeira execução, algumas tarefas podem aparecer como:

changed

Na segunda, provavelmente aparecerão como:

ok

Por quê?

Porque o diretório e o arquivo já estão no estado desejado.

Esse comportamento é chamado de idempotência.

A documentação observa que módulos idempotentes procuram produzir o mesmo resultado independentemente de o Playbook ser executado uma ou várias vezes, embora nem todo Playbook seja automaticamente idempotente. (Ansible Docs)

Matematicamente, a ideia lembra:

f(f(x)) = f(x)

Depois que o estado desejado é alcançado, repetir a operação não deveria criar uma situação diferente.

Para um veterano do batch, podemos comparar com um processo restartable bem projetado.

Um job confiável deve saber:

  • o que já foi processado;

  • onde continuar;

  • quando não repetir uma ação destrutiva;

  • como retornar ao estado esperado.

A idempotência é uma das bases da automação segura.


17. Instalando Apache com Ansible

Agora teremos nossa primeira missão real.

Crie:

nano playbooks/apache.yml

Conteúdo:

---
- name: Configurar Apache no Holodeck
  hosts: local
  connection: local
  become: true

  tasks:
    - name: Atualizar cache de pacotes
      ansible.builtin.apt:
        update_cache: true
        cache_valid_time: 3600

    - name: Instalar Apache
      ansible.builtin.apt:
        name: apache2
        state: present

    - name: Publicar página Bellacosa
      ansible.builtin.copy:
        dest: /var/www/html/index.html
        content: |
          <!DOCTYPE html>
          <html lang="pt-BR">
          <head>
            <meta charset="UTF-8">
            <title>Bellacosa Ansible Lab</title>
          </head>
          <body>
            <h1>Ansible sem Mistérios</h1>
            <p>Servidor Apache configurado automaticamente.</p>
            <p>Mensagem da ponte: o COBOL está integrado ao futuro.</p>
          </body>
          </html>
        mode: "0644"
      notify: Reiniciar Apache

    - name: Garantir que o Apache esteja iniciado
      ansible.builtin.service:
        name: apache2
        state: started
        enabled: true

  handlers:
    - name: Reiniciar Apache
      ansible.builtin.service:
        name: apache2
        state: restarted

Execute:

ansible-playbook \
  -i inventory/hosts.ini \
  playbooks/apache.yml \
  --ask-become-pass

Digite a senha do usuário Ubuntu.

Depois, teste:

curl http://localhost

Abra também no navegador do Windows:

http://localhost

Se tudo funcionar, você verá a página criada pelo Ansible.

O que é become?

A instrução:

become: true

indica que determinadas tarefas precisam de privilégios elevados, normalmente usando sudo.

O que é um handler?

O handler é uma tarefa acionada por uma notificação.

Observe:

notify: Reiniciar Apache

O Apache será reiniciado apenas quando a tarefa que publica a página realmente provocar uma mudança.

Isso evita reinicializações desnecessárias.

É como dizer:

“Não acorde o Capitão apenas para informar que nada mudou.”


18. Instalando Java

Crie:

nano playbooks/java.yml

Conteúdo:

---
- name: Preparar ambiente Java
  hosts: local
  connection: local
  become: true

  tasks:
    - name: Instalar OpenJDK
      ansible.builtin.apt:
        name: openjdk-17-jdk
        state: present
        update_cache: true

    - name: Consultar versão do Java
      ansible.builtin.command:
        cmd: java -version
      register: resultado_java
      changed_when: false

    - name: Exibir versão instalada
      ansible.builtin.debug:
        var: resultado_java.stderr_lines

Execute:

ansible-playbook \
  -i inventory/hosts.ini \
  playbooks/java.yml \
  --ask-become-pass

O parâmetro:

register: resultado_java

guarda a resposta de uma tarefa em uma variável.

Depois, usamos:

ansible.builtin.debug:
  var: resultado_java.stderr_lines

para mostrar parte dessa resposta.

A instrução:

changed_when: false

informa que a consulta à versão do Java não modifica o sistema.

Sem isso, determinados comandos podem ser marcados como mudança mesmo quando apenas realizam uma leitura.


19. Como o Ansible se relaciona com Java?

O Ansible não substitui a JVM nem escreve automaticamente a lógica da aplicação.

Ele automatiza o ambiente no qual a aplicação Java será executada.

Pode, por exemplo:

  • instalar o Java;

  • criar usuários de serviço;

  • criar diretórios;

  • copiar arquivos JAR;

  • distribuir arquivos WAR e EAR;

  • configurar variáveis de ambiente;

  • alterar parâmetros da JVM;

  • criar certificados;

  • instalar serviços;

  • configurar logs;

  • iniciar e parar aplicações;

  • validar portas;

  • testar URLs de saúde;

  • executar scripts de implantação.

Uma aplicação Java pode ser construída em um pipeline e depois entregue por Ansible:

Git
  ↓
Compilação Maven ou Gradle
  ↓
Testes
  ↓
Artefato JAR, WAR ou EAR
  ↓
Ansible
  ↓
Tomcat, Liberty ou WebSphere

O Ansible representa o oficial de transporte.

Ele recebe o artefato e garante que chegue ao destino correto, com a configuração correta.


20. E o WebSphere?

WebSphere é uma plataforma corporativa complexa.

Uma automação pode envolver:

  • Deployment Manager;

  • Node Agents;

  • clusters;

  • servidores de aplicação;

  • aplicações EAR;

  • DataSources;

  • JDBC Providers;

  • JMS;

  • segurança;

  • propriedades da JVM;

  • certificados;

  • scripts wsadmin;

  • arquivos de configuração;

  • rotinas de health check.

No WebSphere tradicional, o Ansible pode ser usado para coordenar comandos e scripts administrativos existentes.

Um fluxo conceitual seria:

1. Retirar servidor do balanceamento
2. Parar aplicação
3. Copiar novo EAR
4. Executar script wsadmin
5. Sincronizar nós
6. Iniciar aplicação
7. Testar URL
8. Recolocar servidor no balanceamento

O valor do Ansible não está apenas em executar um comando.

Está em organizar toda a sequência, aplicar condições, capturar erros e impedir que a próxima etapa seja executada quando a anterior falhar.

Cuidado de Engenharia

Não trate WebSphere como se fosse apenas um diretório onde você copia um EAR.

Uma implantação corporativa pode exigir:

  • sincronização;

  • rollout gradual;

  • controle de sessão;

  • compatibilidade entre versões;

  • rollback;

  • validação de dependências;

  • gestão de certificados;

  • aprovação operacional.

O Ansible automatiza o procedimento, mas não elimina a necessidade de compreendê-lo.


21. Conectando Ansible ao IBM Z

Agora chegamos ao setor onde pulsa o coração do Bellacosa Mainframe.

A IBM disponibiliza conteúdo Ansible voltado ao IBM Z. O objetivo é integrar o IBM Z à estratégia mais ampla de automação corporativa, unificando configuração, provisionamento, implantação e orquestração de fluxos. (Ansible Collections)

A coleção IBM z/OS Core oferece módulos para atividades como:

  • criar data sets;

  • copiar conteúdo;

  • submeter jobs;

  • consultar jobs;

  • recuperar saídas do JES;

  • executar comandos;

  • trabalhar com arquivos USS;

  • processar codificações;

  • manipular recursos do z/OS.

A documentação oficial destaca explicitamente operações como criação de data sets, submissão e consulta de jobs, recuperação de output e codificação de dados. (IBM GitHub)

Para instalar a coleção no laboratório:

ansible-galaxy collection install ibm.ibm_zos_core

Confira:

ansible-galaxy collection list

A documentação IBM informa que coleções podem ser obtidas por meios como Ansible Galaxy, Ansible Automation Hub ou construção local, dependendo da distribuição e do modelo de suporte adotado. (IBM GitHub)


22. Criando um Playbook conceitual para z/OS

Mesmo sem acesso imediato a um mainframe, você pode começar a estudar a estrutura.

Crie:

nano playbooks/zos-exemplo.yml

Conteúdo conceitual:

---
- name: Laboratório conceitual IBM Z
  hosts: zos
  gather_facts: false

  tasks:
    - name: Criar data set sequencial
      ibm.ibm_zos_core.zos_data_set:
        name: BELLACOS.TRAINING.DATA
        type: seq
        state: present
        record_format: fb
        record_length: 80

    - name: Submeter JCL de treinamento
      ibm.ibm_zos_core.zos_job_submit:
        src: BELLACOS.TRAINING.JCL(HELLO)
        location: data_set
        wait_time_s: 30

A documentação do módulo zos_job_submit informa que ele pode submeter JCL armazenado em data set, arquivo no USS ou arquivo localizado no controlador, além de acompanhar a conclusão do job. (IBM GitHub)

Para executar de verdade, será necessário preparar:

  • host z/OS;

  • acesso de rede;

  • SSH;

  • usuário e permissões;

  • USS;

  • Python suportado;

  • ZOAU;

  • variáveis de ambiente;

  • inventário;

  • versões compatíveis.

Instalar a coleção no WSL não cria um mainframe mágico dentro do notebook.

Ela apenas prepara o controlador para conversar com um ambiente IBM Z que atenda aos requisitos.


23. Exemplo de inventário para IBM Z

Um inventário conceitual poderia ser:

[zos]
zos01 ansible_host=mainframe.empresa.local

[zos:vars]
ansible_connection=ssh
ansible_user=USUARIO
ansible_python_interpreter=/usr/lpp/IBM/cyp/v3r*/pyz/bin/python3

Os caminhos e parâmetros reais dependem da instalação da empresa.

Nunca copie cegamente configurações de um artigo para produção.

Consulte:

  • versão da coleção;

  • versão do z/OS;

  • versão do Python;

  • versão do ZOAU;

  • política de segurança;

  • configuração de SSH;

  • padrões internos.

Essa é uma lição essencial:

Um bom Playbook é reutilizável. Uma boa implantação, porém, respeita as particularidades do ambiente.


24. Ansible e JCL: inimigos ou aliados?

Eles são aliados.

O Ansible não substitui JCL.

JCL continua sendo a linguagem de controle dos jobs no z/OS.

O que o Ansible pode fazer é:

  • selecionar o JCL;

  • transferi-lo;

  • alterar variáveis;

  • submetê-lo;

  • acompanhar o job;

  • verificar o return code;

  • coletar o spool;

  • decidir se o pipeline pode continuar.

Imagine:

Ansible
   ↓
Submete JCL de compilação
   ↓
Espera conclusão
   ↓
Verifica RC
   ├── RC 0: continua
   ├── RC 4: aplica regra definida
   └── RC 8+: interrompe implantação

Essa combinação preserva a força do JCL e adiciona uma camada moderna de orquestração.

É como instalar um painel LCARS na frente de uma sala de máquinas histórica.

O motor continua sendo poderoso.

A interface e a integração tornam-se mais modernas.


25. Ansible, COBOL e DevOps

Um pipeline híbrido poderia funcionar assim:

1. Desenvolvedor envia código COBOL ao Git
2. Pipeline inicia
3. Build é executado
4. Testes automatizados são realizados
5. Ansible transfere componentes
6. JCL de implantação é submetido
7. Módulos de carga são atualizados
8. BIND de Db2 é executado
9. Aplicação é validada
10. Relatório é produzido

Em uma solução distribuída:

1. COBOL processa regras de negócio no IBM Z
2. Java fornece uma camada de serviços
3. WebSphere ou Liberty hospeda aplicações
4. Apache atua como servidor ou proxy
5. Ansible coordena a configuração
6. Jenkins ou outra ferramenta inicia o pipeline
7. Git guarda código e Playbooks

O Programador COBOL que aprende Ansible deixa de enxergar apenas o programa e passa a compreender o fluxo operacional completo.

Esse profissional consegue conversar com:

  • desenvolvimento;

  • infraestrutura;

  • middleware;

  • segurança;

  • produção;

  • DevOps;

  • arquitetura;

  • cloud;

  • equipes Linux;

  • equipes IBM Z.


26. Segurança: nunca coloque senhas no Playbook

Nunca faça isto:

senha: MinhaSenha123

E muito menos envie esse arquivo para o Git.

Credenciais podem ser tratadas com mecanismos como:

  • Ansible Vault;

  • variáveis protegidas;

  • gerenciadores de segredos;

  • credenciais da plataforma corporativa;

  • chaves SSH;

  • tokens de curta duração;

  • cofres externos.

Para criar um arquivo protegido com Ansible Vault:

ansible-vault create secrets.yml

Para editar:

ansible-vault edit secrets.yml

Para visualizar:

ansible-vault view secrets.yml

O objetivo não é esconder uma senha de maneira improvisada.

É impedir que segredos sejam armazenados em texto aberto ou espalhados por scripts.

Regra de segurança da Frota

Um Playbook pode ser compartilhado.

Uma senha não.


27. Modos seguros de teste

Antes de executar uma automação em ambiente importante, use ferramentas de validação.

Verificar a sintaxe

ansible-playbook playbooks/apache.yml --syntax-check

Simular alterações

ansible-playbook \
  -i inventory/hosts.ini \
  playbooks/apache.yml \
  --check

O modo --check tenta indicar o que seria modificado sem aplicar todas as mudanças.

Entretanto, nem todo módulo consegue simular perfeitamente suas ações.

Portanto, --check ajuda, mas não substitui um ambiente de teste.

Mostrar diferenças

ansible-playbook \
  -i inventory/hosts.ini \
  playbooks/apache.yml \
  --check \
  --diff

Limitar a execução

ansible-playbook \
  -i inventory/hosts.ini \
  playbooks/apache.yml \
  --limit localhost

Em ambientes reais, --limit é valioso para realizar um teste controlado em uma única máquina antes de alcançar todo o grupo.


28. Use nomes que expliquem a operação

Evite:

- name: Executar comando

Prefira:

- name: Reiniciar Apache após alteração do arquivo de configuração

Evite:

- name: Copiar arquivo

Prefira:

- name: Publicar página inicial do portal de treinamento

O Playbook deve funcionar como documentação executável.

Um operador deve conseguir lê-lo e compreender:

  • o que acontecerá;

  • em quais máquinas;

  • em que sequência;

  • sob quais condições.

Código misterioso pertence aos arquivos secretos da Seção 31, não à automação corporativa.


29. Não abuse dos módulos command e shell

É possível executar:

ansible.builtin.command:
  cmd: touch /tmp/arquivo.txt

Mas existe um módulo específico para arquivos:

ansible.builtin.file:
  path: /tmp/arquivo.txt
  state: touch

O módulo especializado geralmente conhece melhor o recurso.

Ele pode:

  • verificar o estado;

  • detectar mudanças;

  • validar parâmetros;

  • oferecer melhor idempotência;

  • retornar informações estruturadas.

Use command ou shell quando necessário, mas pesquise antes se existe um módulo apropriado.

A documentação do Ansible mantém um índice de módulos disponíveis nas diversas coleções. (Ansible Docs)


30. Evoluindo para templates

Imagine um arquivo de configuração do Apache diferente para cada ambiente.

Em desenvolvimento:

ServerName dev.bellacosa.local

Em produção:

ServerName www.bellacosa.com

Em vez de manter dois arquivos quase iguais, podemos utilizar um template Jinja2.

Crie:

nano templates/site.conf.j2

Conteúdo:

ServerName {{ nome_servidor }}
DocumentRoot {{ diretorio_site }}

No Playbook:

- name: Gerar configuração do site
  ansible.builtin.template:
    src: ../templates/site.conf.j2
    dest: /etc/apache2/sites-available/bellacosa.conf
    mode: "0644"

Com variáveis:

vars:
  nome_servidor: localhost
  diretorio_site: /var/www/html

Os templates permitem criar configurações dinâmicas sem duplicar arquivos.

Para o Programador COBOL, pense em um template como um esqueleto parametrizado, semelhante a uma PROC de JCL que recebe símbolos.


31. Roles: transformando Playbooks em componentes reutilizáveis

Quando o laboratório crescer, um único arquivo poderá ficar enorme.

As roles organizam a automação em componentes.

Exemplo:

roles/
└── apache/
    ├── tasks/
    │   └── main.yml
    ├── handlers/
    │   └── main.yml
    ├── templates/
    ├── files/
    ├── defaults/
    │   └── main.yml
    └── vars/
        └── main.yml

Uma role poderia representar:

  • instalação do Apache;

  • preparação de Java;

  • implantação WebSphere;

  • configuração do MQ;

  • preparação de um servidor;

  • submissão de jobs z/OS;

  • validação de uma aplicação COBOL.

O Playbook principal passa a ser simples:

---
- name: Preparar servidor web
  hosts: web
  become: true

  roles:
    - apache
    - java

Esse modelo melhora:

  • manutenção;

  • reutilização;

  • padronização;

  • testes;

  • documentação.


32. Ansible Community e Ansible Automation Platform

No laboratório, estamos usando a tecnologia aberta pela linha de comando.

Em empresas, também existe a Red Hat Ansible Automation Platform, voltada à execução, governança e escala corporativa da automação. (redhat.com)

Uma plataforma corporativa pode adicionar recursos como:

  • interface central;

  • controle de acesso;

  • inventários gerenciados;

  • credenciais;

  • agendamentos;

  • registros de execução;

  • aprovação;

  • ambientes de execução;

  • integração com pipelines;

  • governança.

Mas não espere conhecer a plataforma corporativa para aprender.

Comece por:

YAML
Inventário
Módulos
Playbooks
Variáveis
Handlers
Templates
Roles
Git

A plataforma será muito mais fácil quando os fundamentos estiverem sólidos.


33. Visual Studio Code como painel LCARS

Instale no Windows:

  • Visual Studio Code;

  • extensão WSL;

  • extensão YAML;

  • extensão Ansible da Red Hat.

No Ubuntu:

cd ~/ansible-lab
code .

O VS Code abrirá a pasta dentro do ambiente WSL.

Essa combinação oferece:

  • destaque de sintaxe;

  • terminal integrado;

  • validação;

  • navegação de arquivos;

  • integração com Git;

  • sugestões;

  • pesquisa;

  • comparação de versões.

O terminal continuará sendo importante, mas você terá uma ponte de comando mais confortável.


34. Um laboratório com vários servidores

Depois de dominar o localhost, avance para múltiplos destinos.

Você pode usar:

  • máquinas virtuais;

  • servidores Linux antigos;

  • instâncias em nuvem;

  • contêineres de laboratório;

  • Raspberry Pi;

  • outro computador da rede.

Arquitetura:

WSL Ubuntu — Control Node
│
├── linux-web-01
├── linux-web-02
├── linux-java-01
└── zos-treinamento

Um inventário poderia ser:

[web]
linux-web-01
linux-web-02

[java]
linux-java-01

[linux:children]
web
java

Teste apenas o grupo web:

ansible web -i inventory/hosts.ini -m ping

Execute apenas em um host:

ansible linux-web-01 -i inventory/hosts.ini -m ping

Esse é o momento em que o laboratório deixa de parecer uma ferramenta local e começa a revelar sua capacidade de orquestração.


35. Plano de ação de 12 semanas

Semanas 1 e 2 — Academia da Frota

Objetivos:

  • instalar WSL 2;

  • conhecer comandos Linux;

  • instalar Ansible;

  • criar inventário local;

  • executar ping e setup.

Missão prática:

Criar um Playbook que gere três arquivos em /tmp.

Semanas 3 e 4 — YAML e módulos

Estudar:

  • listas;

  • dicionários;

  • variáveis;

  • file;

  • copy;

  • package;

  • service;

  • debug.

Missão prática:

Criar usuários, diretórios e arquivos de configuração em um Linux de laboratório.

Semanas 5 e 6 — Apache e Java

Estudar:

  • instalação de pacotes;

  • handlers;

  • templates;

  • serviços;

  • validação por URL;

  • variáveis registradas.

Missão prática:

Instalar Apache e Java e publicar uma página que mostre informações do servidor.

Semanas 7 e 8 — Git e organização

Estudar:

  • repositórios;

  • commits;

  • branches;

  • revisão;

  • roles;

  • estrutura de projetos;

  • Ansible Vault.

Missão prática:

Transformar a automação do Apache em uma role versionada no Git.

Semanas 9 e 10 — IBM Z

Estudar:

  • USS;

  • SSH no z/OS;

  • Python;

  • ZOAU;

  • coleções IBM;

  • zos_data_set;

  • zos_copy;

  • zos_job_submit;

  • consulta de jobs.

Missão prática:

Escrever Playbooks conceituais e, quando houver acesso, testá-los em um ambiente educacional autorizado.

Semanas 11 e 12 — Projeto final

Construir um fluxo que:

  1. prepare Linux;

  2. instale Java;

  3. configure Apache;

  4. publique uma aplicação;

  5. execute health check;

  6. gere relatório;

  7. inclua uma etapa conceitual para IBM Z.

Ao final, publique a documentação do projeto em seu repositório.


36. Dez erros clássicos do Padawan

1. Aprender somente copiando Playbooks

Copiar ajuda, mas você precisa entender cada tarefa.

2. Testar primeiro em produção

Produção não é Holodeck.

3. Armazenar senha no Git

Uma credencial vazada pode comprometer todo o ambiente.

4. Usar shell para tudo

Prefira módulos especializados.

5. Ignorar o inventário

Executar no grupo errado pode causar um desastre.

6. Não usar nomes descritivos

Uma tarefa sem descrição é um enigma para o operador.

7. Não verificar resultados

Instalação concluída não significa aplicação saudável.

8. Confundir automação com ausência de controle

Quanto maior o poder, maior deve ser a governança.

9. Ignorar versões

Coleções, Python, Ansible e sistemas precisam ser compatíveis.

10. Querer automatizar sem conhecer o processo

Se você não consegue executar o procedimento manualmente, provavelmente ainda não está pronto para automatizá-lo.


37. Curiosidades da sala de máquinas

O nome “Ansible” foi inspirado no conceito de um dispositivo fictício de comunicação instantânea encontrado na ficção científica.

É uma escolha perfeita.

O Ansible conecta sistemas distantes e transmite instruções de maneira coordenada, quase como se uma única ponte comandasse diferentes naves de uma frota.

Outra curiosidade importante é que o Ansible não está limitado à instalação de pacotes. Ele pode atuar na administração de redes, nuvens, sistemas operacionais, middleware, contêineres e mainframes.

Seu verdadeiro poder não está no comando individual.

Está na orquestração.

Instalar Apache é fácil.

Difícil é:

  1. retirar o servidor do balanceador;

  2. fazer backup;

  3. atualizar a aplicação;

  4. alterar configurações;

  5. reiniciar serviços;

  6. validar a página;

  7. restaurar o tráfego;

  8. interromper tudo e executar rollback se a validação falhar.

Esse fluxo completo é onde a automação se transforma em engenharia.


38. Por que um Programador COBOL deveria aprender Ansible?

Porque o mainframe não vive isolado.

Uma transação pode começar em:

  • aplicativo móvel;

  • navegador;

  • API;

  • microsserviço;

  • servidor Java;

  • mensageria;

  • z/OS Connect;

  • CICS;

  • programa COBOL;

  • Db2.

O COBOL pode continuar sendo o coração da regra de negócio, mas sua operação está conectada a um ecossistema híbrido.

O profissional que conhece apenas o programa vê uma sala.

O profissional que conhece automação vê a nave inteira.

Aprender Ansible ajuda o Programador COBOL a:

  • compreender DevOps;

  • participar de pipelines;

  • automatizar tarefas repetitivas;

  • reduzir erros;

  • dialogar com equipes Linux;

  • integrar IBM Z a ambientes distribuídos;

  • transformar procedimentos em código;

  • documentar operações;

  • colaborar com arquitetos;

  • modernizar sem destruir o legado.

Não se trata de abandonar COBOL.

Trata-se de colocar o COBOL dentro de uma estratégia de engenharia contemporânea.


39. A mensagem escondida no console

Existe um easter egg nesta jornada.

O verdadeiro tema deste artigo nunca foi apenas Ansible.

Foi repetibilidade.

Um programa confiável produz resultados previsíveis.

Um job confiável pode ser reiniciado.

Uma transação confiável preserva consistência.

Uma automação confiável conduz o ambiente até um estado conhecido.

COBOL e Ansible nasceram em épocas diferentes, mas compartilham um valor fundamental:

sistemas empresariais precisam ser compreensíveis, controláveis e previsíveis.

O COBOL organiza regras de negócio.

O JCL organiza processamento batch.

O Ansible organiza operações e infraestrutura.

Eles não são inimigos de gerações diferentes.

São oficiais de departamentos diferentes servindo na mesma nave.


Conclusão — O Padawan assume o console

Você não precisa comprar uma licença especial nem construir um data center para começar.

Com um computador Windows 11, WSL 2, Ubuntu e algumas horas de prática, já é possível montar um excelente laboratório de Ansible.

Comece pequeno:

localhost

Depois instale:

Apache

Em seguida:

Java

Aprenda:

Inventários
Playbooks
Módulos
Variáveis
Handlers
Templates
Roles
Vault
Git

Só então avance para:

WebSphere
Linux remoto
Pipelines
IBM Z
z/OS
Ambientes híbridos

Não tente automatizar toda a galáxia no primeiro Playbook.

Automatize uma tarefa.

Teste.

Execute novamente.

Observe a idempotência.

Documente.

Versione.

Melhore.

Depois automatize a próxima.

O futuro do mainframe não será construído apenas por quem conhece tecnologias novas, nem apenas por quem conhece tecnologias antigas.

Será construído por profissionais capazes de fazer essas tecnologias trabalharem juntas.

E quando alguém perguntar:

“Um Programador COBOL realmente precisa aprender Ansible?”

Você poderá responder:

“Não preciso aprender para abandonar o mainframe. Preciso aprender para comandar tudo o que existe ao redor dele.”

Esse é o caminho do Programador COBOL Padawan.

Do terminal 3270 ao YAML.

Do JCL ao Playbook.

Do batch noturno à automação contínua.

Do porão da sala de máquinas à cadeira de comando.

Vida longa ao COBOL. Vida longa à automação. E que nenhum deployment seja realizado manualmente numa sexta-feira à noite.

Vagner Renato Bellacosa, IBM Champion e especialista em IBM Mainframe
IBM Z17 SYSTEM ONLINE
Sobre o autor

Vagner Renato Bellacosa

IBM Champion 2026 • Especialista em IBM Mainframe

Vagner Renato Bellacosa trabalha com IBM Mainframe desde 1988 , é IBM Champion e especialista em COBOL, CICS, Db2, z/OS e IBM Z. Compartilha experiências profissionais, conhecimento técnico, história da computação e práticas do universo mainframe para aproximar novas gerações das tecnologias que sustentam empresas, bancos e governos ao redor do mundo.

IBM Champion IBM Z COBOL CICS Db2 z/OS Mainframe desde 1988