Ansible vs Chef vs Puppet: automação de configuração comparada

1. Introdução à Automação de Configuração

1.1. O que é automação de configuração e por que é essencial em DevOps

Automação de configuração é o processo de gerenciar e provisionar servidores, aplicações e infraestrutura de forma programática, eliminando tarefas manuais repetitivas. Em ambientes DevOps, essa prática garante consistência, reduz erros humanos e acelera o ciclo de entrega de software. Ferramentas como Ansible, Chef e Puppet permitem que equipes definam o estado desejado dos sistemas e mantenham esse estado ao longo do tempo.

1.2. Visão geral do ecossistema: Ansible, Chef e Puppet como ferramentas dominantes

As três ferramentas dominam o mercado de automação de configuração há mais de uma década. Ansible, adquirida pela Red Hat em 2015, destaca-se pela simplicidade e modelo agente-less. Chef, criado por Adam Jacob, oferece flexibilidade através de sua DSL em Ruby. Puppet, desenvolvido por Luke Kanies, é conhecido por sua maturidade e foco em compliance. Cada uma possui pontos fortes distintos que atendem a diferentes necessidades organizacionais.

1.3. Critérios de comparação: arquitetura, linguagem, curva de aprendizado e casos de uso

Para comparar essas ferramentas, utilizaremos critérios como arquitetura de execução, linguagem de configuração, facilidade de aprendizado, gerenciamento de estado, ecossistema de módulos, integração com cloud, performance e escalabilidade. Esses fatores determinam qual ferramenta é mais adequada para cada cenário.

2. Arquitetura e Modelo de Execução

2.1. Ansible: modelo agente-less, push-based e uso de SSH

Ansible opera sem agentes nos nós gerenciados. Ele se conecta via SSH (Linux) ou WinRM (Windows) e executa módulos diretamente. O modelo é push-based, onde o nó de controle envia instruções para os hosts.

# Exemplo de inventário Ansible (hosts.ini)
[webservers]
web1.example.com
web2.example.com

[dbservers]
db1.example.com

# Comando ad-hoc para verificar conectividade
ansible all -i hosts.ini -m ping

2.2. Chef: arquitetura cliente-servidor com agente e modo pull

Chef utiliza um modelo cliente-servidor. Um Chef Server central armazena cookbooks e políticas. Os nós executam o Chef Client (agente) que faz pull das configurações do servidor periodicamente.

# Exemplo de knife bootstrap para configurar um nó
knife bootstrap 192.168.1.100 --ssh-user ubuntu --sudo \
  --node-name node1 --run-list 'recipe[apache]'

2.3. Puppet: modelo mestre-agente com push/pull, Puppet Server e PuppetDB

Puppet possui um modelo mestre-agente onde o Puppet Server gerencia configurações e o PuppetDB armazena dados de estado. Os agentes fazem pull das configurações, mas também suportam push via MCollective ou Bolt.

# Exemplo de manifesto Puppet (site.pp)
node 'webserver.example.com' {
  package { 'nginx':
    ensure => installed,
  }
  service { 'nginx':
    ensure => running,
    enable => true,
  }
}

3. Linguagens e Sintaxe de Configuração

3.1. Ansible: YAML puro com playbooks e módulos declarativos

Ansible usa YAML, uma linguagem de serialização de dados legível por humanos. Playbooks são arquivos YAML que definem tarefas em ordem sequencial.

# playbook.yml
---
- name: Configurar servidor web
  hosts: webservers
  tasks:
    - name: Instalar Apache
      apt:
        name: apache2
        state: present
    - name: Iniciar serviço
      service:
        name: apache2
        state: started
        enabled: yes

3.2. Chef: Ruby como DSL para receitas (recipes) e cookbooks

Chef utiliza Ruby como linguagem de domínio específico (DSL). As receitas são arquivos Ruby que descrevem recursos.

# cookbooks/apache/recipes/default.rb
package 'apache2' do
  action :install
end

service 'apache2' do
  action [:enable, :start]
end

template '/var/www/html/index.html' do
  source 'index.html.erb'
  mode '0644'
end

3.3. Puppet: Puppet DSL declarativa com classes, recursos e manifestos

Puppet possui sua própria DSL declarativa, focada em descrever o estado desejado dos recursos.

# manifestos/webserver.pp
class webserver {
  package { 'httpd':
    ensure => installed,
  }
  service { 'httpd':
    ensure => running,
    enable => true,
    require => Package['httpd'],
  }
  file { '/var/www/html/index.html':
    ensure  => file,
    content => '<h1>Bem-vindo ao Puppet</h1>',
    require => Package['httpd'],
  }
}

4. Gerenciamento de Estado e Idempotência

4.1. Como cada ferramenta garante idempotência nas tarefas

Idempotência significa que executar a mesma configuração múltiplas vezes produz o mesmo resultado. Todas as três ferramentas garantem isso, mas de maneiras diferentes.

4.2. Ansible: módulos idempotentes e verificação de estado via facts

Ansible verifica o estado atual do sistema usando facts (informações coletadas) antes de executar módulos. Se o estado desejado já existe, a tarefa é ignorada.

# Exemplo de fact gathering
- name: Coletar facts do sistema
  setup:
  register: system_info

- name: Instalar pacote apenas se não estiver presente
  apt:
    name: curl
    state: present
  when: "'curl' not in ansible_facts.packages"

