>> 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!
Deixe um comentário