Tutorial

Como usar o Ansible para instalar e configurar o LAMP no Ubuntu 18.04

ApachePHPLAMP StackAnsibleAutomated Setups

Introdução

Atualmente, a automação de servidores desempenha um papel fundamental na administração dos sistemas, devido à natureza descartável dos ambientes dos aplicativos modernos. Normalmente, as ferramentas de gerenciamento de configuração como o Ansible são usadas para simplificar o processo de automação da configuração dos servidores, estabelecendo procedimentos padrão para novos servidores, ao mesmo tempo que reduzindo os erros humanos associados à configuração manual.

A ferramenta Ansible oferece uma arquitetura simples que não exige a instalação de softwares especiais nos diferentes nós. Ela também fornece um conjunto robusto de recursos e módulos integrados que facilitam a escrita de scripts de automação.

Este guia explica como usar o Ansible para automatizar os passos contidos em nosso guia sobre Como instalar o Linux, Apache, MySQL e PHP (LAMP) no Ubuntu 18.04. Uma pilha “LAMP” é um grupo de softwares de código aberto que são normalmente instalados juntos para permitir que um servidor hospede sites dinâmicos e aplicativos Web. Este termo é, na verdade, uma sigla que representa o sistema operacional Linux, com o servidor Web do Apache. Os dados do site são armazenados em uma base de dados MySQL e o conteúdo dinâmico é processado pelo PHP.

Pré-requisitos

Para executar a configuração automatizada fornecida pelo playbook que estamos discutindo neste guia, você vai precisar de:

Antes de prosseguir, primeiramente, você precisa garantir que seu nó de controle do Ansible consegue se conectar ao seu(s) host(s) do Ansible e executar comandos nele(s). Para obter um teste de conexão, verifique o passo 3 sobre Como instalar e configurar o Ansible no Ubuntu 18.04.

O que esse playbook faz?

O playbook, ou guia do Ansible traz um modo alternativo de executar manualmente o procedimento mostrado em nosso guia sobre Como instalar o Linux, Apache, MySQL e PHP (LAMP) no Ubuntu 18.04.

A execução desse playbook realizará as ações a seguir nos seus hosts do Ansible:

  1. Instale o aptitude - preferido pelo Ansible como uma alternativa ao gerenciador de pacotes apt.
  2. Instale os pacotes LAMP necessários.
  3. Crie um novo VirtualHost do Apache e configure um diretório base, dedicado a esse host.
  4. Habilite o novo VirtualHost.
  5. Desabilite o site padrão do Apache, quando a variável *disable_default *estiver definida como true.
  6. Defina a senha para o usuário raiz do MySQL.
  7. Remova as contas anônimas do MySQL e do banco de dados de teste.
  8. Configure a ferramenta UFW para permitir tráfego do HTTP na porta configurada (80 por padrão).
  9. Defina um script de teste para PHP, usando o template fornecido.

Assim que o playbook terminar de executar, você terá um ambiente PHP para Web em execução no Apache, com base nas opções que você definiu dentro das suas variáveis de configuração.

Como usar este playbook

A primeira coisa que precisamos fazer é obter o playbook do LAMP e suas dependências a partir do repositório do-community/ansible-playbooks. Precisamos clonar esse repositório em uma pasta local, dentro do Nó de controle do Ansible.

Se você tiver clonado esse repositório anteriormente, enquanto seguia um outro guia, acesse a cópia do ansible-playbooks existente e execute um comando git pull para assegurar que você tem o conteúdo atualizado:

  • cd ~/ansible-playbooks
  • git pull

Se esta é a primeira vez que você usa o repositório do-community/ansible-playbooks, você deve começar clonando o repositório para sua pasta inicial com:

  • cd ~
  • git clone https://github.com/do-community/ansible-playbooks.git
  • cd ansible-playbooks

Os arquivos nos quais estamos interessados estão localizados dentro da pasta lamp_ubuntu1804, que tem a seguinte estrutura:

lamp_ubuntu1804
├── files
│   ├── apache.conf.j2
│   └── info.php.j2
├── vars
│   └── default.yml
├── playbook.yml
└── readme.md

