Meetup kit

Automating Server Setup with Ansible: Um Kit Workshop DigitalOcean

Configuration ManagementAnsible
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:

  • Notas de slides e do palestrante, incluindo vídeos de demonstração curtos e comandos para executar uma demonstração opcional ao vivo. Essa palestra leva cerca de 50 minutos.
  • Um repositório do GitHub, que contém o código do aplicativo de demonstração e os scripts necessários do Ansible para implantar esse aplicativo em um servidor Ubuntu.
  • Este tutorial, que fornece ao usuário um passo a passo na implementação do aplicativo Laravel de demonstração do Travellist, em um servidor remoto.

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.

Introdução

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.

Pré-requisitos

Para seguir este tutorial, você vai precisar do seguinte:

Passo 1 — Clonando o repositório de demonstração

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:

ansible-laravel-demo
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/.

Passo 2 — Configurando o arquivo de inventário e testando a conexão aos nós

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.

ansible-laravel-demo/hosts
[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:

Output
203.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.

Passo 3 — Configurando arquivos de variável

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
ansible-laravel-demo/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.

Criando arquivos de variável adicionais para vários ambientes

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:

ansible-laravel-demo/group_vars/production
---
# 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.

Criptografando arquivos de variável com o Ansible Vault

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

Passo 4 — Executando o playbook LEMP

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
ansible-laravel-demo/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:

Output
PLAY [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.

Passo 5 — Implantando o aplicativo Laravel

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:

  1. Crie o aplicativo do documento base no servidor remoto, se ele ainda não foi criado.
  2. Sincronize a pasta local do aplicativo para o servidor remoto, usando o módulo sync.
  3. Use o módulo acl para definir as permissões para o usuário www-data na pasta de armazenamento.
  4. Defina o arquivo .env do aplicativo com base no modelo laravel-env.j2.
  5. Instale as dependências do aplicativo com o Composer.
  6. Gere a chave de segurança do aplicativo.
  7. Defina um link público para a pasta storage.
  8. Execute as migrações e os propagadores do banco de dados.

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:

Output
PLAY [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:

Demonstração Travellist do Laravel

Conclusão

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.

0 Comments

Creative Commons License