>> Apresentação e considerações

ChurrOpers, o Ansible de fato tem caído no gosto da galera, e a adoção dessa ferramenta incrível está sendo cada vez maior a cada dia que passa, devido a sua curva de aprendizado ser rápida em relação as outras ferramentas da mesma categoria e de fato um ser humano comum consegue ser produtivo com Ansible com pouco tempo de uso.

Bem vou mostrar nesse artigo uma das abordagens que podemos utilizar para a instalação do MariaDB, e juntamente a automatização de todos os passos necessários e iniciais para a segurança do nosso database.

Se desejar tem obter mais conhecimentos a respeito de Ansible

Confira também os nossos demais artigos!

>> Setup manual do MariaDB

Abaixo vamos reproduzir o setup inicial na mão seguindo todo o processo de instalação, até a parte de segurança.

Não é necessária a reprodução dessa parte, é só pra exemplificar.

~# yum install mariadb-server -y
~# systemctl start mariadb
~# systemctl enable mariadb

Para os ajustes iniciais de segurança do MariaDB/MySQL existe o script: mysql_secure_instalation que já facilita nossa vida pra caramba.

~# mysql_secure_installation 

Enter current password for root (enter for none):
OK, successfully used password, moving on...
Set root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y

>> Pré-requisitos:

Para reproduzir esse artigo exatamente da forma como está, consideramos os seguintes requisitos:

  • Ansible instalado na máquina local Linux ou Mac
  • Máquina virtual RHEL/CentOS 7 para a instalação do MySQL
  • Acesso root a máquina

>> Iniciando a brincadeira

Preparando os arquivos do nosso pequeno projeto

Os processos de criação dos arquivos deve ocorrer em seu ambiente local com Ansible instalado, vamos criar o nosso arquivo de inventário e nele vamos adicionar o IP do host que vamos instalar o MariaDB.

~$ mkdir ansible-mariadb
~$ vim hosts

Adicione o conteúdo abaixo com IP da máquina que será instalado o MariaDB.

[dbservers]
192.168.100.108

Preparando o arquivo de template que conterá o usuário e senha, a variável password será ser substituida em tempo de execução pelo valor da variável que vamos definir no playbook, e esse arquivo será enviado para o host remoto em: /root/.my.cnf, dessa forma o Ansible conseguirá se conectar no Banco para fazer outras tarefas que você precise posteriormente (esse é apenas uma das possibilidades)

~$ vim client-my-cnf.j2
[client]
user=root
password={{ mysql_root_pass.stdout }}

>> Criando o Playbook

Agora vamos pensar na automatização, vamos pensar nesse processo tendo que ser rodado em outras ocasiões, em outros projetos, e até mesmo em várias vezes no mesmo dia, de forma manual a tarefa seria muito massante certo?

Para que o entendimento fique fácil vou descrever task por task, para que você possa reproduzir, e conseguir de fato executar primeiramente na sua máquina vamos criar o arquivo do playbook, e nesse arquivo você deve copiar trecho por trecho para compor o arquivo.

~$ vim mariadb.yml

Fique atento da identação, pois o YAML file do Ansible depende totalmente da identação correta, a identação deve ser feita sempre com 2 ESPAÇOS nunca com TABS

Cabeçalho inicial do Playbook

Vamos começar declarando cabeçalho do nosso playbook, onde em hosts: informamos ao nosso playbook que as tasks serão executadas no grupo dbservers do nosso arquivo de inventário, e em remote_user: falamos que o Ansible irá utilizar o usuário root para executar a instalação na máquina remota.

---
- name: MariaDB | Deploy and Security Instalation
  hosts: dbservers
  remote_user: root
  tasks:

Instalação do MariaDB

O módulo yum permite o gerenciamento de pacotes em sistemas da família RHEL. Com essa task garantimos a instalação dos pacotes, e pela sua idempotência ela pode ser rodada quantas vezes você desejar sem problema algum.

#
  - name: MariaDB | Install database
    yum:
      name: '{{ item }}'
      state: latest
    with_items:
      - mariadb
      - mariadb-server
      - MySQL-python

Iniciando e habilitando o MariaDB na inicialização do sistema

O módulo service tem a função de iniciar gerenciar um serviço, no nosso caso estamos iniciando o serviço e habilitando ele para iniciar automaticamente no boot da máquina.

#
  - name: MariaDB | Starting and enabled database
    service:
      name: mariadb
      state: started
      enabled: yes

Gerando uma senha randômica

Com o módulocommand, podemos executar comandos em hosts remotos.

Estamos usando o comando openssl rand por exemplo para gerar uma senha randômica base64 registrando o resultado na variável: mysql_root_pass para utilizarmos posteriormente.

O argumento creates=/root/.my.cnf valida se existe esse arquivo na máquina remota, caso exista ocorre o skipping da task..

#
  - name: MariaDB | Create a new pass for root user
    command: openssl rand -base64 6 creates=/root/.my.cnf
    register: mysql_root_pass

Exibindo a senha gerada no output do Playbook

O módulo debug imprime instruções durante a execução. Vamos utilizá-lo para exibir a senha gerada no output do playbook, com a condição when: informamos que a task só será executada se a variável mysql_root_pass.changed tiver sido populada pela task anterior

#
  - name: MariaDB | Display new pass in playbook  output
    debug:
      msg: "New root pass: {{mysql_root_pass.stdout}}"
    when: mysql_root_pass.changed

Removendo o acesso anônimo

