Developer Advocate
[label Automatizando a configuração de servidor com materiais do Kit Workshop Ansible] Este kit workshop foi desenvolvido para ajudar uma audiência técnica a se familiarizar com conceitos de gerenciamento de configuração e como usar o Ansible para automatizar a configuração de infraestrutura do servidor.
O objetivo é fornecer um conjunto completo de recursos para um palestrante sediar um evento e realizar uma palestra introdutória sobre o Ansible. São os recursos:
Este tutorial tem como objetivo complementar a demonstração da palestra com detalhes e esclarecimentos adicionais. Ele também serve como referência aos leitores que buscam implantar um aplicativo Laravel em um servidor Ubuntu remoto usando o Ansible.
A automação de servidores desempenha agora um papel fundamental na administração de sistemas, devido à natureza descartável de ambientes de aplicativo modernos. As ferramentas de gerenciamento de configuração, como o Ansible, são normalmente utilizadas para simplificar o processo de automatização da configuração do servidor, estabelecendo procedimentos padrão para novos servidores. Elas têm o benefício de reduzir o erro humano associado a configurações manuais.
O Ansible oferece uma arquitetura simplificada que não exige que softwares especiais sejam instalados em nós. Ele também fornece um conjunto robusto de recursos e módulos integrados que facilitam a escrita de scripts de automação.
Este tutorial foi desenvolvido para acompanhar as notas de slides e notas do palestrante para Automatizando a configuração de servidor com materiais do Kit Workshop Ansible. Ele mostrará a você como configurar um arquivo de inventário e executar um conjunto de scripts de provisionamento, para automatizar completamente o processo de configuração de um servidor remoto LEMP (Linux, ENginx, MariaDB e PHP-FPM) no Ubuntu 18.04, e como implantar um aplicativo de demonstração Laravel para este sistema.
Nota: este material foi criado para demonstrar como usar playbooks para automatizar a configuração do servidor com o Ansible. Embora nossa demonstração seja constituída por um aplicativo Laravel funcionando em um servidor LEMP, encorajamos os leitores a modificar e adaptar a configuração incluída aqui, para atender suas próprias necessidades.
Para seguir este tutorial, você vai precisar do seguinte:
authorized_keys
, conforme explicado no Passo 2 do guia de Como configurar chaves SSH no Ubuntu 18.04. Caso esteja usando os Droplets da DigitalOcean como nós, utilize o painel de controle para adicionar sua chave pública aos hosts do Ansible.A primeira coisa que precisamos fazer é clonar o repositório que contém os scripts de provisionamento e o aplicativo de demonstração Laravel, que vamos implantar nos servidores remotos. Todos os arquivos necessários podem ser encontrados no repositório do Github, do-community/ansible-laravel-demo.
Após fazer login em seu nó de controle do Ansible como usuário sudo, clone o repositório e vá até o diretório criado pelo comando git
:
- git clone https://github.com/do-community/ansible-laravel-demo.git
- cd ansible-laravel-demo
Agora, execute um comando ls
para verificar o conteúdo do repositório clonado:
- ls -l --group-directories-first
Você verá um resultado como este:
drwxrwxr-x 3 sammy sammy 4096 Mar 24 15:24 application
drwxrwxr-x 2 sammy sammy 4096 Mar 24 15:24 group_vars
drwxrwxr-x 7 sammy sammy 4096 Mar 24 15:24 roles
-rw-rw-r-- 1 sammy sammy 102 Mar 24 15:24 inventory-example
-rw-rw-r-- 1 sammy sammy 1987 Mar 24 15:24 laravel-deploy.yml
-rw-rw-r-- 1 sammy sammy 794 Mar 24 15:24 laravel-env.j2
-rw-rw-r-- 1 sammy sammy 920 Mar 24 15:24 readme.md
-rw-rw-r-- 1 sammy sammy 318 Mar 24 15:24 server-setup.yml
Aqui temos uma visão geral de cada uma destas pastas e arquivos, e o que eles são:
application/
: este diretório contém o aplicativo de demonstração Laravel, que será implantado no servidor remoto, até o final do workshop.group_vars/
: este diretório possui os arquivos de variável, que contém opções personalizadas para a configuração do aplicativo, como credenciais de banco de dados e onde armazenar os arquivos do aplicativo no servidor remoto.roles/
: este diretório contém as diferentes funções do Ansible, que lidam com o fornecimento de um servidor LEMP do Ubuntu.inventory-example
: este arquivo pode ser usado como base para criar um inventário personalizado para sua infraestrutura.laravel-deploy.yml
: este playbook implantará o aplicativo de demonstração Laravel ao servidor remoto.laravel-env.j2
: este modelo é utilizado pelo playbook laravel-deploy.yml
para configurar o arquivo de ambiente do aplicativo.readme.md
: este arquivo contém informações gerais sobre o provisionamento contido neste repositório.server-setup.yml
: este playbook provisionará um servidor LEMP usando as funções definidas no diretório roles/
.Agora, criaremos um arquivo de inventário para listar os hosts que queremos gerenciar usando o Ansible. Primeiro, copie o arquivo inventory-example
para um novo arquivo chamado hosts
:
- cp inventory-example hosts
Utilize seu editor de texto preferido para abrir o novo arquivo de inventário e atualizá-lo com os seus próprios servidores. Aqui, usaremos o nano
:
- nano hosts
O inventário de exemplo que vem com o kit do workshop contém dois grupos do Ansible: o dev
e o production
. Isso é feito para demonstrar como usar variáveis de grupo para personalizar a implantação em vários ambientes. Caso queira testar esta configuração com um único nó, utilize o grupo dev
ou o grupo production
, e remova o outro do arquivo de inventário.
[dev]
203.0.113.0.101
[prod]
203.0.113.0.102
[all:vars]
ansible_python_interpreter=/usr/bin/python3
Nota: a variável ansible_python_interpreter
define o caminho para o executável do Python no host remoto. Aqui, estamos dizendo ao Ansible para definir esta variável para todos os hosts, neste arquivo de inventário.
Salve e feche o arquivo quando terminar. Caso esteja usando o nano
, faça isso pressionando CTRL+X
e, depois, Y
e ENTER
para confirmar.
Assim que terminar de ajustar seu arquivo de inventário, execute o módulo do Ansible ping
para testar se o nó de controle consegue se conectar aos hosts:
- ansible all -i hosts -m ping -u root
Vamos detalhar este comando:
all
: esta opção diz ao Ansible para executar o seguinte comando em todos os hosts do arquivo de inventário designado.-i hosts
: especifica qual inventário deve ser utilizado. Quando esta opção não for fornecida, o Ansible tentará usar o inventário padrão, que está normalmente localizado em /etc/ansible/hosts
.-m ping
: este comando executará o módulo do Ansible ping
, que testará a conectividade aos nós e testará se o executável do Python pode ser encontrado nos sistemas remotos ou não.-u root
: esta opção especifica qual usuário remoto deve ser utilizado para se conectar aos nós. Estamos usando a conta root aqui como exemplo, pois essa é, normalmente, a única conta disponível em novos servidores. Pode ser necessário utilizar outras opções de conexão, dependendo do seu provedor de infraestrutura e da configuração SSH.Se sua conexão via protocolo SSH aos nós estiver devidamente configurada, você receberá o seguinte resultado:
Output203.0.113.0.101 | SUCCESS => {
"changed": false,
"ping": "pong"
}
203.0.113.0.102 | SUCCESS => {
"changed": false,
"ping": "pong"
}
A resposta pong
mostra que seu nó de controle consegue se conectar aos seus nós gerenciados, e que o Ansible consegue executar comandos do Python nos hosts remotos.
Antes de executar o playbook incluído neste kit de workshop, primeiro será necessário editar o arquivo de variável que contém algumas configurações, como o nome do usuário remoto a ser criado e as credenciais do banco de dados para configuração com o MariaDB.
Abra o arquivo group_vars/all
utilizando seu editor de texto favorito:
- nano group_vars/all.yml
---
# Initial Server Setup
remote_user: sammy
# MySQL Setup
mysql_root_password: MYSQL_ROOT_PASSWORD
mysql_app_db: travellist
mysql_app_user: travellist_user
mysql_app_pass: DB_PASSWORD
# Web Server Setup
http_host: "{{ ansible_facts.eth0.ipv4.address }}"
remote_www_root: /var/www
app_root_dir: travellist-demo
document_root: "{{ remote_www_root }}/{{ app_root_dir }}/public"
# Laravel Env Variables
app_name: Travellist
app_env: dev
app_debug: true
app_url: "http://{{ http_host }}"
db_host: localhost
db_port: 3306
db_database: "{{ mysql_app_db }}"
db_user: "{{ mysql_app_user }}"
db_pass: "{{ mysql_app_pass }}"
As variáveis que precisam de sua atenção são:
remote_user
: o usuário especificado será criado no servidor remoto e terá privilégios sudo
.mysql_root_password
: esta variável define a senha root do banco de dados para o servidor MariaDB. Note que essa deve ser uma senha segura de sua escolha.mysql_app_db
: o nome do banco de dados a ser criado para o aplicativo Laravel. Não é necessário alterar este valor, mas você pode fazê-lo, caso queira. Este valor será usado para configurar o arquivo de configuração .env
, do Laravel.mysql_app_user
: o nome do usuário do banco de dados para o aplicativo Laravel. Novamente, você não precisa alterar este valor, mas pode fazer isso se quiser.mysql_app_pass
: a senha do banco de dados para o aplicativo Laravel. Ela deve ser uma senha segura de sua escolha.http_host
: o nome do domínio ou endereço IP do host remoto. Aqui, estamos usando um fact do Ansible que contém o endereço ipv4 para a interface de rede eth0
. Caso tenha nomes de domínios apontando para seus hosts remotos, é possível que você queira criar arquivos de variável separados para cada um deles, sobrepondo seu valor para que a configuração do Nginx contenha o nome do host correto para cada servidor.Quando terminar de editar esses valores, salve e feche o arquivo.
Se você configurou seu arquivo de inventário com vários nós, você talvez queira criar arquivos de variável adicionais para configurar cada nó adequadamente. Em nosso inventário de exemplo, criamos dois grupos distintos: o dev
e o production
. Para evitar ter as mesmas credenciais do banco de dados e outras configurações em ambos os ambientes, precisamos criar um arquivo de variável separado para reter os valores de produção.
Você pode copiar o arquivo de variável padrão e usá-lo como base para seus valores de produção:
- cp group_vars/all.yml group_vars/production.yml
- nano group_vars/production.yml
Como o arquivo all.yml
contém os valores padrão, que devem ser válidos para todos os ambientes, remova todas as variáveis que não precisarão de alterações no novo arquivo production.yml
. As variáveis que você deve atualizar para cada ambiente estão destacadas aqui:
---
# Initial Server Setup
remote_user: prod_user
# MySQL Setup
mysql_root_password: MYSQL_PROD_ROOT_PASSWORD
mysql_app_pass: MYSQL_PROD_APP_PASSWORD
# Laravel Env Variables
app_env: prod
app_debug: false
Note que alteramos o valor app_env
para prod
e definimos o valor app_debug
para false
. Estas são configurações do Laravel, recomendadas para ambientes de produção.
Assim que terminar de personalizar suas variáveis de produção, salve e feche o arquivo.
Se você planeja compartilhar sua configuração do Ansible com outros usuários, é importante garantir a segurança das credenciais do banco de dados e de outros dados confidenciais em seus arquivos de variável. É possível fazer isso com o Ansible Vault, um recurso incluído no Ansible por padrão. O Ansible Vault permite criptografar arquivos de variável, para que, apenas usuários com acesso à senha do vault possam visualizar, editar ou criptografar estes arquivos. A senha do vault também é necessária para executar um playbook ou um comando que faz o uso de arquivos criptografados.
Para criptografar seu arquivo de variável de produção, execute:
- ansible-vault encrypt group_vars/production.yml
Será solicitado que você forneça uma senha do vault e a confirme. Assim que terminar, se verificar o conteúdo deste arquivo, verá que os dados estão criptografados.
Se quiser visualizar o arquivo de variável sem alterar o conteúdo dela, utilize o comando view
:
- ansible-vault view group_vars/production.yml
Será solicitado que forneça a mesma senha que você definiu ao criptografar o arquivo com o ansible-vault
. Após fornecer a senha, o conteúdo do arquivo aparecerá em seu terminal. Para sair da visualização de arquivos, digite q
.
Para editar um arquivo que foi anteriormente criptografado com o Ansible Vault, utilize o comando edit
vault:
- ansible-vault edit group_vars/production.yml
Este comando solicitará que você forneça a senha do vault para o arquivo. Em seguida, seu editor de terminal padrão será usado para abrir o arquivo para edição. Após fazer as alterações desejadas, salve e feche o arquivo. Ele será criptografado novamente, de maneira automática, pelo Ansible Vault.
Você finalizou a configuração de seus arquivos de variável. No próximo passo, executaremos o playbook para configurar o Nginx, o PHP-FPM e o MariaDB (que, junto com um sistema operacional baseado em Linux, como o Ubuntu, forma a pilha LEMP) em seu(s) servidor(es) remoto(s).
Antes de implantarmos o app de demonstração Laravel para o(s) servidor(es) remoto(s), precisamos configurar um ambiente LEMP que exibirá o aplicativo. O playbook server-setup.yml
inclui as funções do Ansible, necessárias para esta configuração. Para verificar o conteúdo, execute:
- cat server-setup.yml
---
- hosts: all
become: true
roles:
- { role: setup, tags: ['setup'] }
- { role: mariadb, tags: ['mysql', 'mariadb', 'db', 'lemp'] }
- { role: php, tags: ['php', 'web', 'php-fpm', 'lemp'] }
- { role: nginx, tags: ['nginx', 'web', 'http', 'lemp'] }
- { role: composer, tags: ['composer'] }
Aqui temos uma visão geral de todas as funções incluídas neste playbook:
setup
: contém as tarefas necessárias para criar um novo usuário de sistema, e conceder-lhes privilégios sudo
, assim como o acesso ao firewall ufw
.mariadb
: instala o servidor do banco de dados MariaDB e cria o banco de dados e o usuário do aplicativo.php
: instala o php-fpm
e os módulos PHP necessários para executar um aplicativo Laravel.nginx
: instala o servidor Web Nginx e habilita o acesso na porta 80
.composer
: instala o Composer a nível global.Note que configuramos algumas tags dentro de cada função. Isto é feito para facilitar a nova execução de apenas partes deste playbook, se necessário. Se quiser fazer alterações em seu arquivo modelo do Nginx, por exemplo, execute somente a função do Nginx.
O seguinte comando executará este playbook em todos os servidores do seu arquivo de inventário. O --ask-vault-pass
é necessário apenas caso tenha usado o ansible-vault
para criptografar arquivos de variável no passo anterior:
- ansible-playbook -i hosts server-setup.yml -u root --ask-vault-pass
Você obterá um resultado parecido com este:
OutputPLAY [all] **********************************************************************************************
TASK [Gathering Facts] **********************************************************************************
ok: [203.0.113.0.101]
ok: [203.0.113.0.102]
TASK [setup : Install Prerequisites] ********************************************************************
changed: [203.0.113.0.101]
changed: [203.0.113.0.102]
...
RUNNING HANDLER [nginx : Reload Nginx] ******************************************************************
changed: [203.0.113.0.101]
changed: [203.0.113.0.102]
PLAY RECAP **********************************************************************************************
203.0.113.0.101 : ok=31 changed=27 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1
203.0.113.0.102 : ok=31 changed=27 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1
Seus nós estão prontos para exibir aplicativos PHP usando o Nginx+PHP-FPM, com o MariaDB como o servidor do banco de dados. No próximo passo, implantaremos o app de demonstração Laravel, incluído no playbook do Ansible, laravel-deploy.yml
.
Agora que você tem um ambiente LEMP funcionando em seu(s) servidor(es) remoto(s), execute o playbook laravel-deploy.yml
. Este playbook executará as seguintes tarefas:
sync
.acl
para definir as permissões para o usuário www-data na pasta de armazenamento..env
do aplicativo com base no modelo laravel-env.j2
.storage
.Este playbook deve ser executado por um usuário não root, com permissões sudo
. Este usuário deveria ter sido criado quando você executou o playbook server-setup.yml
no passo anterior, usando o nome definido pela variável remote_user
.
Quando estiver pronto, execute o playbook laravel-deploy.yml
com:
- ansible-playbook -i hosts laravel-deploy.yml -u sammy --ask-vault-pass
O --ask-vault-pass
é necessário apenas caso tenha usado o ansible-vault
para criptografar arquivos de variável no passo anterior.
Você obterá um resultado parecido com este:
OutputPLAY [all] **********************************************************************************************
TASK [Gathering Facts] **********************************************************************************
ok: [203.0.113.0.101]
ok: [203.0.113.0.102]
TASK [Make sure the remote app root exists and has the right permissions] *******************************
ok: [203.0.113.0.101]
ok: [203.0.113.0.102]
TASK [Rsync application files to the remote server] *****************************************************
ok: [203.0.113.0.101]
ok: [203.0.113.0.102]
...
TASK [Run Migrations + Seeders] *************************************************************************
ok: [203.0.113.0.101]
ok: [203.0.113.0.102]
PLAY RECAP **********************************************************************************************
203.0.113.0.101 : ok=10 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
203.0.113.0.102 : ok=10 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Quando a execução terminar, acesse o aplicativo de demonstração, apontando o navegador para o nome do domínio ou endereço IP do nó:
http://node_domain_or_IP
Você verá uma página como esta:
Este tutorial demonstra como configurar um arquivo de inventário do Ansible e se conectar a nós remotos. Ele também ensina a executar playbooks do Ansible para configurar um servidor LEMP e implantar nele um aplicativo de demonstração Laravel. Este guia complementa os slides e as notas do palestrante referentes ao tema Automatizando a configuração de servidor com materiais do Kit Ansible Workshop, e vem acompanhado de um repositório Github demonstrativo, que contém todos os arquivos necessários para acompanhar a parte prática deste workshop.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!