Nesse tutorial vamos ver um projeto para ser executar numa pós-instalação do Debian com Ansible instalando pacotes, removendo outros, adicionando repositórios, criando usuário etc, assim nos poupando de todo o trabalho braçal.
O Ansible serve para gerar automação em implantações remotas via conexão ssh. As tarefas a serem executas são criadas em arquivos no formato yaml | yml e implementado a execução em um ou mais alvos (servers/workstations). O Ansible trabalha com “agentless”, o que significa que não é necessário a instalação de agentes nos alvos gerenciados.
Antes de mais nada, para qualquer dúvida ou problema, consulte a página de documentação do Ansible, pois há bastante informação para nortear na resolução de problemas ou implementação de melhorias.
O Ansible nos seus casos de uso:
- Provisionamento
- Gerenciamento de configurações
- Implantação de aplicativo
- Entrega Contínua
- Automação de Segurança
- Orquestração
Pós-instalação do Debian com Ansible
Nesse tutorial foi utilizado o host com o Debian 10.9 (Buster), com a versão do ansible 2.9 e o python 3.7. Para saber como instalar o Ansible no Debian, veja o guia de instalação.
Caso não queira instalar a release atual do repositório adicionado como mostrado na documentação, faça o uso do apt ou apt-get para uma instalação do repositório oficial do Debian.
ou
Mostrando a versão instalada com o ansible –version.
ansible 2.9.12
config file = /etc/ansible/ansible.cfg
configured module search path = [‘/home/mcnd2/.ansible/plugins/modules’, ‘/usr/share/ansible/plugins/modules’]
ansible python module location = /home/mcnd2/.local/lib/python3.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.7.3 (default, Jan 22 2021, 20:04:44) [GCC 8.3.0]
Esse tutorial será registrado no README do projeto que está no meu GitHub.
Testar a conexão com o Ansible
Nessa primeira etapa, sabendo que o Ansible e suas dependências já estão resolvidas, dentro da raiz do projeto, crie o arquivo de inventário chamado hosts (de o nome que desejar), declare o grupo e o IP do alvo a ser testado acompanhado de suas credenciais de acesso, conforme visto abaixo.
[local]
192.168.121.100
[local:vars]
ansible_user=mcnd2 #usuário do alvo
ansible_password=passwdfake #senha do alvo
ansible_become_password=passwdfake #senha do alvo
Para saber se o ansible esta conectando ao alvo, rode o comando com o módulo ping.
Caso receba o erro abaixo, isso quer dizer que o alvo está inacessível.
fatal: [192.168.121.100]: UNREACHABLE! => changed=false
msg: 'Failed to connect to the host via ssh: [email protected]: Permission denied (publickey,password).'
unreachable: true
Para esse caso, verifique antes se o comando ping esta respondendo.
A conectividade do ansible é baseada em ssh e para resolver esse erro precisamos fazer o seguinte:
- Criar uma chave pública/privada no sistema onde rodará o Ansible (em nosso caso, o host Debian 10.9 Buster).
- Copiar a chave pública para Authorized_keys no alvo remoto.
Criar a chave ssh no host
Rode o comando ssh-keygen para gerar a chave, insira um nome de acordo com sua necessidade e em seguida uma senha caso queira. A orientação é deixar o nome padrão e sem senha conforme visto no exemplo abaixo.
Generating public/private rsa key pair.
Enter file in which to save the key (/home/mcnd2/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/mcnd2/.ssh/id_rsa.
Your public key has been saved in /home/mcnd2/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:OqjJybYwACtW6CzJ7S5GaCQ97sKJmr7SdjJ1zDZ+tNQ mcnd2@debian
The key’s randomart image is:
+—[RSA 2048]—-+
| +O*+… |
| .+++..o |
| +++=.. |
|=++.o=.. |
|+oo…+ S |
|+. o = = |
|E=o . * |
|=+.. . |
|+.. . |
+—-[SHA256]—–+
Copiar a chave para o alvo remoto.
Agora copie a chave pública com o comando ssh-copy-id para o alvo remoto onde o ansible executará as tarefas.
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: “id_rsa.pub”
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed — if you are prompted now it is to install the new keys
[email protected]’s password:
Number of key(s) added: 1
Now try logging into the machine, with: “ssh ‘[email protected]′”
and check to make sure that only the key(s) you wanted were added.
Depois de adicionar a chave ssh, teste novamente a conectividade com o Ansible.
[WARNING]: Platform linux on host 192.168.121.100 is using the discovered Python interpreter at /usr/bin/python,
but future installation of another Python interpreter could change this. See
https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
192.168.122.128 | SUCCESS => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”: false,
“ping”: “pong”
}
Para tirar o aviso (warning) em relação ao interpretador python, crie o arquivo ansible.cfg na raiz do projeto e adicione as linhas abaixo. Lembrando que nesse arquivo, poderá ter vários outro parâmetros de configurações.
[defualts]
interpreter_python = /usr/bin/python3
Modularizar roles
Para deixar o código do projeto mais organizado e modularizado, crie roles onde conterá as tasks para cada tarefa dentro do projeto.
Seguindo boas práticas, crie o diretório roles na raiz do projeto e dentro crie cada role modularizada com o ansible-galaxy.
Para criar role modularizada, use o comando ansible-galaxy como visto abaixo.
– Role roles/add-repo was created successfully
Esse projeto contém seis roles. Crie roles de acordo com a necessidade e desenvolvimento do projeto.
add-repo create-user install-app install-loffice reboot-system uninstall-app
Veja a informação para cada diretório de acordo com a documentação do Ansible:
• tasks/main.yml - a lista principal de tarefas que a função executa.
• handlers/main.yml - handlers, que podem ser usados dentro ou fora desta função.
• library/my_module.py - módulos, que podem ser usados nesta função.
• defaults/main.yml - variáveis padrão para a função. Essas variáveis têm a prioridade mais baixa de todas as variáveis disponíveis e podem ser facilmente substituídas por qualquer outra variável, incluindo variáveis de inventário.
• vars/main.yml - outras variáveis para a função.
• files/main.yml - arquivos que a função implanta.
• templates/main.yml - modelos que a função implanta.
• meta/main.yml - metadados para a função, incluindo dependências da função.
Para obter uma explicação completa de todos os subdiretórios e arquivos listados dentro da role, e como eles são usados pelo Ansible, consulte o tópico funções na documentação do Ansible.
Criar Tasks
Sabendo que as roles podem crescer de acordo com a finalidade e desenvolvimento do projeto, crie nela tasks para conter as tarefas a serem executadas, podendo conter uma o mais tasks.
Crie dentro do diretório tasks o arquivo add_repo.yml e declare ele no arquivo main.yml com o include.
Deste modo, devemos incluir essa role no arquivo main da raiz do projeto. O arquivo main deverá ter declarado o arquivo de inventário onde esta listado o alvo (grupo ‘local’ de acordo com o declarado no arquivo hosts), com parâmetro become: yes para ser usado como usuário sudo e as roles declaradas conforme abaixo.
-- - hosts: local become: yes roles: - { role: add-repo, tags: add_repo }
Sendo assim, para executar essa playbook deverá ser criado as tarefas no arquivo add_repo.yml. Nessa task vamos exemplificar simplesmente implantando o arquivo sources.list que está armazenado no diretório files da role e em seguida fazer o backup do sources.list original no alvo prosseguindo com a atualização dos repositórios.
--- - name: Adiconando Repositorios "contrib" e "non-free" copy: src: sources.list dest: /etc/apt/sources.list owner: root group: root mode: '0644' checksum: 534bee4a7b1dd55d84f818f37c2f3f0556445af3 backup: yes tags: add_repo - name: Atualizando Repositorios apt: update-cache: yes tags: add_repo
Executar Playbook
Após os procedimentos de criação de roles, tasks e suas configurações, execute a playbook para automatizar as tarefas conforme abaixo.
Nesse tutorial pós-instalação do Debian com Ansible foi mostrado como criar o projeto desde seu início. Agora fique à vontade para se aprofundar mais nessa ferramenta de automação que dependendo do trabalho a ser feito ela se tornará essencial.
O projeto “ansible-debian-workstation” está no meu GitHub.
Para saber o que foi configurado para pós-instalação do Debian para minha necessidade, de uma explorada no projeto e fique à vontade para fazer o clone, utilizá-lo e/ou adaptá-lo as suas necessidades.
Fico por aqui, até mais!!!