Automatizando a Instalação do Docker com Ansible
Este tutorial detalha o processo de instalação e configuração do Docker e Docker Compose em máquinas remotas utilizando Ansible. Inclui configuração de chaves SSH, gerenciamento de hosts, criação de playbooks e implantação de aplicações via Docker Compose.
Sumário:
- Parte 1: Instalação e Configuração do Ansible no Controlador Ubuntu
- Parte 2: Automatizando a Instalação do Docker com Ansible
- Parte 3: Automatizando o Docker Compose e Implantando Aplicações
Parte 1: Instalação e Configuração do Ansible no Controlador Ubuntu
1. Atualizando o sistema e instalando Ansible
Antes de instalar o Ansible, é importante garantir que seu sistema está atualizado. Execute os seguintes comandos no terminal do controlador (máquina onde o Ansible será instalado - Ubuntu, nos exemplos que seguem):
1
sudo apt update && sudo apt upgrade -y
Depois de atualizar, instale os pacotes essenciais:
1
sudo apt install software-properties-common -y
Agora, adicione o repositório oficial do Ansible para obter a versão mais recente:
1
sudo add-apt-repository --yes --update ppa:ansible/ansible
Por fim, instale o Ansible e o sshpass, que será útil para automatizar a conexão SSH com hosts remotos:
1
sudo apt install ansible sshpass -y
Verifique se a instalação foi bem-sucedida verificando a versão do Ansible:
1
ansible --version
Parte 2: Configuração de Conexão SSH e Inventário do Ansible
2. Gerando e configurando chaves SSH
A comunicação entre o Ansible e os hosts gerenciados será feita via SSH. Para evitar o uso de senhas manuais, geramos uma chave SSH no controlador:
1
ssh-keygen -t ed25519 -f ansible
A chave será salva no arquivo ansible. Agora, copie a chave pública para o host remoto. Substitua gean pelo nome de usuário remoto e 192.168.122.115 pelo endereço IP da máquina alvo:
1
ssh-copy-id -i ansible.pub gean@192.168.122.115
Isso permitirá que o Ansible se conecte ao host remoto sem solicitar uma senha.
3. Configurando o inventário do Ansible
Agora, crie um diretório para os arquivos de configuração do Ansible, se ainda não existir:
1
mkdir -p ansible/docker
Crie o arquivo hosts dentro do diretório ansible/docker. Este arquivo de inventário define os hosts que o Ansible gerenciará. Insira o endereço IP do host e o nome de usuário remoto, conforme o exemplo abaixo:
1
2
[docker]
192.168.122.115 ansible_user=gean
4. Configurando o Ansible
Agora, vamos ajustar o arquivo de configuração do Ansible (ansible.cfg) para desativar a verificação de chaves SSH e usar a chave privada gerada anteriormente. Crie ou edite o arquivo ansible.cfg no diretório ansible/docker:
1
2
3
4
[defaults]
inventory = hosts
host_key_checking = False
private_key_file = ansible
Com essas configurações, o Ansible utilizará o arquivo hosts como inventário e a chave privada para autenticar no host remoto.
5. Testando a comunicação
Antes de executar qualquer tarefa no host remoto, é recomendável testar a conectividade. Use o módulo ping do Ansible para verificar se o controlador pode se comunicar com o host:
1
ansible docker -m ping
Se o resultado for algo como pong, significa que a comunicação está funcionando corretamente.
Parte 3: Automatizando a Instalação do Docker com Ansible
Agora que o controlador Ansible está configurado e se comunica com o host remoto, vamos criar um Playbook Ansible para automatizar a instalação do Docker e Docker Compose.
1. Definindo variáveis de grupo
Antes de iniciar o playbook, podemos definir algumas variáveis para facilitar a reutilização em diferentes hosts. Crie um diretório para armazenar variáveis de grupo:
1
mkdir group_vars
Dentro deste diretório, crie um arquivo chamado debian.yml, que armazenará variáveis relacionadas aos sistemas Debian, como os usuários que serão adicionados ao grupo Docker:
1
2
3
# group_vars/debian.yml
docker_users:
- gean
Essa variável docker_users será utilizada mais tarde para adicionar usuários ao grupo Docker, permitindo que executem comandos sem sudo.
2. Criando o Playbook
Agora vamos criar o arquivo playbook.yml, onde definiremos as tarefas que o Ansible executará para instalar o Docker e Docker Compose.
Crie ou edite o arquivo playbook.yml no diretório ansible/docker:
1
vim playbook.yml
Agora, adicione o seguinte conteúdo YAML ao playbook. Isso inclui as tarefas para atualizar os pacotes, instalar dependências, configurar o repositório do Docker e instalar o Docker e Docker Compose:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
---
- hosts: docker
become: true # Garante que as tarefas sejam executadas com privilégios de superusuário
tasks:
- name: Atualizar o cache de pacotes APT
apt:
update_cache: yes
cache_valid_time: 3600 # Cache válido por 1 hora
- name: Instalar dependências do Docker
apt:
name:
- apt-transport-https
- ca-certificates
- curl
- gnupg
- lsb-release
state: present
- name: Baixar e adicionar chave GPG oficial do Docker
ansible.builtin.apt_key:
url: https://download.docker.com/linux/debian/gpg
state: present
keyring: /usr/share/keyrings/docker-archive-keyring.gpg
- name: Adicionar repositório Docker
ansible.builtin.apt_repository:
repo: "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian stable"
state: present
- name: Atualizar o cache de pacotes após adicionar o repositório Docker
apt:
update_cache: yes
- name: Instalar Docker e Docker Compose
apt:
name:
- docker-ce
- docker-ce-cli
- containerd.io
state: present
- name: Adicionar usuários ao grupo Docker
user:
name: ""
groups: docker
append: yes
loop: ""
- name: Iniciar e habilitar o serviço Docker
systemd:
name: docker
enabled: yes
state: started
3. Explicando o Playbook
Aqui estão os detalhes das principais tarefas no playbook:
- Atualização do cache APT: Garante que o cache do sistema de pacotes esteja atualizado antes de instalar pacotes.
- Instalação de dependências: Pacotes como
curl,gnupgelsb-releasesão necessários para adicionar repositórios e chaves GPG. - Chave GPG e repositório Docker: A chave GPG é necessária para garantir a autenticidade dos pacotes, enquanto o repositório Docker é adicionado para instalar as versões mais recentes.
- Instalação do Docker: Os pacotes
docker-ce,docker-ce-cliecontainerd.iosão instalados. - Adicionar usuários ao grupo Docker: Isso permite que os usuários no grupo
dockerexecutem comandos Docker semsudo. - Habilitar e iniciar o serviço Docker: Garante que o Docker inicie automaticamente após a instalação.
4. Executando o Playbook
Agora que o playbook está pronto, você pode executá-lo usando o comando:
1
ansible-playbook playbook.yml
Isso irá instalar o Docker e configurar o host conforme o playbook, automatizando todo o processo de instalação.
5. Verificando a Instalação
Após a execução do playbook, você pode verificar se o Docker foi instalado corretamente com o seguinte comando Ansible, que executa docker --version no host remoto:
1
ansible docker -m shell -a "docker --version"
Se a versão do Docker for exibida, a instalação foi bem-sucedida.
Parte 4: Automatizando o Docker Compose e Implantando Aplicações
Agora que o Docker está instalado e funcionando, podemos avançar para a criação de um playbook para implantar aplicações usando Docker Compose.
1. Criando diretórios para o Docker Compose
Crie um novo playbook, chamado playbook-compose.yml, para preparar o servidor e implantar uma aplicação com Docker Compose (neste caso, DokuWiki). O playbook cria diretórios, ajusta permissões e executa o docker-compose up.
1
vim playbook-compose.yml
Adicione o seguinte conteúdo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
---
- hosts: docker
become: true
tasks:
- name: Criar diretório para o Docker Compose
file:
path: /srv/dokuwiki
state: directory
mode: '0755'
- name: Copiar o arquivo docker-compose.yml para o servidor
copy:
src: ./docker-compose.yml # Caminho do arquivo local no controlador
dest: /srv/dokuwiki/docker-compose.yml # Caminho de destino no servidor
mode: '0644'
- name: Criar diretório de volumes para o DokuWiki
file:
path: /srv/dokuwiki/html
state: directory
mode: '0755'
- name: Ajustar permissões no diretório html
file:
path: /srv/dokuwiki/html
owner: "1000"
group: "1000"
recurse: yes
mode: '0755'
- name: Garantir que o Docker Compose esteja instalado
apt:
name: docker-compose-plugin
state: present
- name: Executar docker-compose up
shell: docker compose -f /srv/dokuwiki/docker-compose.yml up -d
args:
chdir: /srv/dokuwiki
2. Criando o arquivo docker-compose.yml
Agora, crie o arquivo docker-compose.yml no controlador, que será copiado para o servidor remoto no playbook:
1
2
3
4
5
6
7
8
9
10
11
services:
dokuwiki:
image: dokuwiki/dokuwiki:stable
user: "1000:1000"
restart: unless-stopped
ports:
- "8080:8080"
environment:
PHP_TIMEZONE: America/Sao_Paulo
volumes:
- ./html:/storage
Esse arquivo define o serviço DokuWiki, mapeando portas e configurando volumes e variáveis de ambiente.
3. Executando o playbook para o Docker Compose
Execute o playbook playbook-compose.yml para configurar e iniciar o DokuWiki:
1
ansible-playbook playbook-compose.yml
Por fim, verifique se o contêiner está em execução:
1
ansible docker -m shell -a "docker container ls"
Se o contêiner estiver listado, sua aplicação está rodando corretamente.