☕ Um Café no Bellacosa Mainframe
Gostou do conteúdo? Ajude a manter o café quente, o COBOL compilando e o mainframe acordado. 😄
☕ Pague um café ao Bellacosa

Translate

Mostrar mensagens com a etiqueta Terraform. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Terraform. Mostrar todas as mensagens

sábado, 12 de setembro de 2026

👄 COBOL Horror Picture Show — Frank-N-Furter e a Estranha Arte de Modernizar sem Matar a Criatura

 

Bellacosa Mainframe e a modernização do cobol

☕ Um Café no Bellacosa Mainframe

👄 COBOL Horror Picture Show — Frank-N-Furter e a Estranha Arte de Modernizar sem Matar a Criatura

“Don’t dream it. Be it.” — e, se estiver em produção há quarenta anos, talvez seja melhor descobrir primeiro todas as dependências antes de tentar transformá-lo.

Há alguma coisa deliciosamente apropriada em colocar Frank-N-Furter, de The Rocky Horror Picture Show, diante de uma arquitetura de modernização COBOL.

Pense na cena.

No centro do laboratório existe uma aplicação COBOL.

Ela é antiga.

Muito antiga.

Há décadas recebe transações, abre arquivos, atualiza bancos de dados, processa lotes durante a madrugada e alimenta sistemas que provavelmente nem existiam quando sua primeira versão foi compilada.

Em volta dela aparecem engenheiros carregando Git, Jenkins, Terraform, Ansible, AWS EC2, RDS, Secrets Manager e CloudWatch.

Luzes piscam.

Pipelines começam a executar.

Playbooks descem do Git.

EC2s surgem.

O banco ganha vida.

E alguém grita:

“IT'S ALIVE!”

Calma.

Frank-N-Furter ficaria encantado.

Eu ficaria procurando o JCL.

Porque existe uma diferença monumental entre fazer um programa COBOL executar em outro lugar e modernizar o sistema empresarial do qual aquele programa faz parte.

E é justamente essa diferença que vamos explorar.

Bem-vindo ao laboratório.



🎭 1. Antes de tudo: conheça o Dr. Frank-N-Furter

The Rocky Horror Picture Show nasceu como adaptação cinematográfica do musical The Rocky Horror Show, criado por Richard O'Brien, e chegou aos cinemas em 1975.

No centro daquela insanidade musical está o Dr. Frank-N-Furter, interpretado por Tim Curry.

Cientista.

Showman.

Manipulador.

Extravagante.

E, sobretudo, criador.

Frank não quer simplesmente estudar aquilo que existe.

Ele quer construir sua própria criatura.

Rocky nasce dentro do laboratório como materialização dessa ambição.

E é exatamente por isso que Frank é nosso tutor perfeito para esta conversa.

Modernização de sistemas também pode sofrer da síndrome de Frank-N-Furter:

ficamos tão fascinados com nossa capacidade de construir alguma coisa nova que esquecemos de perguntar se entendemos completamente aquilo que estamos substituindo.



⚡ 2. Há uma criatura COBOL sobre a mesa

Nossa arquitetura começa com algo aparentemente simples:

COBOL
   +
AWS EC2
   +
AWS RDS
   +
Ansible
   +
Terraform
   +
CI/CD

A proposta é elegante.

Temos ambientes:

DEV
 ↓
SIT
 ↓
UAT
 ↓
PRE-PROD
 ↓
PROD

Terraform provisiona infraestrutura.

Ansible configura máquinas e instala o ambiente necessário.

O pipeline controla o processo.

RDS fornece banco de dados gerenciado.

Git preserva código e configuração.

CloudWatch observa o ambiente.

Excelente.

Mas Frank-N-Furter aproxima-se da mesa, levanta o lençol e pergunta:

“Isso é realmente tudo que existe dentro da criatura?”

Não.

Quase nunca.



🧟 3. COBOL não é o monstro

Esta talvez seja a primeira grande inversão que precisamos fazer.

Quando alguém anuncia:

“Temos uma aplicação COBOL de quarenta anos.”

muita gente imediatamente imagina que encontrou o problema.

Não encontrou.

Encontrou uma linguagem.

O problema real pode estar em tudo aquilo que cresceu ao redor dela:

                COBOL
                  │
       ┌──────────┼──────────┐
       │          │          │
      CICS       IMS        Db2
       │          │          │
      VSAM       MQ        Stored
       │                   Procedures
       │
      JCL
       │
   Scheduler
       │
 GDG / datasets

Depois aparecem:

SORT
IDCAMS
REXX
PROCs
copybooks
utilities
FTP/SFTP
APIs
arquivos externos
interfaces
sistemas parceiros

Então alguém encontra um programa:

CALL 'XPTO123'

Ótimo.

Onde está XPTO123?

Ninguém sabe.

Até que aquele senhor sentado no fundo da sala fala:

“Ah... isso chama uma rotina que o Pereira escreveu em 1997.”

Onde está Pereira?

Aposentado.

Documentação?

Não existe.

Código?

Está numa load library.

Bem-vindo ao castelo.


🔬 4. “I can make you a man” — recompilar não significa modernizar

Imagine que conseguimos pegar determinado programa COBOL e compilá-lo para execução em Linux numa instância EC2.

Fantástico.

COBOL/zOS
    │
    ▼
COBOL/Linux
    │
    ▼
AWS EC2

A aplicação executa.

Então:

“IT'S ALIVE!”

Sim.

Mas cuidado.

Fizemos replatforming.

Talvez isso seja exatamente aquilo que o projeto necessita. Não há absolutamente nada de errado com replatforming.

O erro está em chamar qualquer mudança de plataforma de transformação completa.

A lógica pode continuar praticamente igual.

O código pode continuar COBOL.

O que mudou foi o ambiente no qual ele vive.

É como Rocky.

Frank criou um homem.

Mas criar um corpo funcionando não resolveu automaticamente todos os problemas do castelo.


🏗️ 5. Terraform constrói o laboratório

Vamos separar responsabilidades.

Terraform pode assumir a infraestrutura:

Terraform
    │
    ├── VPC
    ├── Subnets
    ├── Security Groups
    ├── EC2
    ├── IAM
    ├── RDS
    └── outros recursos

Pense nele como quem prepara o laboratório.

Mesa instalada.

Eletricidade ligada.

Tanque montado.

Cabos conectados.

Máquinas posicionadas.

Mas Terraform não deveria necessariamente decidir cada detalhe de configuração da criatura.

Para isso entra outro personagem.


🧰 6. Ansible entra usando salto alto

Ansible entra no laboratório dizendo:

“Deixem a configuração comigo.”

E começa.

EC2
 ↓
pacotes do sistema operacional
 ↓
COBOL compiler/runtime
 ↓
environment variables
 ↓
aplicação
 ↓
configuração
 ↓
database connectivity
 ↓
services
 ↓
health checks

É aqui que a arquitetura original fica realmente interessante.

Não precisamos ter um processo artesanal para DEV, outro para SIT, outro para UAT e um ritual secreto conhecido apenas por dois operadores para PRE-PROD.

Temos automação reutilizável.

Algo conceitualmente assim:

             ANSIBLE ROLE
                  │
       ┌──────────┼──────────┐
       │          │          │
      DEV        SIT        UAT
                              │
                              ▼
                          PRE-PROD

A receita permanece.

Os ingredientes variáveis são separados.


🧓 7. O programador COBOL olha para group_vars e começa a rir

Aqui temos uma das minhas partes favoritas.

A turma DevOps explica:

“Nós separamos a lógica da automação dos parâmetros específicos do ambiente.”

O programador COBOL responde:

“Parâmetros?”

Sim.

DEV pode ter:

DB = APP_DEV
PORT = 1521
ENDPOINT = dev-database

SIT:

DB = APP_SIT
PORT = 1521
ENDPOINT = sit-database

UAT:

DB = APP_UAT
PORT = 1521
ENDPOINT = uat-database

O playbook continua fundamentalmente o mesmo.

Para alguém vindo do mainframe, isso não deveria parecer ficção científica.

Nós passamos décadas trabalhando com conceitos semelhantes através de:

JCL
PROCs
symbolic parameters
PARMLIB
SYSIN
DD statements

Mudam as ferramentas.

A ideia de externalizar configuração é muito mais antiga que os slides modernos que a apresentam.

Frank-N-Furter provavelmente acrescentaria glitter.


👄 8. “Don’t dream it. Be it.” — Infrastructure as Code

Aqui encontramos uma mudança genuinamente poderosa.

Durante décadas tivemos infraestrutura e configuração documentadas mais ou menos assim:

“Instalar pacote X, editar arquivo Y, trocar parâmetro Z, reiniciar serviço e telefonar para Carlos se não funcionar.”

Carlos sai da empresa.

Fim da documentação.

Infrastructure as Code transforma parte desse conhecimento operacional em algo executável.

CONHECIMENTO
     ↓
    CODE
     ↓
Version Control
     ↓
Automation
     ↓
Environment

Isso é importante.

Código pode ser:

revisado, versionado, comparado, testado, auditado e reproduzido.

O conhecimento deixa de existir exclusivamente na memória do operador.


🧪 9. DEV → SIT → UAT → PRE-PROD

Agora Frank conduz nossa criatura pelos diferentes aposentos do castelo.

DEV

Aqui desenvolvemos e realizamos os primeiros testes.

SOURCE
  ↓
BUILD
  ↓
TEST
  ↓
DEPLOY

SIT

System Integration Testing.

Aqui descobrimos uma verdade universal da informática:

Tudo funciona perfeitamente até precisar conversar com outra coisa.

Banco.

APIs.

Filas.

Serviços.

Arquivos.

Autenticação.

Sistemas externos.

UAT

User Acceptance Testing.

Agora a pergunta deixa de ser apenas:

“Funciona?”

e torna-se:

“Isso faz aquilo que o negócio realmente precisa?”

Diferença enorme.

PRE-PROD

Aqui chegamos ao ensaio geral.

E PRE-PROD deveria ser assustadoramente parecido com produção.


🏰 10. PRE-PROD precisa ser o castelo quase completo

Um PRE-PROD simplificado demais produz falsa segurança.

Precisamos considerar:

OS version
runtime version
COBOL compiler/runtime
database version
patches
CPU architecture
memory
network
TLS
IAM
filesystem
locale
encoding
timezone
batch
integrations
security policies

Quanto mais diferente de PROD, mais perguntas surgem.

Imagine:

