Pós-instalação do Debian com Ansible

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.

$ sudo apt install ansible

ou

$ sudo apt-get install ansible

Mostrando a versão instalada com o ansible –version.

$ 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.

$ ansible all -m ping -i hosts

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: mcnd2@192.168.121.100: Permission denied (publickey,password).'
  unreachable: true

Para esse caso, verifique antes se o comando ping esta respondendo.

$ ping -c 5 192.168.121.100

A conectividade do ansible é baseada em ssh e para resolver esse erro precisamos fazer o seguinte:

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.

$ ssh-keygen -t rsa
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.

$ ssh-copy-id -i id_rsa.pub mcnd2@1 192.168.121.100
/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
mcnd2@192.168.122.128’s password:
Number of key(s) added: 1
Now try logging into the machine, with:   “ssh ‘mcnd2@192.168.121.100′”
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.

$ ansible all -m ping -i hosts
[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.

$ ansible-galaxy init roles/add-repo
-- Role roles/add-repo was created successfully

Esse projeto contém seis roles. Crie roles de acordo com a necessidade e desenvolvimento do projeto.

$ ls roles/
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.

$ touch roles/add-repo/tasks/add_repo.yml ; echo “- include: add_repo.yml” >> roles/add-repo/tasks/main.yml

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.

$ ansible-playbook -i hosts main.yml

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!!!