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

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 WordPress com LAMP no Ubuntu 18.04. O WordPress é o CMS (sistema de gerenciamento de conteúdo) mais popular na internet, permitindo que os usuários configurem blogs e sites flexíveis, além de um back-end do MySQL com processamento em PHP. Após a configuração, quase toda a administração pode ser feita através do front-end da Web.

Pré-requisitos

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

  • Um nó de controle do Ansible: um computador em Ubuntu 18.04 com o Ansible instalado e configurado para se conectar com seus hosts do Ansible usando chaves SSH. Certifique-se de que o nó de controle tenha um usuário regular com permissões sudo e um firewall habilitado, como explicado em nosso guia de Configuração inicial de servidor. Para configurar o Ansible, siga nosso guia sobre Como instalar e configurar o Ansible no Ubuntu 18.04.
  • Um ou mais hosts do Ansible: um ou mais servidores remotos com Ubuntu 18.04, que tenham sido previamente configurados de acordo com o guia sobre Como usar o Ansible para automatizar a configuração inicial de servidor no Ubuntu 18.04.

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 WordPress com LAMP no Ubuntu 18.04.

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

  1. Instalar o aptitude – preferido pelo Ansible como uma alternativa ao gerenciador de pacotes apt.
  2. Instalar os pacotes LAMP e extensões PHP necessários.
  3. Criar e habilitar um novo VirtualHost Apache para o site do WordPress.
  4. Habilitar o módulo de reescrita do Apache (mod_rewrite).
  5. Desabilitar o site padrão do Apache.
  6. Definir a senha para o usuário** raiz** do MySQL.
  7. Remover as contas anônimas do MySQL e do banco de dados de teste.
  8. Criar um novo banco de dados e usuário do MySQL para o site do WordPress.
  9. Configurar a ferramenta UFW para permitir tráfego do HTTP na porta configurada (80 por padrão).
  10. Fazer download e descompactar o WordPress.
  11. Configurar a propriedade e as permissões corretas do diretório.
  12. Definir o arquivo wp-config.php usando o modelo fornecido.

Assim que o playbook terminar de executar, você terá uma instalação do WordPress em execução num ambiente LAMP, 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 WordPress em 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 ficam na pasta wordpress-lamp_ubuntu1804, a qual tem a seguinte estrutura:

wordpress-lamp_ubuntu1804 ├── files │   ├── apache.conf.j2 │   └── wp-config.php.j2 ├── vars │   └── default.yml ├── playbook.yml └── readme.md 

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

  • files/apache.conf.j2: arquivo de modelo para configurar o VirtualHost do Apache.
  • files/wp-config.php.j2: arquivo de modelo para configurar o arquivo de configuração do WordPress.
  • 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 da variável do playbook para personalizar suas opções. Acesse o diretório wordpress-lamp_ubuntu1804 e abra o arquivo vars/default.yml usando o editor de linha de comando de sua escolha:

  • cd wordpress-lamp_ubuntu1804
  • nano vars/default.yml

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

vars/default.yml

--- #System Settings php_modules: [ 'php-curl', 'php-gd', 'php-mbstring', 'php-xml', 'php-xmlrpc', 'php-soap', 'php-intl', 'php-zip' ]  #MySQL Settings mysql_root_password: "mysql_root_password" mysql_db: "wordpress" mysql_user: "sammy" mysql_password: "password"  #HTTP Settings http_host: "your_domain" http_conf: "your_domain.conf" http_port: "80" 

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

  • php_modules: uma matriz que contém extensões do PHP que devem ser instaladas para auxiliar sua configuração do WordPress. Você não precisa alterar essa variável, mas pode querer incluir novas extensões na lista caso sua configuração específica necessite.
  • mysql_root_password: a senha desejada para a conta root do MySQL.
  • mysql_db: o nome do banco de dados do MySQL que deverá ser criado para o WordPress.
  • mysql_user: o nome do usuário do MySQL que deverá ser criado para o WordPress.
  • mysql_password: a senha para o novo usuário do MySQL.
  • 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.

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:

