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 usadas para simplificar o processo de automatização de servidor, estabelecendo procedimentos padrão para novos servidores, ao mesmo tempo que reduzem os erros humanos associados à configuração manual.

O Ansible oferece uma arquitetura simples 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 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 PHP. Após a configuração, quase toda a administração pode ser feita através no front-end Web.

Pré-requisitos

Para executar a configuração automatizada fornecida pelo playbook que estamos discutindo neste guia, será necessário:

Antes de proceder, será necessário garantir que seu nó de controle do Ansible consiga se conectar ao seu(s) host(s) do Ansible e executar comandos nele(s). Para um teste de conexão, por favor, verifique o passo 3 de Como instalar e configurar o Ansible no Ubuntu 18.04.

O que esse playbook faz?

Este playbook do Ansible fornece uma alternativa para executar o procedimento manualmente mostrado em nosso guia sobre Como instalar o WordPress com LAMP no Ubuntu 18.04.

Ao executar esse guia, as seguintes ações serão executadas 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 root do MySQL.
  7. Remover as contas anônimas do MySQL e do banco de dados teste.
  8. Criar um novo banco de dados e usuário do MySQL para o site do WordPress.
  9. Configurar o UFW para permitir o tráfego HTTP na porta configurada (80 por padrão).
  10. Fazer download e descompactar o WordPress.
  11. Configurar o proprietário e as permissões do diretório corretos.
  12. Definir o arquivo wp-config.php usando o template fornecido.

Assim que o playbook terminar de executar, você terá uma instalação do WordPress em execução, além de um ambiente LAMP, baseado nas opções que definiu dentro das suas variáveis de configuração.

Como usar este playbook

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

Caso tenha clonado este repositório antes enquanto seguia um guia diferente, acesse sua cópia já existente do ansible-playbooks e execute um comando git pull para garantir que tenha o conteúdo atualizado:

  • cd ~/ansible-playbooks
  • git pull

Se for a primeira vez que você usa o repositório do-community/ansible-playbooks, comece 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 wordpress-lamp_ubuntu1804, que tem a seguinte estrutura:

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

Aqui está o que cada um desses arquivos é:

  • files/apache.conf.j2: arquivo de template para a configuração do VirtualHost Apache.
  • files/wp-config.php.j2: arquivo de template para a configuração do arquivo de configuração do WordPress.
  • vars/default.yml: arquivo de variável para a personalização das 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 este 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 seu editor de linha de comando preferido:

  • 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 PHP que devem ser instalada 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 deve ser criado para o WordPress.
  • mysql_user: o nome do usuário do MySQL que deve 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 HTTP para este host virtual, onde 80 é o padrão.

Assim que terminar de atualizar as variáveis dentro de vars/default.yml, salve e feche este arquivo. Se usou o nano, faça isso pressionando as teclas CTRL+X, Y e depois ENTER.

Agora, você está pronto para executar este playbook em um ou mais servidores. A maioria dos playbooks está configurado para ser executado em cada servidor em seu inventário, por padrão. Podemos usar a flag -l para garantir que apenas um subconjunto de servidores, ou um único servidor, seja afetado pelo playbook. Também podemos usar a flag -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 em 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] … 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ência 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 quer usar para sua instalação do WordPress, será mostrado um passo final para configurar seu usuário e senha do WordPress de forma que possa fazer login no 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 a seguir para a personalização de sua instalação do WordPress incluem a escolha da configuração de permalinks para seus posts (pode ser encontrado em Settings > Permalinks) e selecionar um novo tema (em Appearance > Themes).

Os conteúdos do playbook

Você pode encontrar a configuração do servidor do WordPress em Lamp apresentada neste tutorial na pasta wordpress-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.

O conteúdo completo do playbook, além de seus arquivos associados também estão incluídos aqui para sua conveniência.

vars/default.yml

O arquivo de variável default.yml contém 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 se configurar dentro do 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 de template Jinja 2, que configura um novo VirtualHost do Apache. As variáveis usadas dentro deste template são definidas no arquivo de 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/wp-config.php.j2

O arquivo wp-config.php.j2 é outro template Jinja, usado para configurar o arquivo de configuração principal usado pelo WordPress. As variáveis usadas dentro deste template são definidas no arquivo de variável vars/default.yml. As chaves de autenticação e salts exclusivos 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',         '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'SECURE_AUTH_KEY',  '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'LOGGED_IN_KEY',    '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'NONCE_KEY',        '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'AUTH_SALT',        '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'SECURE_AUTH_SALT', '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'LOGGED_IN_SALT',   '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );
define( 'NONCE_SALT',       '{{ lookup('password', '/dev/null chars=ascii_letters length=64') }}' );

/**#@-*/

/**
 * 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 todas as tarefas dessa configuração são definidas. Ele começa definindo o grupo de servidores que deve ser o objetivo dessa configuração (all), depois ele usa become: true para definir que as tarefas devem ser executadas com o escalonamento 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 que atendam da melhor forma as suas necessidades individuais dentro do seu próprio 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 neste playbook para personalizar ainda mais a configuração do seu servidor, consulte nossos guia introdutório do Ansible Gerenciamento de configuração 101: Como escrever playbooks no Ansible.

0 Comments

Creative Commons License