A seguir, apresentamos a finalidade de cada um desses arquivos:

  • files/info.php.j2: arquivo de modelo para configurar uma página de teste PHP na raiz do servidor Web.
  • files/apache.conf.j2: arquivo de modelo para configurar o VirtualHost do Apache.
  • vars/default.yml: arquivo de variável para a personalizar as configurações do playbook.
  • playbook.yml: o arquivo do playbook, que contém as tarefas a serem executadas no(s) servidor(es) remoto(s).
  • readme.md: um arquivo de texto que contém informações sobre esse playbook.

Vamos editar o arquivo de variáveis do playbook para personalizar as configurações tanto do MySQL quanto do Apache. Acesse o diretório lamp_ubuntu1804 e abra o arquivo vars/default.yml usando o editor de linha de comando de sua escolha:

  • cd lamp_ubuntu1804
  • nano vars/default.yml

Este arquivo contém algumas variáveis que requerem sua atenção:

vars/default.yml
---
mysql_root_password: "mysql_root_password"
app_user: "sammy"
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"
disable_default: true

A lista a seguir contém uma explicação breve de cada uma dessas variáveis e como você poderia querer modificá-las:

  • mysql_root_password: a senha desejada para a conta raiz do MySQL.
  • app_user: um usuário não raiz remoto no host do Ansible que será definido como o proprietário dos arquivos do aplicativo.
  • http_host: seu nome de domínio.
  • http_conf: o nome do arquivo de configuração que será criado dentro do Apache.
  • http_port: porta para o HTTP desse host virtual, a qual, por padrão, é a porta 80.
  • disable_default: escolher desativar ou não o site padrão que vem com o Apache.

Assim que terminar de atualizar as variáveis dentro de vars/default.yml, salve e feche este arquivo. Se tiver usado o nano, para salvar e fechar o arquivo, pressione as teclas CTRL+X, Y e, depois, ENTER.

Agora, você está pronto para executar este playbook em um ou mais servidores. Por padrão, a maioria dos playbooks vem configurada para execução em cada servidor de seu inventário. Podemos usar o sinalizador -l para garantir que apenas um subconjunto de servidores, ou um único servidor seja afetado pelo playbook. Também podemos usar o sinalizador -u para especificar qual usuário no servidor remoto estamos usando para nos conectar e executar os comandos do playbook nos hosts remotos.

Para executar o playbook apenas no server1, conectando-se como sammy, utilize o seguinte comando:

  • ansible-playbook playbook.yml -l server1 -u sammy

Você receberá um resultado similar a este:

Output
PLAY [all] ********************************************************************************************************* TASK [Gathering Facts] *********************************************************************************************************ok: [server1] TASK [Install prerequisites] *********************************************************************************************************ok: [server1] => (item=aptitude) ... TASK [UFW - Allow HTTP on port 80] ********************************************************************************************************* changed: [server1] TASK [Sets Up PHP Info Page] ********************************************************************************************************* changed: [server1] RUNNING HANDLER [Reload Apache] ********************************************************************************************************* changed: [server1] RUNNING HANDLER [Restart Apache] ********************************************************************************************************* changed: [server1] PLAY RECAP ********************************************************************************************************* server1 : ok=15 changed=11 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

Nota: para obter mais informações sobre como executar os playbooks do Ansible, consulte nosso Guia de folha de referências do Ansible.

Quando o playbook terminar de executar, vá até seu navegador Web e acesse o endereço IP ou host do servidor, como configurado nas variáveis do playbook, seguido por /info.php:

http://server_host_or_IP/info.php

Você verá uma página como esta:

Página do phpinfo

Como essa página contém informações confidenciais sobre seu ambiente PHP, é recomendável que você a remova do servidor, executando um comando rm -f/var/www/info.php assim que terminar de configurá-lo.

O conteúdo do playbook

Você pode encontrar a configuração do servidor LAMP apresentada neste tutorial na pasta lamp_ubuntu1804, dentro do repositório de Playbooks da Comunidade DigitalOcean. Para copiar ou baixar o conteúdo do script diretamente, clique no botão Raw perto do topo de cada script.

Para sua conveniência, incluimos aqui o conteúdo completo do playbook, bem como os respectivos arquivos associados.

vars/default.yml

O arquivo de variável default.yml contém os valores que serão usados dentro das tarefas do playbook, tais como a senha para a conta root do MySQL e o nome de domínio a configurar dentro do Apache.

vars/default.yml
---
mysql_root_password: "mysql_root_password"
app_user: "sammy"
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"
disable_default: true

files/apache.conf.j2