OutputPLAY [all] *****************************************************************************************************************************  TASK [Gathering Facts] ***************************************************************************************************************** ok: [server1]  TASK [Install prerequisites] *********************************************************************************************************** ok: [server1]  …  TASK [Download and unpack latest WordPress] ******************************************************************************************** changed: [server1]  TASK [Set ownership] ******************************************************************************************************************* changed: [server1]  TASK [Set permissions for directories] ************************************************************************************************* changed: [server1]  TASK [Set permissions for files] ******************************************************************************************************* changed: [server1]  TASK [Set up wp-config] **************************************************************************************************************** changed: [server1]  RUNNING HANDLER [Reload Apache] ******************************************************************************************************** changed: [server1]  RUNNING HANDLER [Restart Apache] ******************************************************************************************************* changed: [server1]  PLAY RECAP ***************************************************************************************************************************** server1          : ok=22   changed=18   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 para concluir a instalação do WordPress a partir de lá.

Navegue até o nome de domínio do seu servidor ou endereço IP público:

http://server_host_or_IP 

Você verá uma página como esta:

Página de seleção de idiomas do WordPress

Após selecionar o idioma que deseja usar para sua instalação do WordPress, será mostrado um passo final para configurar seu usuário e senha do WordPress, de modo que você possa fazer logon em seu painel de controle:

Configuração do WordPress

Quando clicar adiante, você será levado para uma página que solicita que você faça login:

Prompt de login do WP

Assim que fizer login, será levado para o painel de administração do WordPress:

Painel de admin do WP

Alguns passos comuns seguintes – para personalizar sua instalação do WordPress – incluem escolher a configuração de permalinks para os seus posts (pode ser encontrado em Settings > Permalinks) e selecionar um novo tema (em Appearance > Themes).

O conteúdo do playbook

Você pode encontrar a configuração do WordPress no servidor LAMP, apresentada neste tutorial, na pasta wordpress-lamp_ubuntu1804, no 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, como as configurações do banco de dados e do nome de domínio para configurar no Apache.

vars/default.yml

#System Settings php_modules: [ 'php-curl', 'php-gd', 'php-mbstring', 'php-xml', 'php-xmlrpc', 'php-soap', 'php-intl', 'php-zip' ]  #MySQL Settings mysql_root_password: "mysql_root_password" mysql_db: "wordpress" mysql_user: "sammy" mysql_password: "password"  #HTTP Settings http_host: "your_domain" http_conf: "your_domain.conf" http_port: "80" 

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 [email protected]    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/wp-config.php.j2

O arquivo wp-config.php.j2 é outro modelo do Jinja, usado para configurar o arquivo de configuração principal usado pelo WordPress. As variáveis usadas dentro desse modelo estão definidas no arquivo da variável vars/default.yml. Chaves de autenticação e salts são gerados usando uma função hash.

files/info.php.j2