UAT
COBOL Runtime 8.0

PROD
COBOL Runtime 7.4

Funcionou no UAT.

Que maravilhoso.

Mas você não testou produção.

Testou outra coisa.


📦 11. Está faltando um personagem importante: o artefato

Aqui eu faria uma alteração importante na arquitetura.

Não gosto da ideia de recompilar arbitrariamente a aplicação em cada ambiente.

Prefiro:

          SOURCE
             │
             ▼
           BUILD
             │
             ▼
            TEST
             │
             ▼
      ARTIFACT REPOSITORY
             │
     ┌───────┼─────────┐
     ▼       ▼         ▼
    DEV     SIT       UAT
                       │
                       ▼
                   PRE-PROD
                       │
                       ▼
                     PROD

Isso nos leva a um princípio extremamente poderoso:

Build once, deploy many.

Produzimos uma criatura.

Depois submetemos aquela mesma criatura aos testes.

Não fazemos Rocky 1 para DEV, Rocky 2 para SIT, Rocky 3 para UAT e Rocky 4 para produção esperando que todos sejam geneticamente idênticos.


🕵️ 12. A pergunta do auditor

Imagine uma mudança chegando a produção.

O auditor pergunta:

“Esse binário é exatamente aquele homologado?”

Se cada ambiente recompila:

SOURCE
 ↓
DEV BUILD

SOURCE
 ↓
SIT BUILD

SOURCE
 ↓
UAT BUILD

SOURCE
 ↓
PROD BUILD

temos quatro processos de construção.

Mesmo que tudo pareça igual, aumentamos nossa superfície de dúvida.

Com artefato imutável:

SOURCE
 ↓
BUILD
 ↓
ARTIFACT 7.3.17
 ↓
DEV
 ↓
SIT
 ↓
UAT
 ↓
PRE-PROD
 ↓
PROD

agora existe uma cadeia muito mais clara.


🔐 13. Sweet Transvestite não significa senha escrita no YAML

Chegamos aos secrets.

Nunca faça:

database_password: "senha_supersecreta123"

e depois:

git commit

Parabéns.

Você acaba de transformar seu Git em museu arqueológico de credenciais.

A arquitetura corretamente menciona mecanismos como Ansible Vault e AWS Secrets Manager.

O princípio é:

CODE ≠ SECRET

Idealmente:

CI/CD
   │
   ▼
IAM / temporary authorization
   │
   ▼
Secrets Manager
   │
   ▼
Runtime

O segredo aparece apenas onde e quando precisa aparecer.


🧛 14. Privilégio mínimo: nem Frank deveria ter acesso a tudo

Outro princípio:

Developer ≠ Production Admin
Application ≠ Database Admin
Pipeline ≠ Unlimited AWS Administrator

Cada componente recebe apenas aquilo de que necessita.

Isso é least privilege.

Se determinado processo precisa consultar um segredo, não existe razão automática para permitir que consulte todos.

Se uma aplicação precisa acessar determinado banco, não significa que deva possuir poder administrativo sobre ele.

É o equivalente moderno de algo que o pessoal RACF conhece muito bem:

Quem é você e por que exatamente precisa acessar isso?


🗄️ 15. RDS parece simples até começarmos a falar de Db2

A imagem permite Oracle/PostgreSQL como exemplos.

Tudo bem.

Mas um cenário vindo de mainframe pode envolver:

COBOL
  +
Db2 for z/OS

E alguém inevitavelmente pensa:

Db2 → Db2

Então deve ser simples.

Ah, meu jovem Brad...

Não necessariamente.

Db2 for z/OS
      ≠
Db2 LUW
      ≠
RDS for Db2

Existe parentesco tecnológico.

Não existe identidade operacional perfeita.

Precisamos investigar SQL utilizado, stored procedures, utilities, comportamento transacional, autorização, integração e características específicas da plataforma.

O banco pode carregar tanta arqueologia quanto o COBOL.


🗃️ 16. E o VSAM?

Agora Frank encontra um arquivo VSAM no porão.

Silêncio.

Se a aplicação original utiliza:

KSDS
ESDS
RRDS

precisamos responder:

Para onde esses dados vão?

RDS?

Arquivos?

Outro datastore?

Mantemos comportamento equivalente?

E principalmente:

a aplicação depende semanticamente da organização original?

Não basta exportar registros e dizer:

“Migrei.”

Dados possuem comportamento.

Chaves.

Ordenação.

Concorrência.

Locking.

Integridade.

Performance.

Tudo isso importa.


📜 17. E o JCL?

Aqui está uma das grandes vítimas dos diagramas bonitos de modernização.

Pegamos o COBOL.

Migramos.

E esquecemos que às 02:00 existe isto:

JOB A
 ↓
JOB B
 ↓
JOB C ─── JOB D
   │
   ▼
 JOB E
   │
   ▼
 JOB F

Existem dependências.

Calendários.

Arquivos.

Condições.

Return codes.

Restart.

Checkpoints.

SLA.

Janelas de processamento.

O JCL talvez desapareça.

A necessidade que ele implementava não desaparece.

Alguma outra coisa precisará orquestrar aquilo.


⏰ 18. O batch não quer saber que agora você é cloud

Imagine um processamento que precisa terminar até 06:00.

No mainframe:

23:00 START
...
05:31 END

Migramos para AWS.

Agora:

23:00 START
...
06:47 END

Tecnicamente funciona.

Funcionalmente funciona.

Os resultados estão corretos.

E mesmo assim:

A MIGRAÇÃO FALHOU.

Porque o negócio precisava dos dados às 06:00.

Essa é uma lição gigantesca.

Compatibilidade funcional não é suficiente.

Precisamos de compatibilidade operacional.


📊 19. CloudWatch não deveria ficar decorando o canto do desenho

Observabilidade precisa atravessar toda a solução.

Não basta:

EC2 = UP
RDS = UP

Enquanto:

Pedidos processados = ZERO

Infraestrutura saudável não significa aplicação saudável.

Precisamos enxergar:

CPU
memory
disk
network
database latency
connections
locks
errors
transaction rate
response time
batch duration
business transactions

E aqui o veterano do mainframe reconhece novamente uma velha ideia.

O importante não é saber apenas:

“A máquina está ligada?”

O importante é:

“O workload está entregando aquilo que deveria?”


💥 20. PRE-PROD também precisa morrer

Frank provavelmente aprovaria esta parte.

Testamos:

DATABASE ONLINE

Excelente.

Agora desligue o banco.

Testamos:

NETWORK OK

Excelente.

Agora introduza timeout.

Testamos:

DISK SPACE OK

Encha o disco.

Testamos:

PASSWORD VALID

Revogue a credencial.

Queremos descobrir:

database unavailable
network failure
bad credentials
timeout
disk full
process killed
duplicate transaction
corrupted input
rollback failure
partial deployment

Porque produção descobrirá essas condições por você.

E produção não agenda laboratório.


🔥 21. O health check mais importante talvez seja o ABEND

Um health check dizendo:

HTTP 200

é agradável.

Mas para uma aplicação empresarial eu quero saber:

Aplicação iniciou?
Banco conecta?
Fila responde?
Transação funciona?
Arquivo abre?
Batch executa?
Rollback funciona?
Restart funciona?
Dados permanecem consistentes?

Um sistema não é saudável porque existe um processo no ps.

Ele é saudável quando consegue realizar sua função.


🔄 22. Rollback precisa entrar no espetáculo

Deployment sem rollback testado é fé.

O pipeline deveria conhecer algo como:

VERSION 8.4
    │
    ▼
DEPLOY
    │
    ├── SUCCESS → continue
    │
    └── FAILURE
            │
            ▼
        VERSION 8.3
            │
            ▼
        VALIDATION

Mas existe uma complicação.

Rollback de executável é relativamente fácil.

Rollback de banco pode não ser.

Se versão 8.4 alterou schema e começou a gravar dados novos, voltar simplesmente o executável para 8.3 talvez não resolva.

Portanto deployment strategy precisa conversar com database migration strategy.


🧬 23. A criatura tem memória

Esse é outro erro frequente.

Tratamos aplicação como código.

Mas aplicações empresariais são:

CODE
 +
DATA
 +
STATE
 +
INTEGRATIONS
 +
HISTORY

Migrar código é apenas uma parte.

Migrar décadas de dados mantendo integridade pode ser o verdadeiro projeto.

Frank consegue construir outro corpo.

Transferir quarenta anos de memória para ele é outra história.


🕸️ 24. Discovery deveria aparecer antes de Terraform

Se eu redesenhasse completamente a figura, colocaria no início:

             DISCOVERY
                 │
      ┌──────────┼───────────┐
      │          │           │
    COBOL       JCL         DATA
      │          │           │
     CICS    Scheduler     VSAM
      │                      │
     IMS                    Db2
      │
      MQ
      │
 External Systems

Depois:

Dependency Mapping
       ↓
Workload Classification
       ↓
Modernization Strategy
       ↓
Architecture
       ↓
Terraform / Ansible / CI/CD

Essa ordem é fundamental.

Não escolha a ferramenta antes de compreender o problema.


🧭 25. Nem tudo precisa sair do mainframe

Aqui está outra heresia contra certas apresentações de modernização.

Podemos terminar com:

                   ENTERPRISE
                       │
           ┌───────────┴───────────┐
           │                       │
         IBM Z                    AWS
           │                       │
      COBOL/CICS                 Services
           │                       │
          Db2       ← API/MQ →     RDS
           │                       │
        Batch                    Analytics

Isso também é modernização.

Talvez seja uma modernização melhor.

Mainframe não precisa desaparecer para AWS existir.

AWS não precisa substituir IBM Z para gerar valor.

O objetivo deveria ser colocar cada workload onde faz sentido técnico, econômico e operacional.


🏎️ 26. Performance: “funciona” é uma palavra perigosíssima

Suponha que uma transação CICS respondesse em:

40 ms

A nova aplicação responde em:

480 ms

Funciona?

Sim.

É equivalente?

Talvez não.

Agora multiplique pela quantidade de transações.

Adicione network latency.

Database round trips.

APIs.

TLS.

Logs.

Tracing.

De repente aquela diferença aparentemente pequena torna-se enorme.

Modernização precisa de baseline antes da migração.

Sem baseline você termina dizendo:

“Parece mais lento.”

Isso não é engenharia.


💰 27. E existe FinOps

Outro easter egg escondido sob a mesa do laboratório.

No mainframe alguém pode reclamar:

“MIPS são caros!”

