Введение

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

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

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

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

wordpress illustration for: Предварительные требования

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

  • Один узел управления Ansible: компьютер Ubuntu 18.04 с Ansible, установленным и настроенным для подключения к вашим хостам Ansible с помощью SSH-ключей. Убедитесь, что на узле управления имеется обычный пользователь с разрешениями sudo и активированный брандмауэр, как указано в руководстве по первоначальной настройке сервера. Чтобы настроить Ansible, воспользуйтесь нашим руководством по установке и настройке Ansible в Ubuntu 18.04.

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

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

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

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

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

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

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

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

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

				
					
[environment local]

cd ~/ansible-playbooks

git pull

				
			

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

				
					
[environment local]

cd ~

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

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 с помощью вашего редактора командной строки:

				
					
[environment local]

cd wordpress-lamp_ubuntu1804

nano vars/default.yml

				
			

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

				
					
[label vars/default.yml]

[environment local]

---

#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<^>, вы можете воспользоваться следующей командой:

				
					
[environment local]

ansible-playbook playbook.yml -l &lt;^&gt;server1&lt;^&gt; -u &lt;^&gt;sammy&lt;^&gt;

				
			

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

				
					
[secondary_label 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://&lt;^&gt;server_host_or_IP&lt;^&gt;

				
			

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

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

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

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

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

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

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

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

vars/default.yml

Файл переменных default.yml содержит значения, используемые в задачах сценария, в том числе параметры базы данных и доменное имя для настройки в Apache.

				
					
[label vars/default.yml]

[environment local]

#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: "&lt;^&gt;mysql_root_password&lt;^&gt;"

mysql_db: "&lt;^&gt;wordpress&lt;^&gt;"

mysql_user: "&lt;^&gt;sammy&lt;^&gt;"

mysql_password: "&lt;^&gt;password&lt;^&gt;"



#HTTP Settings

http_host: "&lt;^&gt;your_domain&lt;^&gt;"

http_conf: "&lt;^&gt;your_domain.conf&lt;^&gt;"

http_port: "&lt;^&gt;80&lt;^&gt;"

				
			

files/apache.conf.j2

Файл apache.conf.j2 — это шаблон Jinja 2, который выполняет настройку нового VirtualHost в Apache. Переменные, используемые в этом шаблоне, определяются в файле переменных vars/default.yml.

				
					
[environment local]

[label files/apache.conf.j2]

&lt;VirtualHost *:{{ http_port }}&gt;

 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



 &lt;Directory /var/www/{{ http_host }}&gt;

 Options -Indexes

 &lt;/Directory&gt;



 &lt;IfModule mod_dir.c&gt;

 DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm

 &lt;/IfModule&gt;



&lt;/VirtualHost&gt;

				
			

files/wp-config.php.j2

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

				
					
[environment local]

[label files/info.php.j2]

&lt;?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 для загрузки вариантов конфигурации.

				
					
[label playbook.yml]

[environment local]

---

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