Ansible é uma ferramenta de automação de infraestrutura e gerenciamento de configuração de Open Source. Ela permite que os administradores de sistema e desenvolvedores provisionem, configurem e gerenciem servidores, aplicativos e ambientes de maneira rápida e eficiente.
Algumas das principais características do Ansible são:
- Simplicidade: O Ansible possui uma sintaxe simples e fácil de entender, baseada em YAML, o que facilita a escrita e leitura de seus playbooks (arquivos de configuração).
- Agentless: O Ansible não requer a instalação de agentes nos hosts gerenciados. Ele se conecta remotamente aos hosts via SSH ou WinRM, simplificando a implantação.
- Idempotência: As tarefas do Ansible são idempotentes, o que significa que podem ser executadas várias vezes sem causar efeitos colaterais indesejados.
Conceitos básicos
Host: Um servidor gerenciada pelo Ansible.
Group: Vários hosts agrupados juntos que compartilham um atributo comum.
Inventory: Uma coleção de todos os hosts e grupos que o Ansible gerencia. Pode ser um arquivo estático em casos simples ou podemos extrair o inventário de fontes remotas, como provedores de nuvem.
Modules: Unidades de código que o Ansible envia aos nós remotos para execução.
Tasks: Unidades de ação que combinam um módulo e seus argumentos junto com alguns outros parâmetros.
Playbooks: Uma lista ordenada de tarefas junto com seus parâmetros necessários que definem uma receita para configurar um sistema.
Roles: Unidades redistribuíveis de organização que permitem que os usuários compartilhem o código de automação de forma mais fácil.
YAML: Um formato de dados popular e simples que é muito limpo e compreensível por humanos.
Resumi bem o que é o Ansible e alguns conceitos e agora vamos pra prática e ver como a gente pode usar essa ferramenta.
No meu caso estarei usando o Ubuntu 22.04. A instalação do Ansible nessa distribuição é bastante simples. Basta seguir as instruções da documentação oficial do Ansible.
Instalação
Pré requisitos:
- Python3
- pip
- sshpass
Verifique se o pacote pip está instalado:
python3 -m pip -V
Caso tudo esteja correto, você deverá ver algo semelhante ao seguinte:
$ python3 -m pip -V
pip 21.0.1 from /usr/lib/python3.9/site-packages/pip (python 3.9)
Caso o pacote não esteja instalado, você receberá o seguinte erro:
No module named pip pip python3-pip pip
Para instalar o pacote pip, basta acessar o link abaixo.
Com os requisitos acima, agora basta instalar o Ansible utilizando o seguinte comando:
pip install ansible
Confirme a instalação:
ansible --version
Tudo pronto. Vamos executar pela primeira vez.
Crie um diretório lab_ansible e entre nele para organizar o seu laboratório.
mkdir lab_ansible && cd lab_ansible
Para este exemplo, crie um container Docker para nossos testes.
Crie o Dockerfile:
#Dockerfile
FROM ubuntu:24.04
RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:deltaops' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
Crie a imagem com o nome “ubuntu-ssh”:
docker build -t ubuntu-ssh .
Essa imagem contém o SSH, permitindo que o Ansible se conecte e execute nossos playbooks. Para executar, rode o seguinte comando:
docker run --name ssh-server -d ubuntu-ssh
Obtenha o endereço IP do container para adicioná-lo como um host no Ansible.
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ssh-server
Para acessar, utilize o usuário e a senha definidos no Dockerfile.
#user=root
#pass=detaops
ssh root@172.17.0.2
Agora temos um host de exemplo para começar a usar o Ansible.
Agora vamos criar o arquivo de inventário, o arquivo inventory.ini do Ansible, que serve para definir os hosts onde aplicaremos o Ansible pela primeira vez.
#inventory.ini
[docker_host] # Host que vai ser executado o playbook
172.17.0.2
Execute o comando abaixo:
ansible docker_host -m ping -i inventory.ini -u root --ask-pass
Caso você receba esse erro abaixo:
diogo@diogo-pc:/tmp/post-medium/ansible# ansible docker_host -m ping -i inventory.ini -u root --ask-pass
SSH password:
172.17.0.2 | FAILED! => {
"msg": "to use the 'ssh' connection type with passwords or pkcs11_provider, you must install the sshpass program"
}
Isso acontece porque estamos usando usuário e senha. Por isso, precisamos instalar o ssh-pass com o comando abaixo.
sudo apt -y install sshpass
Após a instalação, execute o comando novamente:
ansible docker_host -m ping -i inventory.ini -u root --ask-pass
Acima, você pode ver que tudo funcionou corretamente. Que ótimo resultado!”
Portanto, esse comando irá executar o módulo “ping” do Ansible nos hosts definidos no arquivo inventory.ini, usando o usuário “root” e solicitando a senha para autenticação. Isso serve para verificar se a conexão com os hosts alvo está funcionando corretamente antes de prosseguir com outras tarefas do Ansible.
Agora vamos criar o meu primeiro playbook. Criaremos o arquivo ansible.yaml e utilizaremos ele para fazer a instalação do Nginx.
# ansible.yaml
- name: Primeiro Playbook
hosts: docker_host
tasks:
- name: Instalando nginx
apt:
name: nginx
state: present
- name: Primeiro Playbook
: Essa linha define o nome do playbook como "Primeiro Playbook". Isso ajuda a identificar e organizar seus playbooks.hosts: docker_host
: Essa linha especifica o grupo de hosts (ou hosts individuais) nos quais o playbook será executado. Nesse caso, o playbook será executado nos hosts pertencentes ao grupo chamado "docker_host".tasks:
: Essa linha marca o início da seção de tarefas do playbook. Todas as ações que o playbook realizará estarão listadas abaixo desta linha.- name: Instalando nginx
: Essa linha define o nome da tarefa, que é "Instalando nginx". Isso ajuda a identificar e organizar as diferentes tarefas dentro do playbook.apt:
: Essa linha especifica o módulo a ser usado para executar a tarefa. Neste caso, o módulo "apt" é usado para gerenciar pacotes do sistema operacional baseado em Debian, como o Ubuntu.name: nginx
: Essa linha define o nome do pacote a ser instalado, que é o "nginx".state: present
: Essa linha especifica o estado desejado do pacote. "present" significa que o pacote será instalado se ainda não estiver instalado.
Então, esse playbook irá instalar o pacote ‘nginx’ em todos os hosts pertencentes ao grupo ‘docker_host’. Ele é útil para configurar e implantar o servidor web Nginx de maneira automatizada em um ambiente.
Agora vamos executá-lo.
ansible-playbook -i inventory.ini ansible.yaml -u root --ask-pass
Apesar de ter feito a instalação, ao testar o serviço, você descobrirá que ele está inativo. Faça o teste para verificar o status do serviço.
root@diogo-pc:/tmp/post-medium/ansible# curl 172.17.0.2
curl: (7) Failed to connect to 172.17.0.2 port 80 after 0 ms: Conexão recusada
root@diogo-pc:/tmp/post-medium/ansible#
Mas com o Ansible, podemos resolver isso usando o módulo ‘service’. Vamos adicionar mais instruções ao nosso playbook ansible.yaml para tratar isso.
#ansible.yaml
- name: Primeiro Playbook
hosts: docker_host
tasks:
- name: Instalando nginx
apt:
name: nginx
state: present
- name: Start service ngnix, if not started
service:
name: nginx
state: started
Por fim, verifique o resultado acessando o servidor Nginx via curl
ou digitando o endereço IP no navegador.
Por enquanto, é isso pessoal. Neste post, mostrei como dar os primeiros passos com o Ansible. Nos próximos conteúdos, abordarei temas mais avançados. Espero que tenham gostado e não esqueçam de nos seguir nas redes sociais. 😊
https://www.linkedin.com/company/deltaopscloud/
✨ Referência:
Escrito por 🖋️ Diogo Lima
Sócio Fundador da Empresa DeltaOps