O arquivo apache.conf.j2 é um arquivo modelo de Jinja 2, que configura um novo VirtualHost do Apache. As variáveis usadas dentro desse modelo estão definidas no arquivo da variável vars/default.yml.

files/apache.conf.j2
<VirtualHost *:{{ http_port }}>
   ServerAdmin webmaster@localhost
   ServerName {{ http_host }}
   ServerAlias www.{{ http_host }}
   DocumentRoot /var/www/{{ http_host }}
   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined

   <Directory /var/www/{{ http_host }}>
         Options -Indexes
   </Directory>

   <IfModule mod_dir.c>
       DirectoryIndex index.php index.html index.cgi index.pl  index.xhtml index.htm
   </IfModule>

</VirtualHost>

files/info.php.j2

O arquivo info.php.j2 é outro modelo de Jinja, usado para configurar um script PHP de teste no diretório base do servidor LAMP recém-configurado.

files/info.php.j2
<?php
phpinfo();

playbook.yml

O arquivo playbook.yml é onde fica a definição de todas as tarefas dessa configuração. Ele começa definindo o grupo de servidores que deverá ser objeto dessa configuração (all). Depois, ele usa become: true para definir que as tarefas deverão ser executadas - com elevação de privilégio (sudo), por padrão. Em seguida, ele inclui o arquivo de variável vars/default.yml para carregar as opções de configuração.

playbook.yml

---
- hosts: all
  become: true
  vars_files:
    - vars/default.yml

  tasks:
    - name: Install prerequisites
      apt: name={{ item }} update_cache=yes state=latest force_apt_get=yes
      loop: [ 'aptitude' ]

  #Apache Configuration
    - name: Install LAMP Packages
      apt: name={{ item }} update_cache=yes state=latest
      loop: [ 'apache2', 'mysql-server', 'python3-pymysql', 'php', 'php-mysql', 'libapache2-mod-php' ]

    - name: Create document root
      file:
        path: "/var/www/{{ http_host }}"
        state: directory
        owner: "{{ app_user }}"
        mode: '0755'

    - name: Set up Apache virtualhost
      template:
        src: "files/apache.conf.j2"
        dest: "/etc/apache2/sites-available/{{ http_conf }}"
      notify: Reload Apache

    - name: Enable new site
      shell: /usr/sbin/a2ensite {{ http_conf }}
      notify: Reload Apache

    - name: Disable default Apache site
      shell: /usr/sbin/a2dissite 000-default.conf
      when: disable_default
      notify: Reload Apache

  # MySQL Configuration
    - name: Sets the root password
      mysql_user:
        name: root
        password: "{{ mysql_root_password }}"
        login_unix_socket: /var/run/mysqld/mysqld.sock

    - name: Removes all anonymous user accounts
      mysql_user:
        name: ''
        host_all: yes
        state: absent
        login_user: root
        login_password: "{{ mysql_root_password }}"

    - name: Removes the MySQL test database
      mysql_db:
        name: test
        state: absent
        login_user: root
        login_password: "{{ mysql_root_password }}"

  # UFW Configuration
    - name: "UFW - Allow HTTP on port {{ http_port }}"
      ufw:
        rule: allow
        port: "{{ http_port }}"
        proto: tcp

  # PHP Info Page
    - name: Sets Up PHP Info Page
      template:
        src: "files/info.php.j2"
        dest: "/var/www/{{ http_host }}/info.php"

  handlers:
    - name: Reload Apache
      service:
        name: apache2
        state: reloaded

    - name: Restart Apache
      service:
        name: apache2
        state: restarted

Sinta-se à vontade para modificar esses arquivos para melhor adequar-se às suas necessidades específicas, em seu próprio fluxo de trabalho.

Conclusão

Neste guia, usamos o Ansible para automatizar o processo de instalação e configuração de um ambiente LAMP em um servidor remoto. Considerando que, normalmente, as pesssoas têm necessidades diferentes ao trabalhar com bancos de dados e usuários do MySQL, recomendamos que você examine a documentação oficial do Ansible para obter mais informações e casos de uso do módulo mysql_user do Ansible.

Se quiser incluir outras tarefas nesse playbook para personalizar ainda mais a configuração do seu servidor, consulte nosso guia de introdução ao Ansible, Gerenciamento de configuração 101: Como escrever playbooks no Ansible.

Creative Commons License