Migramos para cloud.

Então descobrimos:

EC2
RDS
storage
IOPS
snapshots
data transfer
NAT
logs
monitoring
backup
licenses
support

e percebemos que cloud não significa:

barato.

Significa principalmente:

modelo econômico diferente.

Se não medirmos consumo, uma arquitetura elasticamente maravilhosa pode gerar uma conta elasticamente maravilhosa também.


👄 28. “Don’t dream it. Be it.”

Chegamos finalmente à grande lição de Frank-N-Furter.

Não devemos ter medo de transformar sistemas.

COBOL pode viver em novas plataformas.

Pode participar de pipelines modernos.

Pode trabalhar com Git.

Pode ser automatizado com Ansible.

Pode ter infraestrutura criada com Terraform.

Pode conversar com cloud.

Pode expor APIs.

Pode entrar num processo CI/CD.

Não existe qualquer contradição nisso.

O problema começa quando confundimos modernização com maquiagem tecnológica.

Trocar:

z/OS

por:

Linux

não moderniza automaticamente arquitetura.

Trocar:

Db2

por:

PostgreSQL

não moderniza automaticamente dados.

Trocar:

JCL

por:

YAML

não moderniza automaticamente processos.

E trocar:

datacenter

por:

AWS

não moderniza automaticamente engenharia.


🧠 29. A verdadeira modernização

Para mim, modernização aparece quando conquistamos:

REPRODUCIBILITY
      +
AUTOMATION
      +
OBSERVABILITY
      +
TRACEABILITY
      +
SECURITY
      +
TESTABILITY
      +
RESILIENCE
      +
MAINTAINABILITY

Se conseguimos isso mantendo COBOL?

Excelente.

Se parte precisa ser reescrita?

Pode fazer sentido.

Se outra parte permanece no IBM Z?

Perfeitamente possível.

Se determinado workload vai para AWS?

Ótimo.

Tecnologia é consequência da decisão arquitetural.

Não deveria ser sua causa.


🥚 Easter egg — 03:17 no castelo

Naturalmente precisamos deixar uma pequena surpresa.

São 03:17 da madrugada.

O telefone toca.

Produção parou.

O dashboard está verde.

EC2:

RUNNING

RDS:

AVAILABLE

CPU:

12%

Memory:

41%

CloudWatch:

NO INFRASTRUCTURE ALARM

Mas o batch não termina.

Um engenheiro olha para outro.

Ninguém entende.

Então aparece um veterano COBOL carregando uma caneca de café.

Ele olha cinco minutos para os logs e pergunta:

“Onde está o arquivo que o JOB anterior deveria ter criado?”

Silêncio.

O arquivo não existe.

O JOB anterior terminou com RC=04.

O novo scheduler considerou RC=04 sucesso.

O sistema antigo possuía uma regra que tratava aquele retorno especificamente.

Ela nunca apareceu no diagrama de migração.

Frank-N-Furter olha para sua criatura.

A criatura olha para Frank.

E o veterano toma outro gole de café.

O COBOL havia sido migrado perfeitamente.

O conhecimento operacional, não.


☕ 30. A lição final do Bellacosa Mainframe

Há algo profundamente fascinante nesses sistemas antigos.

Quando encontramos um programa COBOL escrito em 1989, atualizado em 1997, alterado em 2008, integrado com uma API em 2019 e ainda executando em 2026, não estamos olhando simplesmente para código legado.

Estamos olhando para história empresarial executável.

Cada IF.

Cada copybook.

Cada DD.

Cada tabela.

Cada fila.

Cada estranho RC=04.

Pode existir porque alguma coisa aconteceu.

Alguém tomou uma decisão.

Algum problema ocorreu.

Alguma regra comercial nasceu.

Algum cliente reclamou.

Algum auditor exigiu.

Alguma madrugada de produção ensinou uma lição.

Por isso, quando alguém entrar no laboratório segurando Terraform numa mão e Ansible na outra, não devemos impedi-lo.

Muito pelo contrário.

Acendam as máquinas.

Preparem AWS.

Construam pipelines.

Versionem tudo.

Automatizem.

Observem.

Testem.

Modernizem.

Só não cometam o erro de Frank-N-Furter:

não fiquem tão apaixonados pela nova criatura a ponto de esquecer de compreender o mundo no qual ela terá de sobreviver.

Porque, no final, a pergunta mais importante de uma modernização COBOL não é:

“Conseguimos fazê-lo rodar na AWS?”

É:

“Conseguimos preservar quarenta anos de comportamento, regras, dependências e conhecimento — eliminando aquilo que ficou obsoleto e melhorando aquilo que realmente precisava mudar?”

Se a resposta for sim, então podem aumentar o volume.

As luzes do laboratório podem acender.

Terraform pode subir a infraestrutura.

Ansible pode executar o playbook.

Jenkins pode promover o artefato.

CloudWatch pode começar a observar.

E Frank-N-Furter finalmente poderá anunciar:

⚡ “IT'S ALIVE!”

Enquanto o velho programador COBOL, sentado discretamente no fundo do laboratório, acrescentará:

“Muito bonito. Agora vamos ver se fecha o batch antes das seis.” ☕👄⚡



 

quinta-feira, 21 de março de 2024

☁️🔥 Do RACF ao Terraform: Como um Padawan Mainframe Pode Dominar a Nuvem Antes que a Nuvem Domine Você

 

Bellacosa Mainframe fala sobre Cloud Terraform RACF

☁️🔥 Do RACF ao Terraform: Como um Padawan Mainframe Pode Dominar a Nuvem Antes que a Nuvem Domine Você

“A cloud não substituiu o mainframe. Ela apenas espalhou o mainframe pelo planeta — sem manual impresso.”

Se você vem do mundo z/OS, COBOL, CICS, JCL ou operações críticas, este artigo é para você, jovem Padawan. 🧭
Vamos traduzir Cloud Adoption + Cloud Governance + IaC + Segurança para o idioma mainframe — com exemplos reais, curiosidades e alguns easter eggs técnicos no caminho.


🧠 A Grande Verdade Que Ninguém Te Conta

Cloud não é “servidor alugado”.

Cloud é:

🏛️ Infraestrutura + Automação + Governança + Segurança + FinOps + Cultura

Sem governança, a cloud vira:

🔥 Caos rápido
💸 Conta gigantesca
🔓 Vulnerabilidades
🕵️ Shadow IT
📉 Falta de controle


🏗️ Cloud Adoption = Plano de Migração (Estilo SMPE do Século XXI)

Antes de mover qualquer workload, você precisa responder:

  • Por que migrar?
  • O que migrar?
  • Quando migrar?
  • Vale a pena migrar?
  • Como voltar se der ruim?

Sim… Exit Strategy é obrigatório.

🧩 Analogia mainframe

CloudMainframe
Cloud Adoption StrategyPlano de capacity + modernização
Workload migrationConversão batch / online
Exit strategyDR site alternativo
Hybrid cloudSysplex + distribuído

⚔️ As Estratégias de Migração (Os “Rs” da Força)

Nem todo sistema deve ser tratado igual.

🚚 Rehost — Lift and Shift

Mover sem alterar.

👉 Como rodar um COBOL antigo em outro LPAR sem recompilar.


✏️ Revise — Ajustar um pouco

Pequenas melhorias para rodar melhor na cloud.

👉 Tipo recompilar com novo runtime.


🧠 Refactor — Modernizar arquitetura

Mudanças profundas.

👉 Monolito → Microservices
👉 CICS → APIs
👉 Batch → Event-driven


🔄 Replace — Trocar por SaaS

Abandonar o sistema próprio.

👉 Sistema de RH interno → solução pronta.


🧱 Rebuild — Reescrever tudo

Quando o legado virou fóssil.

👉 Recriar do zero com arquitetura cloud-native.


🏛️ Cloud Governance = RACF + JES + SMF + Auditoria… Só que Global

Governança é o que impede a cloud de virar faroeste.

🎯 Objetivos principais

  • 🔐 Segurança
  • 💰 Controle de custos
  • ⚙️ Operação estável
  • 📜 Compliance
  • 📊 Monitoramento
  • 🧩 Padronização

🕵️ Shadow IT — O “Batch Fantasma” da Cloud

Equipes criam recursos sem controle.

Resultado:

🧟 Servidores esquecidos
💸 Custos ocultos
🔓 Riscos
📉 Ninguém sabe o que existe

No mainframe isso seria impensável.

Na cloud? Dois cliques.


💰 FinOps — Porque a Conta Chega TODO MÊS

Na cloud você paga por:

  • CPU
  • Memória
  • Storage
  • Rede (principalmente rede!)
  • Serviços gerenciados
  • Recursos ociosos 😈

💣 Maiores vilões

  1. Recursos esquecidos
  2. Transferência de dados
  3. Superdimensionamento
  4. Falta de autoscaling

⚡ Autoscaling — O WLM da Nuvem

Ajusta capacidade automaticamente.

🧠 Exemplo

E-commerce:

  • Normal → poucos servidores
  • Black Friday → centenas
  • Depois → volta ao normal

Sem autoscaling = pagar pico o ano inteiro.


📍 Regra de Ouro da Arquitetura Cloud

💰 “Você paga pela arquitetura que desenha.”

Mover dados entre regiões custa caro.
Mover entre cloud e on-prem custa MAIS caro ainda.


🔐 Segurança: O Modelo de Responsabilidade Compartilhada

Cloud NÃO é “segurança terceirizada”.

☁️ Provedor protege:

  • Datacenter
  • Hardware
  • Infra base

🏢 Cliente protege:

  • Dados
  • Aplicações
  • Configuração
  • Identidades
  • Acessos

👉 Bucket público com dados sensíveis? Culpa sua.