<?php /**  * The base configuration for WordPress  *  * The wp-config.php creation script uses this file during the  * installation. You don't have to use the web site, you can  * copy this file to "wp-config.php" and fill in the values.  *  * This file contains the following configurations:  *  * * MySQL settings  * * Secret keys  * * Database table prefix  * * ABSPATH  *  * @link https://codex.wordpress.org/Editing_wp-config.php  *  * @package WordPress  */  // ** MySQL settings - You can get this info from your web host ** // /** The name of the database for WordPress */ define( 'DB_NAME', '{{ mysql_db }}' );  /** MySQL database username */ define( 'DB_USER', '{{ mysql_user }}' );  /** MySQL database password */ define( 'DB_PASSWORD', '{{ mysql_password }}' );  /** MySQL hostname */ define( 'DB_HOST', 'localhost' );  /** Database Charset to use in creating database tables. */ define( 'DB_CHARSET', 'utf8' );  /** The Database Collate type. Don't change this if in doubt. */ define( 'DB_COLLATE', '' );  /** Filesystem access **/ define('FS_METHOD', 'direct');  /**#@+  * Authentication Unique Keys and Salts.  *  * Change these to different unique phrases!  * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}  * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.  *  * @since 2.6.0  */ define( 'AUTH_KEY',         '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' ); define( 'SECURE_AUTH_KEY',  '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' ); define( 'LOGGED_IN_KEY',    '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' ); define( 'NONCE_KEY',        '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' ); define( 'AUTH_SALT',        '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' ); define( 'SECURE_AUTH_SALT', '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' ); define( 'LOGGED_IN_SALT',   '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' ); define( 'NONCE_SALT',       '{{ ansible_date_time.iso8601_micro | hash('sha256') }}' );  /**#@-*/  /**  * WordPress Database Table prefix.  *  * You can have multiple installations in one database if you give each  * a unique prefix. Only numbers, letters, and underscores please!  */ $table_prefix = 'wp_';  /**  * For developers: WordPress debugging mode.  *  * Change this to true to enable the display of notices during development.  * It is strongly recommended that plugin and theme developers use WP_DEBUG  * in their development environments.  *  * For information on other constants that can be used for debugging,  * visit the Codex.  *  * @link https://codex.wordpress.org/Debugging_in_WordPress  */ define( 'WP_DEBUG', false );  /* That's all, stop editing! Happy publishing. */  /** Absolute path to the WordPress directory. */ if ( ! defined( 'ABSPATH' ) ) {     define( 'ABSPATH', dirname( __FILE__ ) . '/' ); }  /** Sets up WordPress vars and included files. */ require_once( ABSPATH . 'wp-settings.php' );  

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=aptitude update_cache=yes state=latest force_apt_get=yes       tags: [ system ]      - name: Install LAMP Packages       apt: name={{ item }} update_cache=yes state=latest       loop: [ 'apache2', 'mysql-server', 'python3-pymysql', 'php', 'php-mysql', 'libapache2-mod-php' ]       tags: [ system ]      - name: Install PHP Extensions       apt: name={{ item }} update_cache=yes state=latest       loop: "{{ php_modules }}"       tags: [ system ]    # Apache Configuration     - name: Create document root       file:         path: "/var/www/{{ http_host }}"         state: directory         owner: "www-data"         group: "www-data"         mode: '0755'       tags: [ apache ]      - name: Set up Apache VirtualHost       template:         src: "files/apache.conf.j2"         dest: "/etc/apache2/sites-available/{{ http_conf }}"       notify: Reload Apache       tags: [ apache ]      - name: Enable rewrite module       shell: /usr/sbin/a2enmod rewrite       notify: Reload Apache       tags: [ apache ]      - name: Enable new site       shell: /usr/sbin/a2ensite {{ http_conf }}       notify: Reload Apache       tags: [ apache ]      - name: Disable default Apache site       shell: /usr/sbin/a2dissite 000-default.conf       notify: Restart Apache       tags: [ apache ]    # MySQL Configuration     - name: Set the root password       mysql_user:         name: root         password: "{{ mysql_root_password }}"         login_unix_socket: /var/run/mysqld/mysqld.sock       tags: [ mysql, mysql-root ]      - name: Remove all anonymous user accounts       mysql_user:         name: ''         host_all: yes         state: absent         login_user: root         login_password: "{{ mysql_root_password }}"       tags: [ mysql ]      - name: Remove the MySQL test database       mysql_db:         name: test         state: absent         login_user: root         login_password: "{{ mysql_root_password }}"       tags: [ mysql ]      - name: Creates database for WordPress       mysql_db:         name: "{{ mysql_db }}"         state: present         login_user: root         login_password: "{{ mysql_root_password }}"       tags: [ mysql ]      - name: Create MySQL user for WordPress       mysql_user:         name: "{{ mysql_user }}"         password: "{{ mysql_password }}"         priv: "{{ mysql_db }}.*:ALL"         state: present         login_user: root         login_password: "{{ mysql_root_password }}"       tags: [ mysql ]    # UFW Configuration     - name: "UFW - Allow HTTP on port {{ http_port }}"       ufw:         rule: allow         port: "{{ http_port }}"         proto: tcp       tags: [ system ]    # WordPress Configuration     - name: Download and unpack latest WordPress       unarchive:         src: https://wordpress.org/latest.tar.gz         dest: "/var/www/{{ http_host }}"         remote_src: yes         creates: "/var/www/{{ http_host }}/wordpress"       tags: [ wordpress ]      - name: Set ownership       file:         path: "/var/www/{{ http_host }}"         state: directory         recurse: yes         owner: www-data         group: www-data       tags: [ wordpress ]      - name: Set permissions for directories       shell: "/usr/bin/find /var/www/{{ http_host }}/wordpress/ -type d -exec chmod 750 {} \;"       tags: [ wordpress ]      - name: Set permissions for files       shell: "/usr/bin/find /var/www/{{ http_host }}/wordpress/ -type f -exec chmod 640 {} \;"       tags: [ wordpress ]      - name: Set up wp-config       template:         src: "files/wp-config.php.j2"         dest: "/var/www/{{ http_host }}/wordpress/wp-config.php"       tags: [ wordpress ]    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 site do WordPress com LAMP em um servidor Ubuntu 18.04.

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.