4.3. Chef e Puppet: mecanismos de convergência e relatórios de estado

Chef executa receitas em ordem e cada recurso verifica o estado atual antes de aplicar mudanças. Puppet compila um catálogo de recursos e aplica apenas as diferenças entre o estado atual e o desejado.

# Chef: recurso idempotente
package 'vim' do
  action :install
  not_if "which vim"  # Verifica se já está instalado
end

# Puppet: recurso com verificação de estado
package { 'vim':
  ensure => installed,
}

5. Ecossistema, Módulos e Comunidade

5.1. Ansible Galaxy e coleções de roles e módulos prontos

Ansible Galaxy é um repositório centralizado onde a comunidade compartilha roles e coleções. Com um comando, é possível baixar e usar módulos prontos.

# Instalar role do Ansible Galaxy
ansible-galaxy role install geerlingguy.nginx

# Usar role em um playbook
- hosts: webservers
  roles:
    - geerlingguy.nginx

5.2. Chef Supermarket e cookbooks compartilhados pela comunidade

Chef Supermarket oferece milhares de cookbooks prontos para uso, mantidos pela comunidade e pela Chef Software.

# Baixar cookbook do Supermarket
knife cookbook site download nginx

# Upload para o Chef Server
knife cookbook upload nginx

5.3. Puppet Forge e módulos certificados pela Puppet Labs

Puppet Forge é o repositório oficial de módulos, muitos certificados e testados pela Puppet.

# Instalar módulo do Puppet Forge
puppet module install puppetlabs-apache

# Aplicar módulo em manifesto
include apache

6. Integração com Cloud e Orquestração

6.1. Ansible: integração nativa com AWS, Azure, GCP e Terraform

Ansible possui módulos nativos para provisionar recursos em clouds. Pode ser combinado com Terraform para orquestração completa.

# Playbook para criar instância AWS EC2
- name: Provisionar instância EC2
  hosts: localhost
  tasks:
    - name: Criar instância
      amazon.aws.ec2_instance:
        name: "web-server"
        instance_type: t2.micro
        image_id: ami-0c55b159cbfafe1f0
        region: us-east-1
        key_name: my-key

6.2. Chef: suporte a cloud via Chef Provisioning e Knife plugins

Chef Provisioning permite gerenciar recursos cloud diretamente de receitas.

# Receita Chef para criar instância AWS
require 'chef/provisioning/aws_driver'

with_driver 'aws::us-east-1'

machine 'web-server' do
  machine_options bootstrap_options: {
    instance_type: 't2.micro',
    image_id: 'ami-0c55b159cbfafe1f0'
  }
end

6.3. Puppet: módulos para cloud providers e integração com Docker/Kubernetes

Puppet oferece módulos para gerenciar recursos cloud e orquestrar containers.

# Manifesto Puppet para gerenciar container Docker
class { 'docker':
  docker_users => ['ubuntu'],
}

docker::image { 'nginx':
  ensure => present,
}

docker::run { 'nginx-server':
  image   => 'nginx',
  ports   => ['80:80'],
}

7. Performance, Escalabilidade e Casos de Uso

7.1. Ansible: ideal para ambientes pequenos/médios e automação ad-hoc

Ansible é excelente para equipes que precisam de rapidez e simplicidade. Sua natureza agente-less reduz overhead, mas pode ser limitado em ambientes com milhares de nós devido à sobrecarga de conexões SSH.

7.2. Chef: robusto para grandes empresas com pipelines complexos

Chef é adequado para organizações que já utilizam Ruby e precisam de flexibilidade para implementar pipelines complexos de CI/CD. O Chef Server oferece escalabilidade horizontal.

7.3. Puppet: melhor para ambientes de larga escala com compliance e auditoria

Puppet é a escolha preferida para ambientes que exigem conformidade rigorosa, como setores financeiro e governamental. O PuppetDB fornece relatórios detalhados de auditoria.

# Exemplo de relatório PuppetDB
puppet query 'nodes[certname] { deactivated is null }'

8. Conclusão: Como Escolher a Ferramenta Certa

8.1. Comparativo final: custo, maturidade e suporte corporativo

Critério Ansible Chef Puppet
Custo Gratuito (open source) Open source + Enterprise Open source + Enterprise
Curva de aprendizado Baixa Média Média
Arquitetura Agente-less Cliente-servidor Mestre-agente
Linguagem YAML Ruby Puppet DSL
Escalabilidade Média Alta Muito alta

8.2. Cenários recomendados: Ansible para agilidade, Chef para flexibilidade, Puppet para conformidade

  • Ansible: Startups, equipes pequenas, automação ad-hoc, ambientes heterogêneos.
  • Chef: Grandes empresas com equipes Ruby, pipelines complexos, integração contínua.
  • Puppet: Organizações com requisitos de compliance, auditoria, ambientes de larga escala.

8.3. Tendências futuras: convergência de ferramentas e integração com MLOps e GitOps

As fronteiras entre ferramentas estão se dissolvendo. Ansible está integrando conceitos de GitOps via AWX/Ansible Tower. Chef e Puppet estão adotando modelos mais declarativos. A tendência é que todas evoluam para suportar MLOps (automação de machine learning) e GitOps (gerenciamento via repositórios Git).

Referências