Ansible
Instalação (Linux)
Debian/Ubuntu:
sudo apt update
sudo apt install ansible -y
Verificar:
ansible --version
Conceitos Básicos
Inventário: Lista de hosts Playbook: Arquivo YAML com tarefas Tasks: Ações a executar Modules: Comandos pré-prontos (apt, copy, shell) Handlers: Tarefas executadas sob demanda
Arquitetura: Agentless (usa SSH, sem agente nos hosts)
Inventário
Arquivo hosts:
[rancher-cluster]
rancher-node1
rancher-node2
rancher-node3
[prod-cluster]
prod-node1
prod-node2
prod-node3
prod-node4
prod-node5
prod-node6
Referência: /hosts
Playbook Básico
- name: Configurar servidor
hosts: rancher-cluster
become: yes # Executar como root
tasks:
- name: Instalar pacote
apt:
name: nginx
state: present
Estrutura:
name: Descriçãohosts: Grupo do inventáriobecome: Usar sudotasks: Lista de tarefas
Modules Principais
apt: Instalar pacotes (Debian/Ubuntu)
- name: Instalar Docker
apt:
name: docker-ce
state: present
copy: Copiar arquivos
- name: Copiar configuração
copy:
src: nginx.conf
dest: /etc/nginx/nginx.conf
shell: Executar comandos
- name: Executar script
shell: /opt/meu-script.sh
sysctl: Configurar kernel
- name: Habilitar IP forwarding
sysctl:
name: net.ipv4.ip_forward
value: '1'
state: present
Variables
Via linha de comando:
ansible-playbook --extra-vars 'ansible_user=estevao' playbook.yml
No playbook:
- name: Mostrar usuário
debug:
msg: "Usuário SSH: {{ ansible_user }}"
Privilege Escalation (Become)
- name: Tarefa que requer root
hosts: all
become: yes # sudo
tasks:
- name: Instalar pacote (requer root)
apt:
name: docker-ce
Executar:
ansible-playbook --ask-become-pass playbook.yml
# Solicita senha do sudo
Handlers
Executados apenas se uma task mudar algo:
tasks:
- name: Copiar regras iptables
copy:
src: rules.v4
dest: /etc/iptables/rules.v4
notify: Reload iptables # Chama handler
handlers:
- name: Reload iptables
shell: iptables-restore < /etc/iptables/rules.v4
Referência: fw-dicom/fw-dicom.yml
Conditional Execution
tasks:
- name: Formatar disco (apenas workers)
filesystem:
fstype: ext4
dev: /dev/sdb
when: inventory_hostname in groups['workers']
Referência: prod-cluster/prod-cluster.yml
Exemplo Completo
Arquivo playbook.yml:
- name: Instalar Docker
hosts: rancher-cluster
become: yes
tasks:
- name: Adicionar chave GPG do Docker
apt_key:
url: https://download.docker.com/linux/debian/gpg
state: present
- name: Adicionar repositório Docker
apt_repository:
repo: deb https://download.docker.com/linux/debian bookworm stable
state: present
- name: Instalar Docker
apt:
name: docker-ce
state: present
update_cache: yes
- name: Adicionar usuário ao grupo docker
user:
name: "{{ ansible_user }}"
groups: docker
append: yes
Executar:
ansible-playbook --ask-become-pass --extra-vars 'ansible_user=estevao' -i hosts playbook.yml
Referência: rancher-cluster/rancher-cluster.yml