Введение
Автоматизация сервера сегодня играет важнейшую роль в системном администрировании, что вызвано расходной природой современных сред приложений. Инструменты управления конфигурацией, такие как Ansible, обычно используются для оптимизации процесса автоматизации настройки сервера путем создания стандартных процедур для новых серверов, а также снижения количества ошибок, вызванных человеческим фактором при ручной настройке.
Ansible предлагает простую архитектуру, которая не требует установки специального программного обеспечения на узлах. Также он имеет широкий набор функций и встроенные модули, упрощающие написание скриптов автоматизации.
В этом руководстве мы объясняем, как использовать Ansible для автоматизации шагов, описанных в руководстве по установке WordPress с LAMP в Ubuntu 18.04. WordPress — это самая популярная CMS (система управления контентом) в сети Интернет, которая позволяет пользователям создавать гибкие блоги и веб-сайты поверх бекэнда в виде базы данных MySQL и с обработкой PHP. После настройки практически все административные функции доступны через пользовательский веб-интерфейс.
Предварительные требования
Чтобы выполнить автоматическую настройку из сценария, который мы обсуждаем в этом руководстве, вам потребуется следующее:
- Один узел управления Ansible: компьютер Ubuntu 18.04 с Ansible, установленным и настроенным для подключения к вашим хостам Ansible с помощью SSH-ключей. Убедитесь, что на узле управления имеется обычный пользователь с разрешениями sudo и активированный брандмауэр, как указано в руководстве по первоначальной настройке сервера. Чтобы настроить Ansible, воспользуйтесь нашим руководством по установке и настройке Ansible в Ubuntu 18.04.
- Один или несколько хостов Ansible: один или несколько удаленных серверов Ubuntu 18.04, предварительно настроенных в соответствии с руководством по использованию Ansible для автоматизации первоначальной настройки сервера в Ubuntu 18.04.
Прежде чем продолжить, вам нужно убедиться, что ваш узел управления Ansible может подключаться и выполнять команды для вашего хоста (или хостов) Ansible. Для проверки подключения ознакомьтесь с шагом 3 руководства по установке и настройке Ansible в Ubuntu 18.04.
Что делает этот сценарий?
Этот сценарий Ansible предоставляет альтернативу ручному запуску в соответствии с процедурой, описанной в нашем руководстве по установке WordPress с LAMP в Ubuntu 18.04.
При запуске этого сценария будут выполняться следующие действия на ваших хостах Ansible:
- Установите
aptitude
, инструмент, который в Ansible используется в качестве альтернативы диспетчеру пакетовapt
. - Установите необходимые пакеты LAMP и расширения PHP.
- Создайте и активируйте новый
VirtualHost
для веб-сайта WordPress. - Активируйте модуль rewrite (
mod_rewrite
) Apache. - Отключите заданный по умолчанию веб-сайт Apache.
- Установите пароль для root-пользователя MySQL.
- Удалите анонимные учетные записи MySQL и тестовую базу данных.
- Создайте новую базу данных MySQL и пользователя для веб-сайта WordPress.
- Настройте UFW, чтобы разрешить прием трафика HTTP на настроенном порту (по умолчанию порт номер
80
). - Загрузите и распакуйте WordPress.
- Укажите корректные права владения и разрешения для директории.
- Настройте файл
wp-config.php
с помощью предоставленного шаблона.
После завершения запуска сценария вы получите установку WordPress, запущенную поверх среды LAMP, в соответствии с опциями, которые вы определили внутри переменных конфигурации.
Как использовать этот сценарий
В первую очередь нам нужно получить сценарий WordPress с LAMP и его зависимости из репозитория do-community/ansible-playbooks. Нам нужно будет клонировать этот репозиторий в локальную папку внутри узла управления Ansible.
Если вы клонировали этот репозиторий ранее, выполняя другое руководство, перейдите к вашей копии ansible-playbooks
и запустите команду git pull
, чтобы быть уверенным, что репозиторий содержит обновленный контент:
- cd ~/ansible-playbooks
- git pull
Если вы впервые используете репозиторий do-community/ansible-playbooks
, необходимо выполнить клонирование репозитория в вашу домашнюю папку с помощью следующей команды:
- 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
с помощью вашего редактора командной строки:
- cd wordpress-lamp_ubuntu1804
- 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
, вы можете воспользоваться следующей командой:
- ansible-playbook playbook.yml -l server1 -u sammy
Результат должен выглядеть примерно так:
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
Примечание. Дополнительную информацию о запуске сценариев Ansible см. в нашей шпаргалке по Ansible.
После завершения работы сценария вы можете перейти в браузер для завершения установки WordPress оттуда.
Перейдите на домен сервера или публичный IP-адрес:
http://server_host_or_IP
Вы увидите подобную страницу:
После выбора языка, который вы хотите использовать для установки WordPress, вы перейдете к финальному этапу настройки пользователя и пароля WordPress для входа в панель управления:
При нажатии далее вы перейдете на страницу входа:
После входа вы перейдете в панель управления WordPress:
Список стандартных действий по настройке вашей установки 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 [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
Файл 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', '{{ 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
Файл 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.