O módulo mysql_user permite gerenciar os usuários do banco, na instalação inicial do MariaDB/MySQL o acesso anônimo vem habilitado, e isso permite que façamos conexão no banco sem utilizar usuário e senha, então, vamos remover

#
  - name: MariaDB | Remove anonymous access
    mysql_user: name="" host={{ item }} state=absent
    with_items:
      - localhost
      - "{{ ansible_fqdn }}"

Removendo a base de test

O módulo mysql_db adiciona ou remove os databases. O database test vem na instalação padrão, e na verdade não tem funcionalidade e nem necessidade em tê-la rodando no ambiente, pode isso vamos remover.

#
  - name: MariaDB | Remove test database
    mysql_db: name=test state=absent

Alterando a senha do MariaDB

Novamente utilizando o módulo mysql_user para alterar a senha do usuário root.

O parâmetro when: é o primeiro a ser verificado, somente se o valor da variável mysql_root_pass tiver sido alterada nas tasks anteriores caso o contrário ocorre um skipping da task

Se ela for executada, o parâmetro with_items: fará um loop substituindo o argumento host={{ item }} pelo valor, e o argumento password= receberá o output da variável que possui a senha armazenada.

#
  - name: MariaDB | Change root pass
    mysql_user: name=root host={{ item }} password={{ mysql_root_pass.stdout }}
    with_items:
      - "{{ansible_fqdn}}"
      - 127.0.0.1
      - ::1
      - localhost
    when: mysql_root_pass.changed

Copiando o .my.cnf para o servidor

O módulo template serve para realizar a cópia de arquivos dinâmicos no padrão jinja2, são arquivos que possuem variáveis e em tempo de execução do playbook esse arquivo é populado, e as variáveis são substituídas pelos respectivos valores definidos para elas.

No exemplo que temos abaixo, estamos pegando o arquivo client-my-cnf.j2, e transferindo para o host remoto, e no when estabelecemos uma condição onde essa task só será executada se a variável mysql_root_pass tiver sido alterada.

#
  - name: MariaDB | Publish file .my.cnf in the root home
    template:
      src: client-my-cnf.j2
      dest: /root/.my.cnf
    when: mysql_root_pass.changed

>> Executando o playbook e vendo a mágica!

Bom, chegou o momento de executar o playbook, se você seguiu tudo corretamente como foi informado a sua execução ocorrerá com sucesso.

Vamos ver como fica:

$ ansible-playbook -i hosts mariadb.yml --ask-pass
SSH password: 

PLAY [MariaDB | Deploy and Security Instalation] ********************************

TASK [Gathering Facts] ********************************
ok: [192.168.100.108]

TASK [MariaDB | Install database] ********************************
changed: [192.168.100.108] => (item=[u'mariadb', u'mariadb-server', u'MySQL-python'])

TASK [MariaDB | Starting and enabled database] *******************************
changed: [192.168.100.108]

TASK [MariaDB | Create a new pass for root user] *************************
changed: [192.168.100.108]

TASK [MariaDB | Display new pass in playbook  output] *********************
ok: [192.168.100.108] => {
    "msg": "New root pass: KWasFIt6"
}

TASK [MariaDB | Remove anonymous access] ***************************
changed: [192.168.100.108] => (item=localhost)
changed: [192.168.100.108] => (item=mariadb-ansible)

TASK [MariaDB | Remove test database] **************************
changed: [192.168.100.108]

TASK [MariaDB | Change root pass] ********************************
changed: [192.168.100.108] => (item=mariadb-ansible)
changed: [192.168.100.108] => (item=127.0.0.1)
changed: [192.168.100.108] => (item=::1)
changed: [192.168.100.108] => (item=localhost)

TASK [MariaDB | Publish file .my.cnf in the root home] *******************
changed: [192.168.100.108]

PLAY RECAP 
192.168.100.108            : ok=9    changed=7    unreachable=0    failed=0

Você pode olhar as tasks e verá que em um total de 10 tasks, tivemos 10 ok, e 7 que tiveram alterações, o output da execução do playbook fala por si só!

>> Validando a instalação no host remoto

Agora é entrar no servidor remoto e conferir se a mágica realmente aconteceu

~$ ssh root@192.168.100.108 
[root@mariadb-ansible ~]# cat .my.cnf
[client]
user=root
password=KWasFIt6
[root@mariadb-ansible ~]# ps -ef |grep mysql
mysql     5736     1  0 03:38 ?        00:00:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
mysql     5898  5736  0 03:38 ?        00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
root      6516  2426  0 03:51 pts/0    00:00:00 grep --color=auto mysql
[root@mariadb-ansible ~]# systemctl status mariadb | grep -i -E 'Active|Load'
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2017-11-26 03:38:45 -02; 13min ago
[root@mariadb-ansible ~]# mysql -uroot -pKWasFIt6
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+

Se chegou até aqui, SUCESSO TOTAL! …PARABÉNS!

>> Conclusão

Ansible tem de fato mostrado o seu valor e a sua aplicabilidade é incrível, espero que esse artigo traga valor para aqueles que desejam conhecer mais dessa ferramenta.

Para esse artigo usei como base o aprendizado passado pelo Marcos Sungaila da Savant que ministrou um excelente curso de nome: “Ansible Primeiros Passos”, recomendo!

E faço aqui a menção a comunidade AnsibleBR que possui um grupo no Telegram, e em uma iniciativa extremente importante estão desenvolvendo uma documentação TOP em português, para acessá-la clique aqui.

Gostou? Comente e compartilhe para que possamos evoluir com os estudos.

Abraços!