// Tutorial //

Использование Ansible для установки WordPress с LAMP в Ubuntu 18.04

Published on February 7, 2020
Default avatar
By Erika Heidi
Developer Advocate
Русский
Использование Ansible для установки WordPress с LAMP в Ubuntu 18.04

Введение

Автоматизация сервера сегодня играет важнейшую роль в системном администрировании, что вызвано расходной природой современных сред приложений. Инструменты управления конфигурацией, такие как Ansible, обычно используются для оптимизации процесса автоматизации настройки сервера путем создания стандартных процедур для новых серверов, а также снижения количества ошибок, вызванных человеческим фактором при ручной настройке.

Ansible предлагает простую архитектуру, которая не требует установки специального программного обеспечения на узлах. Также он имеет широкий набор функций и встроенные модули, упрощающие написание скриптов автоматизации.

В этом руководстве мы объясняем, как использовать Ansible для автоматизации шагов, описанных в руководстве по установке WordPress с LAMP в Ubuntu 18.04. WordPress — это самая популярная CMS (система управления контентом) в сети Интернет, которая позволяет пользователям создавать гибкие блоги и веб-сайты поверх бекэнда в виде базы данных MySQL и с обработкой PHP. После настройки практически все административные функции доступны через пользовательский веб-интерфейс.

Предварительные требования

Чтобы выполнить автоматическую настройку из сценария, который мы обсуждаем в этом руководстве, вам потребуется следующее:

Прежде чем продолжить, вам нужно убедиться, что ваш узел управления Ansible может подключаться и выполнять команды для вашего хоста (или хостов) Ansible. Для проверки подключения ознакомьтесь с шагом 3 руководства по установке и настройке Ansible в Ubuntu 18.04.

Что делает этот сценарий?

Этот сценарий Ansible предоставляет альтернативу ручному запуску в соответствии с процедурой, описанной в нашем руководстве по установке WordPress с LAMP в Ubuntu 18.04.

При запуске этого сценария будут выполняться следующие действия на ваших хостах Ansible:

  1. Установите aptitude, инструмент, который в Ansible используется в качестве альтернативы диспетчеру пакетов apt.
  2. Установите необходимые пакеты LAMP и расширения PHP.
  3. Создайте и активируйте новый VirtualHost для веб-сайта WordPress.
  4. Активируйте модуль rewrite (mod_rewrite) Apache.
  5. Отключите заданный по умолчанию веб-сайт Apache.
  6. Установите пароль для root-пользователя MySQL.
  7. Удалите анонимные учетные записи MySQL и тестовую базу данных.
  8. Создайте новую базу данных MySQL и пользователя для веб-сайта WordPress.
  9. Настройте UFW, чтобы разрешить прием трафика HTTP на настроенном порту (по умолчанию порт номер 80).
  10. Загрузите и распакуйте WordPress.
  11. Укажите корректные права владения и разрешения для директории.
  12. Настройте файл wp-config.php с помощью предоставленного шаблона.

После завершения запуска сценария вы получите установку WordPress, запущенную поверх среды LAMP, в соответствии с опциями, которые вы определили внутри переменных конфигурации.

Как использовать этот сценарий

В первую очередь нам нужно получить сценарий WordPress с LAMP и его зависимости из репозитория do-community/ansible-playbooks. Нам нужно будет клонировать этот репозиторий в локальную папку внутри узла управления Ansible.

Если вы клонировали этот репозиторий ранее, выполняя другое руководство, перейдите к вашей копии ansible-playbooks и запустите команду git pull, чтобы убедиться, что репозиторий содержит обновленный контент:

  1. cd ~/ansible-playbooks
  2. git pull

Если вы впервые используете репозиторий do-community/ansible-playbooks, необходимо выполнить клонирование репозитория в вашу домашнюю папку с помощью следующей команды:

  1. cd ~
  2. git clone https://github.com/do-community/ansible-playbooks.git
  3. cd ansible-playbooks

Файлы, которые нас интересуют, находятся в папке wordpress-lamp_ubuntu1804, которая имеет следующую структуру:

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

Ниже представлены все эти файлы:

  • files/apache.conf.j2: шаблон для настройки Apache VirtualHost.
  • files/wp-config.php.j2: шаблон для настройки файла конфигурации WordPress.
  • vars/default.yml: файл переменных для настройки параметров сценария.
  • playbook.yml: файл сценария, содержащий задачи, которые будут выполняться на удаленном сервере (или серверах).
  • readme.md: текстовый файл, содержащий информацию об этом сценарии.

Мы изменим файл переменных сценария для настройки его параметров. Перейдите в директорию wordpress-lamp_ubuntu1804 и откройте файл vars/default.yml с помощью вашего редактора командной строки:

  1. cd wordpress-lamp_ubuntu1804
  2. nano vars/default.yml