🪪 IAM — O RACF da Cloud (Easter Egg #1)

Identity and Access Management é o novo perímetro.

Não existe mais “cerca” física.

Quem controla identidade controla tudo.

Boas práticas dignas de um sysprog Jedi:

✔️ Princípio do menor privilégio
✔️ MFA obrigatório
✔️ Roles, não usuários diretos
✔️ Auditoria contínua


🗄️ Data Management — Nem Todo Dado É Igual

Classificação é essencial.

TipoProteção
PúblicoBásica
InternoModerada
ConfidencialAlta
ReguladoMáxima

Aplicar segurança máxima a tudo = caro e ineficiente.


📦 Arquivamento — O Hierarchical Storage Management da Cloud

Dados frios devem ir para storage barato.

🔥 Hot → rápido e caro
🌤️ Cool → intermediário
❄️ Archive → lento e barato

Padawan que não arquiva dados… paga caro.


⚙️ Infrastructure as Code — O JCL da Cloud (Easter Egg #2)

Na cloud madura, ninguém cria infraestrutura clicando.

Tudo é código.

Exemplo mental:

👉 JCL cria job
👉 IaC cria infraestrutura

Ferramentas comuns

  • Terraform
  • Ansible
  • CloudFormation
  • Bicep

💻 Exemplo simplificado (Terraform)

Criar uma VM inteira com código:

  • Região definida
  • Tipo de máquina
  • Sistema operacional
  • Tags de governança

Reprodutível. Auditável. Versionado.


🧩 Por que IaC é obrigatório?

Sem automação:

❌ Deploy manual inseguro
❌ Configurações divergentes
❌ Ambientes inconsistentes
❌ Custos fora de controle
❌ Difícil auditoria

Com IaC:

✔️ Padronização
✔️ Segurança embutida
✔️ Aprovação controlada
✔️ Recriação rápida
✔️ Governança executável


🧟 Cloud Sprawl — O “Dataset Órfão” em Escala Planetária

Recursos acumulados sem uso.

Exemplos:

  • VMs esquecidas
  • Discos soltos
  • Snapshots antigos
  • Ambientes de teste abandonados

Grandes empresas economizam milhões apenas limpando isso.


🧭 O Fluxo Completo da Adoção Cloud

🔎 Assess → 🗺️ Plan → 🚀 Adopt → 🏛️ Govern → ⚡ Optimize

Pular etapas = sofrimento garantido.


🧠 Insight de Arquitetura Avançada

Cloud não falha por tecnologia — falha por governança, planejamento e pessoas.


🧪 Easter Egg Final

Se você domina:

  • RACF
  • Auditoria
  • Capacity planning
  • Operação 24x7
  • Sistemas críticos

👉 Você já tem metade do DNA de um Cloud Architect.

O resto é aprender as ferramentas.


🏆 Mensagem ao Padawan

A nuvem não matou o mainframe.

Ela espalhou seus princípios:

✔️ Alta disponibilidade
✔️ Segurança rigorosa
✔️ Escalabilidade
✔️ Automação
✔️ Governança
✔️ Processamento crítico


☕ Conclusão no Estilo Bellacosa

O verdadeiro poder não está em migrar para a cloud.
Está em governar a cloud sem perder a disciplina do mainframe.

Padawan, se você trouxer a mentalidade z/OS para a nuvem…

👉 Você não será apenas um usuário de cloud.
👉 Você será o arquiteto que impede que tudo desmorone.

sábado, 6 de maio de 2023

⚔️ LISBETH E A FORJA DOS 50 INCIDENTES — QUANDO O COBOL DESCOBRIU QUE PRODUÇÃO NÃO CAI, ELA DEIXA PISTAS

 

Bellacosa Mainframe e os incidentesque derrubam o sistema

☕ Um Café no Bellacosa Mainframe

⚔️ LISBETH E A FORJA DOS 50 INCIDENTES — QUANDO O COBOL DESCOBRIU QUE PRODUÇÃO NÃO CAI, ELA DEIXA PISTAS

Linux, CPU, memória, storage, DNS, firewall, load balancer, cloud, Docker, Kubernetes, Terraform, Db2, CICS, WLM, SMF, RMF — e o dia em que Lisbeth descobriu que reiniciar o servidor não era troubleshooting, era bater na espada com um martelo e torcer para ela ficar reta.



🎬 PRÓLOGO — BEM-VINDO À FORJA, PROGRAMADOR COBOL

Imagine a cena.

Você acabou de entrar na equipe de desenvolvimento mainframe. Aprendeu um pouco de COBOL, descobriu que PIC X(10) não é uma fotografia com dez pixels, conseguiu sobreviver ao primeiro JCL e já sabe que apagar uma linha de //DD aleatoriamente porque “parecia não servir para nada” pode ser uma maneira bastante eficiente de conhecer pessoalmente o pessoal da Produção.

São 03:17 da madrugada.

Sim, padawan. Esse horário ainda vai aparecer novamente.

Seu telefone toca.

— Produção está fora!

Você pergunta:

— O que caiu?

A resposta:

— Tudo!

Pronto.

Você acaba de conhecer uma das mensagens de erro menos úteis da história da computação.

Em Aincrad, provavelmente alguém gritaria que um boss apareceu no andar. No nosso mundo, “tudo caiu” pode significar desde um servidor realmente indisponível até uma única transação CICS respondendo em oito segundos.

É nesse momento que entra nossa tutora:

Lisbeth — Rika Shinozaki, de Sword Art Online.

E não escolhi Lisbeth por acaso.

Kirito pode chegar com aquela cara de protagonista e querer resolver tudo no braço, mas Lisbeth trabalha de outra maneira. Antes de fabricar uma arma, ela precisa entender material, resistência, objetivo, comportamento e condições de uso.

Troubleshooting profissional funciona exatamente assim.

Você não olha para uma espada quebrada e começa a martelar.

E não olha para uma aplicação quebrada e começa a reiniciar coisas.

Primeiro observe. Depois obtenha evidências. Só então altere o ambiente.

Bem-vindo à forja.



🔥 CAPÍTULO 1 — “O SISTEMA CAIU” NÃO É UM DIAGNÓSTICO

A primeira coisa que precisamos destruir é uma ideia muito comum entre iniciantes:

outage não significa necessariamente que o computador desligou.

Existem pelo menos dois cenários fundamentais.

Full Outage

O serviço realmente está indisponível:

USUÁRIO
   |
   X
SERVIÇO

Ninguém consegue utilizá-lo.

Agora temos o segundo cenário.

Partial Degradation

USUÁRIO
   |
   +---- transação A → 0,3 segundo
   +---- transação B → 0,4 segundo
   +---- transação C → 9 segundos
   +---- transação D → TIMEOUT
   +---- transação E → 0,5 segundo

O serviço tecnicamente continua funcionando.

Mas tente explicar isso ao cliente cuja compra ficou parada durante nove segundos.

No mainframe podemos ter:

z/OS       UP
CICS       UP
Db2        UP
MQ         UP
TCP/IP     UP
JES2       UP

E mesmo assim:

Response Time ↑
Db2 Lock Wait ↑
MQ Queue Depth ↑
CPU ↑
Timeouts ↑

Tudo está UP.

E tudo está ruim.

Essa distinção é fundamental porque estado operacional e qualidade do serviço são coisas diferentes.

Lisbeth provavelmente diria:

“A espada continua inteira. Isso não significa que ainda esteja boa para lutar.”



💥 CAPÍTULO 2 — BLAST RADIUS: O RATO PEQUENO QUE DERRUBOU O CASTELO

Outro conceito importantíssimo é blast radius: a extensão do impacto causado por uma falha.

Imagine:

                    DNS
                     |
        +------------+------------+
        |            |            |
     SISTEMA A    SISTEMA B    SISTEMA C
        |            |            |
       Db2           MQ          API

DNS parece apenas um componente.

Mas dezenas ou centenas de serviços podem depender dele.

Se ele falha, aparentemente temos:

Sistema A caiu
Sistema B caiu
Sistema C caiu
API caiu
MQ não conecta
Aplicação web caiu

O iniciante enxerga seis incidentes.

O engenheiro experiente pergunta:

O que todos os afetados têm em comum?

Essa talvez seja uma das perguntas mais poderosas de um War Room.

No mainframe, pense em RACF.

Uma alteração incorreta pode atingir:

            RACF
              |
     +--------+--------+
     |        |        |
    CICS     MQ       Batch
     |        |        |
    Db2      API      Dataset

Você pode passar duas horas investigando CICS, Db2 e MQ separadamente.

Ou descobrir em dez minutos que todos começaram a apresentar problemas depois de uma mudança de autorização.

O tamanho da alteração não determina o tamanho do desastre.

Uma linha pode derrubar uma arquitetura inteira.



🔎 CAPÍTULO 3 — LISBETH ENSINA O MÉTODO CIENTÍFICO DO WAR ROOM

A coleção de incidentes apresentada nesta conversa possui um tesouro escondido:

OBSERVE
   ↓
EVIDENCE
   ↓
HYPOTHESIS
   ↓
TEST
   ↓
FIX
   ↓
VERIFY

Eu acrescentaria:

LEARN
   ↓
PREVENT

Esse fluxo separa troubleshooting de superstição tecnológica.

O método ruim é:

Aplicação lenta
      ↓
RESTART
      ↓
Voltou?

O clássico:

“Reinicia para ver.”

Às vezes funciona.

E justamente por funcionar ocasionalmente tornou-se um dos hábitos mais perigosos da informática.

Imagine uma região CICS apresentando degradação porque existe contenção em determinado recurso.

Alguém faz recycle.

O problema desaparece.

Todos comemoram.

Mas também desapareceram parte das condições que permitiriam entender o incidente.

Quatro dias depois:

03:17.

Telefone toca.

— Caiu novamente.

Parabéns.

Você não resolveu o incidente anterior.

Apenas zerou o tabuleiro.



🧭 CAPÍTULO 4 — AS QUATRO PERGUNTAS DE LISBETH

Antes de tocar no ambiente, acrescente quatro dimensões:

TIME
CHANGE
SCOPE
CORRELATION

TIME — quando começou?

14:03?

Ontem?

Gradualmente?

Somente durante o batch?

CHANGE — o que mudou?

Deploy?

Configuração?

Firewall?

Certificado?

Carga?

SCOPE — quem está afetado?

Um usuário?

Todos?

Uma região?

Um CICS?

Uma LPAR?

Uma API?

CORRELATION — o que os afetados compartilham?

Db2?

MQ?

DNS?

Storage?

RACF?

Rede?

Essa combinação reduz brutalmente o universo de possibilidades.


🖥️ CAPÍTULO 5 — CPU EM 100% NÃO SIGNIFICA “COMPRE CPU”

Nos incidentes Linux, uma das primeiras situações é CPU Saturation.

Você encontra:

CPU = 99%

O iniciante conclui:

“Falta CPU.”

Calma.

CPU alta é uma evidência, não necessariamente a causa raiz.

Pode existir:

loop infinito
processo runaway
query problemática
retry storm
carga inesperada
job agendado
algoritmo ruim

No Linux, comandos como:

top
ps aux --sort=-%cpu
uptime

ajudam na investigação.

No mainframe mudamos as ferramentas:

RMF
SMF
WLM
SDSF

Mas mantemos a pergunta:

Quem está consumindo recurso e por quê?

Essa diferença é enorme.

Capacity Planning não é simplesmente olhar para CPU e comprar capacidade.

É entender comportamento do workload.


🧠 CAPÍTULO 6 — O OOM KILLER: QUANDO O SISTEMA OPERACIONAL EXECUTA O PRISIONEIRO

Agora memória.

Linux começa a ficar sem RAM.

Um processo desaparece.

A aplicação registra:

Process terminated

Você conclui:

“A aplicação crashou.”

Talvez não.

Ela pode ter sido vítima do OOM Killer — Out Of Memory Killer.

Simplificando:

RAM acaba
   ↓
kernel precisa sobreviver
   ↓
escolhe processo
   ↓
mata processo

Isso introduz uma distinção preciosa:

PROCESSO MORREU

não significa necessariamente:

PROCESSO SE MATOU

Ele pode ter sido morto externamente.

Esse raciocínio vale para qualquer investigação: sempre procure saber quem iniciou a ação observada.


💾 CAPÍTULO 7 — “NO SPACE LEFT” QUANDO AINDA EXISTE ESPAÇO

Aqui encontramos uma das curiosidades mais deliciosas da série.

Você executa:

df -h

e existe espaço.

Mesmo assim:

No space left on device

Como?

Inodes.

Um filesystem não precisa apenas de bytes para armazenar conteúdo. Ele também precisa manter estruturas que representam arquivos.

Portanto podemos ter:

ESPAÇO       55% utilizado
INODES      100% utilizados

Resultado:

não conseguimos criar novos arquivos.

Um milhão de pequenos arquivos pode esgotar inodes sem esgotar a capacidade em bytes.

Para o programador COBOL, existe uma bela lição conceitual aqui:

capacidade física não é necessariamente capacidade utilizável.

No z/OS, obviamente não estamos falando de inodes para datasets tradicionais, mas podemos encontrar outras restrições envolvendo:

PRIMARY
SECONDARY
EXTENTS
VOLUME
SMS
DATACLAS
STORCLAS
VTOC
CATALOG

Ter DASD disponível em algum lugar não garante que determinado dataset consiga crescer daquela maneira naquele momento.


🌐 CAPÍTULO 8 — “A REDE CAIU” É O PRIMO DO “PROGRAMA DEU ERRO”

Outro clássico.

Usuário não consegue acessar.

Conclusão instantânea:

“Rede.”

Não.

Construa a espada peça por peça:

DNS
 ↓
ROUTE
 ↓
FIREWALL
 ↓
PORT
 ↓
PROCESS
 ↓
APPLICATION

Pergunte:

Até onde funciona?

Essa mudança de pergunta é fantástica.

Em vez de investigar todo o universo, encontramos a fronteira entre:

FUNCIONA | NÃO FUNCIONA

📖 CAPÍTULO 9 — DNS: O CATÁLOGO TELEFÔNICO QUE TODO MUNDO ESQUECE ATÉ QUE QUEBRE

Você conhece:

api.bellacosa.com

A máquina precisa descobrir algo como:

192.0.2.123

Se a resolução falha, talvez o servidor esteja perfeitamente saudável.

Aplicação funcionando.

Banco funcionando.

Rede funcionando.

Mas o usuário não sabe para onde ir.

Ferramentas Linux incluem:

dig
nslookup

É por isso que problemas de DNS frequentemente parecem problemas de aplicação.

O sintoma aparece longe da causa.


🛣️ CAPÍTULO 10 — ROUTING: O CASTELO EXISTE, MAS NÃO EXISTE ESTRADA

Agora temos endereço.

Isso não significa que conseguimos chegar até ele.

SOURCE
   ↓
ROUTER A
   ↓
ROUTER B
   X
ROUTER C
   ↓
DESTINATION

Uma rota errada pode tornar um servidor perfeitamente saudável inacessível.

A lição:

existência não implica alcançabilidade.

Parece filosofia de boteco.

Mas também é engenharia de redes.


🔥 CAPÍTULO 11 — FIREWALL: EU SEI QUE VOCÊ EXISTE, MAS VOCÊ NÃO ENTRA

Agora:

DNS       OK
ROUTE     OK
HOST      OK
SERVICE   OK
FIREWALL  BLOCK

Do ponto de vista do servidor:

“Estou funcionando.”

Do ponto de vista do cliente:

“Está tudo morto.”

Essa diferença entre saúde interna e experiência externa é uma das maiores mensagens da coleção inteira.

Monitorar apenas componentes não basta.

Precisamos monitorar serviços.


🚪 CAPÍTULO 12 — REFUSED E TIMEOUT CONTAM HISTÓRIAS DIFERENTES

Três mensagens parecidas podem representar três mundos.

Address already in use

A aplicação tenta ocupar uma porta que já está sendo utilizada.

Connection refused

Você conseguiu chegar ao host, mas não encontrou um serviço aceitando a conexão como esperado.

Timeout

Você esperou e a conversa não terminou adequadamente.

Timeout pode envolver:

route
firewall
packet loss
load balancer
congestionamento
aplicação
dependência

E existe um detalhe delicioso:

o tempo do erro também é evidência.

Falha imediatamente?

Depois de 5 segundos?

Exatamente 30?

Sempre 60?

Um timeout extremamente regular pode apontar para configuração de algum componente intermediário.

Cronômetro também é ferramenta de diagnóstico.


⚖️ CAPÍTULO 13 — O LOAD BALANCER QUE DERRUBOU SERVIDORES SAUDÁVEIS

Imagine três aplicações:

APP1  OK
APP2  OK
APP3  OK

Load balancer executa:

GET /healthz

Mas o endpoint correto é:

GET /health

O resultado?

APP1 UNHEALTHY
APP2 UNHEALTHY
APP3 UNHEALTHY

O balanceador remove todas.

Temos então uma situação digna de Aincrad:

todos os servidores estão funcionando e o serviço está completamente indisponível.

Por quê?

Porque saúde física e saúde lógica são diferentes.


❤️ CAPÍTULO 14 — HEALTH CHECK TAMBÉM PODE SER PERIGOSO

Imagine um /health verificando:

aplicação
Db2
MQ
cache
DNS
API externa
serviço secundário

Uma API pouco importante cai.

Health check retorna FAIL.

Load balancer remove instância.

Todas as instâncias fazem igual.

Resultado:

dependência secundária falha
            ↓
health checks falham
            ↓
instâncias removidas
            ↓
OUTAGE TOTAL

Maravilhoso.

Criamos um mecanismo de alta disponibilidade capaz de aumentar a indisponibilidade.

Por isso health checks precisam ser cuidadosamente projetados.


☁️ CAPÍTULO 15 — “RUNNING” NÃO SIGNIFICA “FUNCIONANDO”

Uma VM aparece no console:

RUNNING

Isso não prova:

SSH OK
OS OK
PROCESS OK
APP OK
DATABASE OK
USER OK

Existem camadas:

Hardware
   ↓
Hypervisor
   ↓
VM
   ↓
Operating System
   ↓
Process
   ↓
Application
   ↓
Dependency
   ↓
Business Transaction

No mainframe:

CEC
 ↓
LPAR
 ↓
z/OS
 ↓
CICS
 ↓
Transaction
 ↓
Db2/MQ
 ↓
Business

CICS UP não significa transação saudável.

JOB ACTIVE não significa trabalho útil sendo realizado.

Guarde esta frase:

Estado não é progresso.


💽 CAPÍTULO 16 — STORAGE TEM PELO MENOS TRÊS MANEIRAS DE MACHUCAR VOCÊ

Storage pode apresentar problemas de:

CAPACITY
AVAILABILITY
PERFORMANCE

Um volume pode estar cheio.

Pode estar inacessível.

Ou pode estar disponível e absurdamente lento.

Esse terceiro caso engana muita gente.

Porque:

STORAGE = ONLINE

não significa:

STORAGE = PERFORMANDO BEM

Entram conceitos como:

IOPS, throughput e latency.

Dois workloads podem movimentar 10 GB e produzir comportamentos completamente diferentes.

Um pode ler grandes blocos sequencialmente.

Outro pode realizar milhões de pequenas operações aleatórias.

Mesmo volume.

Workloads completamente diferentes.

No universo IBM Z pense em:

DASD
I/O response time
cache
channels
EXCP
Db2 buffer pools
synchronous reads

Não pergunte apenas:

“Quanto temos?”

Pergunte também:

“Como estamos usando?”


🗄️ CAPÍTULO 17 — O BANCO FICOU SEM CONEXÕES

Suponha:

MAX CONNECTIONS = 500

A aplicação abre conexões e não libera adequadamente.

100
200
300
400
499
500

Chega a próxima:

💥

A solução rápida:

MAX CONNECTIONS = 1000

Pode aliviar.

Mas se existe vazamento:

500 → 1000 → 2000 → 4000

Você não corrigiu o problema.

Apenas comprou tempo.

Isso é equivalente a aumentar o balde enquanto alguém continua abrindo a torneira.


🌪️ CAPÍTULO 18 — RETRY STORM: QUANDO A RESILIÊNCIA ATACA O SISTEMA

Aqui existe uma consequência fascinante.

Banco fica lento.

Aplicação recebe timeout.

Programador implementou:

IF ERROR
   RETRY
END-IF

Parece sensato.

Até acontecer:

100 requests
    ↓
100 failures
    ↓
100 retries
    ↓
200 requests
    ↓
mais failures
    ↓
mais retries

O sistema debilitado recebe mais carga porque está debilitado.

Surge a retry storm.

Por isso arquiteturas resilientes empregam mecanismos como:

exponential backoff
jitter
circuit breaker
retry budget

Resiliência mal implementada pode produzir indisponibilidade.


🐳 CAPÍTULO 19 — DOCKER: PRIMEIRO DESCUBRA SE MORREU UM OU MORRERAM TODOS

Temos:

Container A FAIL
Container B OK
Container C OK

Suspeitamos de A.

Mas:

Container A FAIL
Container B FAIL
Container C FAIL
Container D FAIL

Pare de investigar cada aplicação individualmente.

Pergunte o que elas compartilham:

HOST
CPU
MEMORY
DISK
NETWORK
DNS
STORAGE

Isso é correlação operacional.

É exatamente a lógica do blast radius reaparecendo.


☸️ CAPÍTULO 20 — CRASHLOOPBACKOFF NÃO É A DOENÇA

Kubernetes mostra:

CrashLoopBackOff

Muita gente trata isso como causa.

Na realidade, é mais próximo de um estado resultante:

START
 ↓
CRASH
 ↓
RESTART
 ↓
CRASH
 ↓
RESTART
 ↓
CRASH
 ↓
BACKOFF

O Kubernetes está dizendo:

“Eu tentei. Morreu. Tentei novamente. Morreu novamente. Agora vou esperar um pouco antes de continuar insistindo.”

A causa pode estar em:

config
secret
dependency
permission
OOM
bug
filesystem
health probe

Portanto:

não conserte o CrashLoopBackOff; descubra por que o processo está crashando.


📦 CAPÍTULO 21 — IMAGEPULLBACKOFF: O AVENTUREIRO NEM ENTROU NA DUNGEON

Outro caso:

Pod
 ↓
precisa da imagem
 ↓
Registry
 X

Possíveis causas:

tag errada
imagem inexistente
credencial inválida
DNS
rede
rate limit
registry indisponível

Aqui a aplicação sequer começou.

Essa observação é fundamental:

descubra em qual estágio do ciclo de vida ocorreu a falha.

Não faz sentido procurar erro de aplicação se a aplicação nunca executou.


⏳ CAPÍTULO 22 — PENDING NÃO SIGNIFICA QUEBRADO

Pod está:

Pending

Pode estar esperando:

CPU
Memory
GPU
PVC
quota
node selector
toleration
scheduler

Isso nos leva novamente à diferença entre:

CAPACIDADE TOTAL

e:

CAPACIDADE UTILIZÁVEL POR AQUELE WORKLOAD

O cluster pode possuir recursos livres e mesmo assim não conseguir posicionar determinado Pod.

Para quem conhece WLM, a filosofia não soa tão alienígena.


🌐 CAPÍTULO 23 — O CAMINHO DO PACOTE NO KUBERNETES

Grave:

USER
 ↓
INGRESS
 ↓
SERVICE
 ↓
ENDPOINT
 ↓
POD

Quando algo falhar, percorra a cadeia.

Pod responde?

Endpoint existe?

Service encontra Endpoint?

Ingress encontra Service?

DNS aponta corretamente?

O método é:

teste cada fronteira.

Não:

“Delete todos os Pods e invoque os deuses de Aincrad.”


🏷️ CAPÍTULO 24 — UMA LETRA PODE DERRUBAR TUDO

Service:

selector:
  app: payment

Pod:

labels:
  app: payments

Um s.

Resultado:

SERVICE     EXISTS
POD         EXISTS
ENDPOINTS   NONE

Tudo existe.

Nada conversa.

Esse é um tipo especialmente interessante de incidente:

os componentes estão corretos individualmente; a relação entre eles está errada.

E sistemas distribuídos são essencialmente coleções de relações.


🏗️ CAPÍTULO 25 — TERRAFORM: AUTOMATIZANDO O SUCESSO E O DESASTRE

Infrastructure as Code traz:

CODE
 ↓
PLAN
 ↓
REVIEW
 ↓
APPLY
 ↓
VERIFY

Fantástico.

Mas automação possui uma característica maravilhosa e assustadora:

computadores conseguem executar erros humanos em velocidade industrial.

Manualmente você pode alterar um servidor errado.

Automação pode alterar 300.

Por isso:

terraform plan

não é decoração.

É uma oportunidade de enxergar o futuro.


☠️ CAPÍTULO 26 — O SINAL -/+ QUE PODE ESTRAGAR SEU CAFÉ

Imagine o Terraform indicando que determinado recurso será destruído e recriado.

Você pensava estar fazendo uma pequena alteração.

Terraform pretende:

DESTROY
   ↓
CREATE

E alguém simplesmente executa:

terraform apply

Lisbeth arrancaria o martelo da sua mão.

Leia o plano.

Principalmente alterações destrutivas.

Peer review em infraestrutura não é burocracia.

É proteção contra blast radius automatizado.


👻 CAPÍTULO 27 — CONFIGURATION DRIFT: O FANTASMA DA INFRAESTRUTURA

Código diz:

ESTADO A

Mas alguém entrou no console manualmente e alterou:

ESTADO B

Agora:

CODE ≠ REALIDADE

Isso é configuration drift.

Depois alguém altera uma inocente linha no Terraform.

O plano aparece gigantesco.

— Mas eu só mudei uma coisa!

Sim.

Só que a realidade já havia se afastado do estado declarado.

Esse conceito possui enorme importância mesmo fora do Terraform.

Ambientes mainframe também sofrem quando:

documentação
configuração
procedimento
produção

deixam de representar a mesma realidade.


🏛️ CAPÍTULO 28 — E O QUE TUDO ISSO TEM A VER COM COBOL?

Quase tudo.

Não devemos criar equivalências técnicas falsas, mas podemos criar analogias mentais úteis:

Mundo modernoUniverso mainframe
Linux hostz/OS / LPAR
ProcessAddress Space
DatabaseDb2 / IMS
StorageDASD / storage subsystem
IAMRACF / SAF
MonitoringRMF / SMF
Workload managementWLM
Application serverCICS / IMS TM, dependendo do contexto
MessagingMQ
NetworkTCP/IP
Logs/eventsSYSLOG, JES, CICS/Db2 traces e logs

O programador COBOL moderno não precisa transformar-se em administrador Kubernetes.

Mas precisa compreender que sua aplicação vive dentro de um ecossistema de dependências.

Seu COBOL pode estar perfeito.

Mesmo assim:

COBOL
 ↓
CICS
 ↓
Db2
 ↓
Storage

Se storage degrada:

Db2 espera
 ↓
CICS espera
 ↓
COBOL espera
 ↓
cliente espera

Quem leva a culpa?

Normalmente:

“O sistema está lento.”


🔬 CAPÍTULO 29 — CORRELAÇÃO NÃO É CAUSA

Deploy:

14:02

Incidente:

14:03

Suspeito?

Muito.

Prova?

Não.

Às 14:03 também poderia ter ocorrido:

certificado expirou
batch iniciou
storage saturou
DNS mudou
dependência caiu

Portanto:

TIMELINE
   ↓
HIPÓTESE

mas:

EVIDÊNCIA
   ↓
CONFIRMAÇÃO

Essa distinção evita duas horas de War Room culpando o último deploy enquanto o verdadeiro culpado está tranquilamente consumindo I/O no andar de baixo da dungeon.


🧰 CAPÍTULO 30 — O CHECKLIST DA FORJA DE LISBETH

Quando receber:

“Produção caiu!”

não saia reiniciando coisas.

Siga algo próximo disto:

  1. Defina o sintoma real. O que exatamente o usuário não consegue fazer?

  2. Determine o impacto. Quantos usuários, aplicações ou regiões foram afetados?

  3. Descubra quando começou. Procure uma timeline precisa.

  4. Verifique mudanças recentes. Deploy, configuração, infraestrutura, segurança, capacidade.

  5. Procure denominadores comuns. DNS, Db2, MQ, storage, RACF, rede etc.

  6. Determine a última camada comprovadamente saudável.

  7. Colete evidências antes de alterar o ambiente.

  8. Crie hipóteses testáveis.

  9. Teste com o menor impacto possível.

  10. Aplique a menor correção segura.

  11. Verifique pela perspectiva do usuário.

  12. Faça RCA e prevenção.

Observe o item 11.

Não basta:

CICS = UP

Teste:

TRANSACTION = OK?

E melhor ainda:

BUSINESS TRANSACTION = OK?

🧙 CAPÍTULO 31 — A EVOLUÇÃO DO PROGRAMADOR COBOL

O iniciante vê:

APPLICATION DOWN

e pensa:

RESTART

O profissional começa a pensar:

Qual aplicação?
Qual usuário?
Desde quando?
Todos?
Alguns?
Qual ambiente?
O que mudou?
Qual dependência?
Qual erro?
Qual latência?
Qual padrão?
Qual componente comum?

E existe uma diferença monumental entre essas duas formas de trabalhar.

A primeira reage.

A segunda investiga.


⚔️ CAPÍTULO 32 — LISBETH FINALMENTE ENTREGA A ESPADA

Depois de Linux, redes, load balancers, cloud, storage, bancos, Docker, Kubernetes e Terraform, talvez pareça que estudamos dezenas de assuntos diferentes.

Mas retire os nomes das tecnologias.

O que sobra?

RESOURCE
CAPACITY
DEPENDENCY
CONNECTIVITY
CONFIGURATION
STATE
CHANGE
OBSERVABILITY

Essa é a verdadeira dungeon.

Tecnologias mudam.

Essas categorias continuam reaparecendo.

O mainframe dos anos 1970, o Linux moderno, um cluster Kubernetes e uma cloud pública parecem mundos diferentes.

Mas todos possuem:

recursos finitos, dependências, configurações, estados, caminhos de comunicação e seres humanos perfeitamente capazes de alterar alguma coisa às 17:59 de sexta-feira.


🕵️ EASTER EGG — O INCIDENTE DAS 03:17

Você chegou até aqui.

Então merece descobrir por que o relógio marcou 03:17 duas vezes.

Imagine que o telefone toca exatamente às 03:17.

Produção está lenta.

CPU aumentou.

Db2 apresenta waits.

CICS começa a acumular transações.

Um jovem engenheiro declara:

“É CPU!”

Lisbeth olha para ele.

Não fala nada.

Você abre a timeline.

Descobre:

03:15  Batch iniciou
03:16  I/O aumentou
03:16  Db2 response time aumentou
03:17  CICS response time aumentou
03:17  CPU aumentou
03:18  usuários começaram a reclamar

Agora temos outra história.

CPU não iniciou o problema.

Ela também reagiu ao workload.

A pista estava na ordem dos acontecimentos.

03:17 não era a causa. Era apenas o momento em que o castelo começou a sentir o terremoto iniciado dois minutos antes.

Esse é o Easter Egg.

Em incidentes complexos:

timeline é quase uma máquina do tempo.


☕ EPÍLOGO — NÃO CONSERTE A ESPADA ANTES DE DESCOBRIR ONDE ELA QUEBROU

Lisbeth não seria uma boa ferreira se simplesmente pegasse qualquer espada quebrada, desse cinco marteladas e gritasse:

“Próximo!”

Um engenheiro de produção também não deveria trabalhar assim.

Quando ocorrer um incidente:

Observe
   ↓
Colete evidências
   ↓
Defina o escopo
   ↓
Monte a timeline
   ↓
Procure correlações
   ↓
Crie hipóteses
   ↓
Teste
   ↓
Corrija
   ↓
Verifique
   ↓
Aprenda
   ↓
Previna

Essa sequência vale para:

Linux
Cloud
Network
Storage
Database
Docker
Kubernetes
Terraform
z/OS
CICS
IMS
Db2
MQ
RACF
WLM

E provavelmente continuará válida quando metade dessas tecnologias já tiver virado questão de arqueologia computacional.

Porque troubleshooting não é decorar comandos.

Não é saber kubectl de cabeça.

Não é decorar comandos de SDSF.

Não é executar terraform apply.

E definitivamente não é saber onde fica o botão Restart.

Troubleshooting é construir uma explicação baseada em evidências para responder:

O que aconteceu, onde aconteceu, quando começou, quem foi afetado, por que aconteceu e como sabemos que realmente corrigimos?

Quando você consegue responder essas perguntas, algo interessante acontece.

Você deixa de ser apenas o programador COBOL que recebeu uma ligação porque “o sistema caiu”.

Você começa a enxergar o sistema inteiro:

USUÁRIO
   ↓
APLICAÇÃO
   ↓
MIDDLEWARE
   ↓
DATABASE
   ↓
NETWORK
   ↓
STORAGE
   ↓
INFRASTRUCTURE

E principalmente as relações entre essas camadas.

É aí que nasce aquela habilidade difícil de colocar num curso ou numa certificação: raciocínio operacional.

O COBOL continua importante.

O JCL continua importante.

CICS, Db2, MQ, RACF, WLM, SMF e RMF continuam importantes.

Mas acima de todas essas ferramentas existe algo ainda mais poderoso:

a capacidade de olhar para cinquenta sintomas e descobrir qual história as evidências estão tentando contar.

Lisbeth coloca a espada recém-forjada sobre o balcão.

Você pergunta:

— Está pronta?

Ela provavelmente responderia:

— Ainda não.

— Mas ela já está inteira!

— Exatamente. Agora precisamos testar.

E essa talvez seja a última e mais importante lição dos 50 incidentes:

o fato de o sistema ter voltado não prova que o incidente terminou.

Primeiro restauramos o serviço.

Depois entendemos a causa.

Depois verificamos.

Depois aprendemos.

E finalmente tentamos impedir que o telefone volte a tocar às 03:17.

Porque em Aincrad morrer significava não voltar.

Em Produção existe algo talvez ainda mais assustador:

o incidente volta na segunda-feira.

☕ Um Café no Bellacosa Mainframe — onde até uma ferreira de Sword Art Online sabe que RESTART não é Root Cause Analysis.

quinta-feira, 23 de agosto de 2018

DevOps Muito Além do Botão "Deploy"

 

Bellacosa Mainframe devops muito alem do botao deploy

☕ Um Café no Bellacosa Mainframe

DevOps Muito Além do Botão "Deploy"

O Que Todo Programador COBOL Padawan Precisa Saber Sobre CI/CD, Containers, Kubernetes, Infrastructure as Code, Pipelines, Monitoramento e Como os Grandes Bancos Automatizam Milhões de Transações por Dia

"Programar é apenas escrever código. Engenharia de Software é garantir que esse código chegue à produção com qualidade, segurança, repetibilidade e confiabilidade."


Durante muitos anos, o mundo Mainframe e o mundo Open pareciam universos completamente diferentes.

De um lado estavam os programadores COBOL, PL/I, Natural e Assembler trabalhando em ambientes IBM Z, produzindo aplicações que movimentam bancos, seguradoras, bolsas de valores, cartões de crédito, governos e empresas de telecomunicações.

Do outro lado estavam Linux, Docker, Kubernetes, Git, Jenkins, Cloud, Terraform e dezenas de ferramentas modernas que pareciam pertencer apenas às startups do Vale do Silício.

Mas existe uma verdade que poucos contam.

Os princípios são exatamente os mesmos.

O que muda são as ferramentas.

O objetivo continua sendo entregar software confiável, rapidamente, sem causar indisponibilidade.

E isso é exatamente o que os profissionais de Mainframe fazem há décadas.

Hoje vamos tomar mais um café e entender por que DevOps não substitui o Mainframe. Na verdade, ele complementa uma filosofia que o IBM Z já pratica há muito tempo.


O maior problema da Engenharia de Software

Imagine um banco em 1995.

Existem cinquenta programadores COBOL.

Cada um altera dezenas de programas durante a semana.

Na sexta-feira chega o momento mais temido.

Alguém diz:

"Vamos subir tudo para produção."

Começa então um ritual que muitos veteranos conhecem.

Primeiro é necessário localizar todos os fontes.

Depois recompilar.

Executar o Link-Edit.

Gerar os módulos de carga.

Executar o BIND dos pacotes DB2.

Atualizar CICS.

Atualizar PROCs.

Atualizar JCL.

Executar testes.

Cruzar os dedos.

Quando algo falhava, ninguém sabia exatamente qual alteração havia provocado o problema.

Esse cenário ficou conhecido no mundo da engenharia como Integration Hell.

Era caro.

Demorado.

Arriscado.

E completamente dependente de trabalho manual.

Foi exatamente para resolver esse problema que nasceu o DevOps moderno.


DevOps não é uma ferramenta

Um dos maiores erros dos iniciantes é acreditar que DevOps seja um software.

Alguns dizem:

"Estamos usando Jenkins."

Logo concluem:

"Então fazemos DevOps."

Não.

Jenkins não é DevOps.

Docker não é DevOps.

Git não é DevOps.

Kubernetes não é DevOps.

Terraform não é DevOps.

Ansible não é DevOps.

Todos eles são apenas ferramentas.

DevOps é uma filosofia de engenharia.

É uma maneira diferente de pensar.

A pergunta deixa de ser:

"Como faço o deploy?"

E passa a ser:

"Como faço milhares de deploys sem interromper o negócio?"

Essa mudança de mentalidade transforma completamente uma equipe.


A filosofia DevOps

Imagine uma corrida de revezamento.

Se um corredor correr muito rápido, mas demorar para entregar o bastão ao próximo, toda a equipe perde.

Em desenvolvimento de software acontece exatamente a mesma coisa.

Não adianta o desenvolvedor produzir código rapidamente se os testes levam semanas.

Não adianta testar rapidamente se a implantação depende de dezenas de procedimentos manuais.

Não adianta implantar rapidamente se ninguém monitora a aplicação depois.

DevOps conecta todas essas etapas em um fluxo contínuo.

É uma esteira de produção de software.


CI — Continuous Integration

A primeira etapa dessa esteira chama-se Integração Contínua.

No passado, cada desenvolvedor trabalhava isoladamente durante dias.

Quando finalmente entregava seu código, surgiam conflitos gigantescos.

Hoje a ideia é completamente diferente.

Cada pequena alteração é enviada ao repositório imediatamente.

A partir desse momento começa um processo totalmente automatizado.

O servidor baixa o código.

Compila.

Executa testes.

Analisa qualidade.

Verifica segurança.

Se tudo estiver correto, aceita a alteração.

Caso contrário, rejeita automaticamente.

Quanto menores forem as mudanças, menor será o risco de incompatibilidades.

Essa é a essência da Integração Contínua.


Como isso acontece no IBM Z

Muitos imaginam que isso exista apenas para Java ou Python.

Não existe essa limitação.

Em um ambiente IBM Z moderno, um commit pode disparar automaticamente:

  • compilação COBOL;

  • compilação PL/I;

  • compilação Assembler;

  • geração de módulos de carga;

  • execução de BIND DB2;

  • criação de artefatos;

  • testes automatizados;

  • análise de impacto;

  • geração de relatórios;

  • publicação para homologação.

Ferramentas como IBM Dependency Based Build (DBB), Jenkins e Git permitem automatizar todo esse fluxo.

O programador continua escrevendo COBOL.

O restante passa a acontecer automaticamente.


Continuous Delivery

Depois da integração vem a entrega.

Aqui existe uma diferença importante.

O software está totalmente pronto para produção.

Todos os testes passaram.

Os artefatos já foram gerados.

A documentação foi atualizada.

Os relatórios estão disponíveis.

Mas ainda existe uma aprovação humana.

Isso é muito comum em bancos.

Uma equipe de Change Management analisa a mudança.

Se aprovada, a implantação acontece.

Caso contrário, ela permanece aguardando.

Esse modelo recebe o nome de Continuous Delivery.


Continuous Deployment

Existe um passo além.

Nenhuma aprovação humana.

O commit entra no Git.

Os testes passam.

O deploy acontece automaticamente.

Empresas como Netflix, Spotify, Amazon e Google fazem isso milhares de vezes por dia.

É claro que nem toda empresa pode seguir esse modelo.

Bancos, seguradoras e órgãos governamentais normalmente exigem aprovações formais por questões regulatórias.

Mesmo assim, o restante do processo continua totalmente automatizado.


O Pipeline

Imagine uma linha de montagem de automóveis.

Cada estação realiza uma atividade específica.

Motor.

Pintura.

Suspensão.

Acabamento.

Inspeção.

Com software acontece exatamente a mesma coisa.

Essa linha de montagem recebe o nome de Pipeline.

Cada etapa agrega qualidade ao produto.

Um pipeline moderno normalmente executa:

  • obtenção do código-fonte;

  • compilação;

  • geração dos executáveis;

  • testes unitários;

  • testes de integração;

  • análise estática;

  • análise de segurança;

  • geração dos pacotes;

  • publicação;

  • deploy;

  • smoke tests;

  • monitoramento inicial.

Quanto menos intervenção humana existir, menor será a probabilidade de erro.


O papel do Git

Git não serve apenas para armazenar código.

Ele registra toda a história do projeto.

Quem alterou.

Quando alterou.

Por que alterou.

É possível retornar para qualquer versão anterior.

Essa característica transforma o Git em um verdadeiro diário da aplicação.

No mundo Mainframe, ele substitui antigas bibliotecas de controle de versões e integra naturalmente o desenvolvimento COBOL às práticas modernas.


Containers

Agora chegamos a um conceito que costuma gerar bastante confusão.

Um container não é uma máquina virtual.

Ele também não é um servidor.

Pense nele como uma caixa completamente fechada.

Dentro dessa caixa existem:

  • aplicação;

  • bibliotecas;

  • dependências;

  • arquivos de configuração;

  • variáveis de ambiente;

  • executáveis;

  • tudo o que a aplicação precisa para funcionar.

A grande vantagem é simples.

Se funciona dentro do container, funcionará em qualquer ambiente compatível.

Acabou aquela famosa frase:

"Na minha máquina funciona."


Docker

Docker foi a tecnologia que popularizou os containers.

Em vez de instalar dezenas de programas manualmente, descrevemos tudo em um arquivo chamado Dockerfile.

Esse arquivo funciona como uma receita.

Toda vez que ele é executado, produz exatamente o mesmo ambiente.

É repetível.

Auditável.

Versionável.

Esse conceito é extremamente importante na engenharia moderna.


Uma analogia para o Programador COBOL Padawan

Imagine um PROC JCL extremamente completo.

Ele já referencia todas as bibliotecas.

Possui todos os parâmetros.

Aponta para os datasets corretos.

Possui utilitários.

Define as variáveis necessárias.

Qualquer operador consegue executá-lo.

Esse PROC lembra bastante a ideia de um container.

Tudo o que é necessário já está preparado.


Kubernetes

Se containers resolvem o problema da execução, Kubernetes resolve o problema da administração.

Imagine uma empresa executando cinco mil containers.

Quem decide onde cada um será executado?

Quem reinicia um container que falhou?

Quem aumenta automaticamente a capacidade quando chegam mais usuários?

Quem reduz recursos durante a madrugada?

Quem distribui a carga entre vários servidores?

Quem realiza atualizações sem interromper o serviço?

A resposta para todas essas perguntas é Kubernetes.

Ele funciona como um maestro coordenando milhares de músicos.


Os Pods

No Kubernetes, normalmente não administramos containers diretamente.

Administramos Pods.

Um Pod pode conter um ou mais containers trabalhando em conjunto.

É a menor unidade de execução dentro do cluster.


O Control Plane

O cérebro do Kubernetes chama-se Control Plane.

Ele conhece todo o ambiente.

Sabe quais máquinas existem.

Quantos recursos possuem.

Quais aplicações estão executando.

Quais precisam ser reiniciadas.

Ele toma decisões automaticamente.


Os Worker Nodes

São os servidores que realmente executam as aplicações.

Enquanto o Control Plane decide, os Worker Nodes trabalham.

Essa separação aumenta a confiabilidade e a escalabilidade.


Healing

Imagine que um servidor apresente defeito.

No modelo tradicional alguém recebe um chamado.

Analisa logs.

Reinicia processos.

No Kubernetes tudo isso acontece automaticamente.

O sistema percebe que um container deixou de responder.

Cria outro.

Redireciona o tráfego.

O usuário muitas vezes nem percebe que ocorreu uma falha.


Auto Scaling

Durante uma promoção da Black Friday o número de acessos pode multiplicar por dez.

Kubernetes detecta esse crescimento.

Cria novas instâncias.

Distribui os usuários.

Quando a demanda diminui, remove os recursos excedentes.

Tudo automaticamente.


O equivalente no IBM Z

Embora Kubernetes seja uma tecnologia diferente, a filosofia lembra diversos recursos tradicionais do Mainframe.

O IBM Workload Manager (WLM) distribui cargas conforme prioridades.

O Parallel Sysplex compartilha processamento entre vários sistemas.

O Sysplex Distributor realiza balanceamento de carga.

A ideia continua sendo utilizar os recursos disponíveis da forma mais eficiente possível.


Infrastructure as Code

Durante décadas administradores criaram servidores manualmente.

Clicavam em dezenas de telas.

Criavam usuários.

Configuravam rede.

Firewall.

Discos.

Permissões.

Esse processo era demorado e sujeito a erros.

Hoje escrevemos infraestrutura como escrevemos software.

Esse conceito recebe o nome de Infrastructure as Code.


Terraform

Terraform tornou-se um dos maiores representantes dessa filosofia.

Em vez de clicar em interfaces gráficas, descrevemos a infraestrutura em arquivos de texto.

Esses arquivos ficam armazenados no Git.

São revisados.

Versionados.

Auditados.

Automatizados.

Se for necessário reconstruir todo o ambiente, basta executar novamente o código.


Ansible

Enquanto Terraform normalmente cria infraestrutura, Ansible costuma configurá-la.

Ele instala programas.

Atualiza configurações.

Cria usuários.

Distribui certificados.

Reinicia serviços.

Executa comandos remotamente.

No IBM Z, Ansible já é utilizado para administrar USS, CICS, MQ, Db2, RACF, z/OSMF e diversas outras tecnologias.


Configuration Management

Agora imagine mil servidores.

Todos deveriam possuir exatamente a mesma configuração.

Na prática isso quase nunca acontece quando o trabalho é manual.

Um servidor possui Java 17.

Outro possui Java 21.

Um utiliza uma biblioteca diferente.

Outro perdeu um certificado.

Esse fenômeno chama-se Configuration Drift.

Ferramentas de gerenciamento de configuração eliminam esse problema.

Elas garantem que todos os ambientes permaneçam idênticos.

Isso reduz drasticamente erros difíceis de reproduzir.


Observabilidade e Monitoramento

Muitos acreditam que o deploy encerra o trabalho.

Na verdade ele marca o início da fase mais importante.

Depois que o sistema entra em produção é necessário observar continuamente seu comportamento.

CPU.

Memória.

Latência.

Tempo de resposta.

Quantidade de erros.

Uso de disco.

Rede.

Número de usuários.

Tudo precisa ser medido.

Não se gerencia aquilo que não se mede.


Logs, Métricas e Traces

A observabilidade moderna costuma ser baseada em três pilares.

Os logs registram eventos e mensagens geradas pelas aplicações.

As métricas mostram números agregados, como uso de CPU, quantidade de requisições e tempo médio de resposta.

Os traces acompanham uma única transação atravessando diversos serviços, permitindo identificar exatamente onde ocorreu uma lentidão.

Juntos, esses três elementos fornecem uma visão muito mais completa do ambiente do que um simples monitor de CPU.


Monitoramento no IBM Z

Quem trabalha com Mainframe sabe que monitoramento não é novidade.

Ferramentas como RMF, SMF, OMEGAMON, SDSF e monitores específicos de CICS, IMS e Db2 acompanham o comportamento do sistema há décadas.

A diferença é que hoje essas informações também podem alimentar plataformas modernas de observabilidade, permitindo que aplicações distribuídas e aplicações no IBM Z sejam analisadas de forma integrada.


Segurança no Pipeline

Outra característica importante do DevOps moderno é que segurança deixou de ser uma etapa isolada.

Ela passou a fazer parte da própria esteira de desenvolvimento.

Esse movimento ficou conhecido como DevSecOps.

Durante o pipeline podem ser executadas análises de vulnerabilidades, verificação de dependências, inspeção de imagens de containers, análise estática de código e validação de políticas de conformidade.

O objetivo é detectar problemas o mais cedo possível, quando ainda são baratos de corrigir.


Cultura DevOps

Talvez este seja o conceito mais importante de todo o artigo.

Ferramentas podem ser compradas.

Servidores podem ser instalados.

Softwares podem ser atualizados.

Cultura não.

Ela precisa ser construída.

No modelo tradicional existiam silos.

O desenvolvedor escrevia o código.

A equipe de testes encontrava erros.

A equipe de operações implantava.

Quando algo dava errado começava o jogo da culpa.

DevOps rompe essa barreira.

Todos compartilham a responsabilidade pelo sucesso do produto.

Desenvolvimento, testes, segurança e operações deixam de atuar como departamentos isolados e passam a funcionar como uma única equipe.


DevOps no mundo Mainframe

Existe um mito de que Mainframe é incompatível com DevOps.

Nada poderia estar mais distante da realidade.

Hoje é perfeitamente possível integrar aplicações COBOL ao Git, automatizar compilações com Jenkins ou GitHub Actions, executar testes automatizados, versionar infraestrutura, administrar ambientes com Ansible, disponibilizar APIs por meio do z/OS Connect e monitorar tudo em tempo real.

Na prática, o IBM Z apenas incorporou ferramentas modernas a uma plataforma que sempre foi reconhecida por sua estabilidade, disponibilidade e capacidade de processamento.


O que o Programador COBOL Padawan deve aprender primeiro?

Se você está iniciando sua jornada, não tente aprender todas as ferramentas ao mesmo tempo.

Construa uma base sólida.

Comece entendendo Git e controle de versão.

Depois estude CI/CD e pipelines.

Aprenda como containers funcionam e por que eles resolveram o problema da portabilidade.

Entenda o papel do Kubernetes na orquestração.

Conheça Infrastructure as Code e Configuration Management.

Por fim, aprofunde-se em observabilidade, segurança e cultura DevOps.

As ferramentas mudam com o tempo.

Os princípios permanecem.


Conclusão

Existe uma frase muito conhecida na engenharia de software:

"Automatize tudo o que puder. Padronize tudo o que automatizar. Monitore tudo o que colocar em produção."

Ela resume perfeitamente a essência do DevOps.

Para um Programador COBOL Padawan, compreender esses conceitos não significa abandonar o Mainframe. Significa ampliar sua visão de engenharia. O COBOL continua escrevendo regras de negócio que movimentam bilhões de reais diariamente. O IBM Z continua oferecendo níveis de disponibilidade difíceis de igualar. O que muda é a forma como esse software é desenvolvido, testado, implantado, configurado e observado.

Os grandes bancos já não enxergam fronteiras entre "Mainframe" e "Open". Eles enxergam uma cadeia única de entrega de software, na qual aplicações COBOL, Java, Python, APIs REST, containers e serviços em nuvem convivem em uma arquitetura integrada. Nesse cenário, o profissional mais valorizado não é aquele que domina apenas uma linguagem, mas aquele que compreende o ciclo completo de vida do software.

Assim como um mestre Jedi conhece muito mais do que apenas o sabre de luz, um verdadeiro engenheiro de software precisa entender muito mais do que apenas escrever código. Ele precisa dominar automação, integração contínua, entrega contínua, infraestrutura como código, observabilidade, segurança e colaboração entre equipes.

No fim das contas, DevOps não é sobre Docker, Kubernetes ou Jenkins. É sobre construir sistemas que possam evoluir continuamente, com qualidade, segurança e confiança. E essa sempre foi — e continuará sendo — uma das maiores virtudes do ecossistema IBM Mainframe.


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
GitHub LinkedIn
Inicializando conteúdo...