Этот файл содержит несколько переменных, которые требуют вашего внимания:

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"

Ниже приводится список, содержащий краткое описание всех этих переменных и то, как их необходимо изменить:

  • php_modules: массив, содержащий расширения PHP, которые необходимо установить для обеспечения работоспособности вашей установки WordPress. Вам не нужно изменять эту переменную, но вам может потребоваться добавить новые расширения в список, если для вашей конкретной установки это требуется.
  • mysql_root_password: желаемый пароль для учетной записи root MySQL.
  • mysql_db: имя базы данных MySQL, которая должна быть создана для WordPress.
  • mysql_user: имя пользователя MySQL, который должен быть создан для WordPress.
  • mysql_password: пароль для нового пользователя MySQL.
  • http_host: ваше доменное имя.
  • http_conf: имя файла конфигурации, который будет создан в Apache.
  • http_port: HTTP-порт для этого виртуального хоста, где 80 — это значение по умолчанию.

После завершения обновления переменных в vars/default.yml сохраните и закройте этот файл. Если вы используете nano, нажмите CTRL+X, Y, затем ENTER.

Теперь мы готовы к запуску этого сценария на одном или нескольких серверах. Большинство сценариев настроены для выполнения на каждом сервере в вашем распоряжении по умолчанию. Мы можем использовать флаг -l, чтобы гарантировать, что только определенный набор серверов или отдельный сервер будут затронуты сценарием. Также мы можем использовать флаг -u, чтобы указать, какого пользователя на удаленном сервере мы будем использовать для подключения и выполнения команд сценария на удаленных хостах.

Для выполнения сценария только на server1, подключенном как sammy, вы можете воспользоваться следующей командой:

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

Результат должен выглядеть примерно так:

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

Примечание. Дополнительную информацию о запуске сценариев Ansible см. в нашей шпаргалке по Ansible.

После завершения работы сценария вы можете перейти в браузер для завершения установки WordPress оттуда.

Перейдите на домен сервера или публичный IP-адрес:

http://server_host_or_IP

Вы увидите подобную страницу:

Страница выбора языка WordPress

После выбора языка, который вы хотите использовать для установки WordPress, вы перейдете к финальному этапу настройки пользователя и пароля WordPress для входа в панель управления:

Установка WordPress

При нажатии далее вы перейдете на страницу входа:

Запрос данных для входа в WP

После входа вы перейдете в панель управления WordPress:

Панель администратора WP

Список стандартных действий по настройке вашей установки WordPress включает выбор параметров постоянных ссылок для ваших постов (см. Settings > Permalinks) и выбор новой темы (Appearance > Themes).

Содержание сценария

Вы можете найти файлы для установки сервера WordPress on LAMP, который мы обсуждаем в данном руководстве, в папке wordpress-lamp_ubuntu1804 внутри репозитория DigitalOcean Community Playbooks. Чтобы скопировать или загрузить содержимое скриптов напрямую, нажмите кнопку Raw сверху каждого скрипта.

Полное содержимое сценария, как и связанные файлы, также представлены здесь для удобства.

vars/default.yml

Файл переменных default.yml содержит значения, используемые в задачах сценария, в том числе параметры базы данных и доменное имя для настройки в 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

Файл apache.conf.j2 — это шаблон Jinja 2, который выполняет настройку нового VirtualHost в Apache. Переменные, используемые в этом шаблоне, определяются в файле переменных 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

Файл wp-config.php.j2 — это другой шаблон Jinja, используемый для настройки основного файла конфигурации, который используется WordPress. Переменные, используемые в этом шаблоне, определяются в файле переменных vars/default.yml. Уникальные ключи аутентификации и секретные ключи генерируются с помощью 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

Файл playbook.yml — это место, где определяются все задачи из этой настройки. Он начинается с определения группы серверов, которая должна стать целью этой настройки (all), после чего использует значение become: true, чтобы определить, что задачи следует выполнять с эскалацией привилегии (sudo) по умолчанию. Далее он включает переменную vars/default.yml для загрузки вариантов конфигурации.

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

Вы можете изменить эти файлы в соответствии с требованиями вашего рабочего процесса.

Заключение

В этом руководстве мы использовали Ansible для автоматизации процесса установки и настройки веб-сайта WordPress с LAMP на сервере Ubuntu 18.04.

Если вы хотите включить другие задачи в этот сценарий для дальнейшей настройки сервера, ознакомьтесь с нашим вводным руководством для Ansible Введение в управление конфигурациями: создание сценариев Ansible.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about us


About the authors
Default avatar
Developer Advocate

Dev/Ops passionate about open source, PHP, and Linux.

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
Leave a comment
Leave a comment...

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!

Try DigitalOcean for free

Click here to Sign up and get $200 of credit to try our products over 60 days!