Вступление
Ansible - это простой, безагентный способ автоматизации вашей инфраструктуры. Если вы обнаружите, что развертываете WordPress снова и снова, Ansible может сэкономить вам много времени.
С помощью нескольких строк YAML (простой язык разметки) мы автоматизируем обычно утомительный процесс настройки WordPress на новом сервере Ubuntu 14.04. Мы установим WordPress более или менее в соответствии с процессом, описанным в https://www.digitalocean.com/community/tutorials/how-to-install-wordpress-on-ubuntu-14-04 в этом руководстве], но автоматически.
Мы будем использовать два сервера: сервер сборки под управлением Ansible и целевой сервер, на котором мы будем устанавливать WordPress с использованием Ansible.
Предпосылки
Чтобы завершить этот урок, вам необходимо настроить следующее:
-
Сервер сборки под управлением Ubuntu 14.04. Мы установим Ansible на этом сервере (в этом руководстве он называется * build-server *). Мы войдем на этот сервер, и все файлы и команды для этого урока будут запущены на этом сервере.
-
Целевой сервер под управлением Ubuntu 14.04. Мы установим WordPress (через Ansible) на этот сервер (в этом руководстве он называется * wordpress-server *)
-
Sudo non-root пользователи, настроенные для обоих серверов
-
Добавьте SSH-ключ вашего пользователя * build-server * sudo к авторизованным ключам пользователя sudo * wordpress-server *. Вы можете настроить это, следуя thisutorial. Вы должны запустить учебник со своего * build-сервера * и загрузить ключ на свой * wordpress-сервер *
(Необязательно) Доступ без пароля sudo
-
Быстрее *, но * менее безопасно * использовать пароль без доступа sudo на вашем * wordpress-сервере *.
Чтобы предоставить нашему пользователю sudo на * wordpress-сервере * эту привилегию, нам нужно отредактировать файл sudoers. Введите + visudo +
для редактирования файла sudoers:
visudo
Добавьте эту строку в конце:
ALL=(ALL) NOPASSWD: ALL
Это должна быть * последняя строка * в файле. Важно, чтобы это была последняя строка, иначе она будет переопределена.
-
NB: * Всегда редактируйте файл sudoers с помощью команды
+ visudo +
. Это проверит ваши изменения перед сохранением файла - это может уберечь вас от случайного блокирования себя из машины.
Сделав это, вы сможете выполнить следующую команду на * wordpress-сервере * без ввода пароля:
sudo echo "Hello"
Теперь в этом руководстве вы можете запускать команды + ansible-playbook +
без флага + -K +
, поэтому вам не нужно вводить пароль sudo вручную.
ansible-playbook playbook.yml -i hosts -u
Шаг 1 - Установка Ansible
В этом разделе мы установим Ansible на ваш * build-сервер *.
SSH на ваш * build-сервер * и выполните эту команду для установки Ansible:
sudo apt-get install ansible -y
Вы можете убедиться, что Ansible установлен, запустив:
ansible --version
Вы должны увидеть что-то вроде:
Outputansible 1.5.4
Шаг 2 - Настройка структуры файла
Теперь, когда мы установили Ansible, давайте подготовим структуру файла для нашей книги воспроизведения Ansible.
Создайте каталог для нашей playbook.
cd ~
mkdir wordpress-ansible && cd wordpress-ansible
+ cd +
в этот каталог и создайте два файла: один с именем + playbook.yml +
(здесь мы напишем команды для установки WordPress), а другой с именем + hosts +
(это говорит Ansible, на каких серверах работать команды):
touch playbook.yml
touch hosts
Лучше всего разбивать наши пьесы на роли. Вы можете думать о ролях как о повторно используемых модулях. Для этого проекта мы создадим четыре роли:
-
сервер
-
php
-
MySQL
-
WordPress
Из корневой папки проекта (+ ~ / wordpress-ansible +
) создайте в ней каталог с именами + role +
и + cd +
:
mkdir roles && cd roles
Мы можем загрузить наши роли с помощью инструмента Ansible, называемого + ansible-galaxy
. Для каждой роли, которую мы хотим создать, мы будем запускать + ansible-galaxy init +
:
ansible-galaxy init server
ansible-galaxy init php
ansible-galaxy init mysql
ansible-galaxy init wordpress
Вы заметите, что это создает целую файловую структуру для каждой из наших ролей. Это соответствует лучшим практикам Ansible. По большей части нас интересует файл + tasks / main.yml +
каждой роли.
На данный момент мы должны иметь следующую файловую структуру:
[.]
|_ playbook.yml
|_ hosts
|_ [roles]
|_ [server]
|_ ...
|_ [php]
|_ ...
|_ [mysql]
|_ ...
|_ [wordpress]
|_ ...
Шаг 3 - Написание Playbook
В этом разделе мы напишем команды для установки WordPress на наш удаленный сервер.
Инвентаризация (файл hosts)
Инвентаризация Ansible сообщает Ansible о том, на каких серверах мы хотим установить WordPress. Мы можем запустить наши списки воспроизведения для серверов или групп серверов, определенных в нашем файле инвентаризации (+ hosts +
). Наш инвентарь очень прост.
Отредактируйте + hosts +
:
nano ~/wordpress-ansible/hosts
Добавьте строку для + [wordpress] +
и под ней IP-адрес вашего * wordpress-сервера *:
хостов
[wordpress]
сборник пьес
Мы можем думать о сборнике пьес как об определении вашего приложения WordPress. Наша книга игр объединит роли, которые мы создали, чтобы настроить полезное приложение (в данном случае сайт WordPress).
Отредактируйте файл playbook:
nano ~/wordpress-ansible/playbook.yml
Добавьте это содержимое, которое сообщает Ansible, на каких хостах запускать роли (+ wordpress
в файле` + hosts`) и какие роли запускать:
playbook.yml
- hosts: wordpress
roles:
- server
- php
- mysql
- wordpress
Перейдите в каталог playbook:
cd ~/wordpress-ansible/
Давайте удостоверимся, что наше основное соединение от * build-server * до * wordpress-server * работает, запустив playbook. Это еще ничего не сделает; это просто проверит соединение:
ansible-playbook playbook.yml -i hosts -u -K
При появлении запроса введите пароль sudo для вашего пользователя sudo на * wordpress-сервере *.
Вы должны увидеть что-то вроде:
Outputansible-playbook playbook.yml -i hosts -u -K
PLAY [wordpress] **************************************************************
GATHERING FACTS ***************************************************************
ok: [188.166.68.134]
PLAY RECAP ********************************************************************
188.166.68.134 : ok=1 changed=0 unreachable=0 failed=0
Это указывает на то, что мы смогли подключиться к серверу. Однако мы еще не определили ни одной игры, поэтому на нашем * wordpress-сервере ничего не было выполнено. Давайте исправим это, заполнив детали в наших четырех ролях.
Если это не удалось, дважды проверьте, что вы можете использовать SSH с * build-server * на * wordpress-server *, используя ключ SSH.
Шаг 3 - Создание ролей
сервер
Обо всем по порядку; Давайте настроим наш сервер. Для этого мы будем редактировать роль + server
.
Роль сервера установит все необходимое нам программное обеспечение на целевом сервере. Отредактируйте этот файл:
nano roles/server/tasks/main.yml`
Добавьте следующее содержание; убедитесь, что есть только одна строка с + --- +
(там должна быть одна по умолчанию):
роли / сервер / задачи / main.yml
---
- name: Update apt cache
apt: update_cache=yes cache_valid_time=3600
sudo: yes
- name: Install required software
apt: name={{ item }} state=present
sudo: yes
with_items:
- apache2
- mysql-server
- php5-mysql
- php5
- libapache2-mod-php5
- php5-mcrypt
- python-mysqldb
Это делает следующее:
-
Обновите apt-cache (
+ apt-get update
) -
+ apt-get install
Apache, MySQL, PHP и соответствующее программное обеспечение
Если вы заинтересованы в деталях того, что мы устанавливаем, вы можете взглянуть на https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php- lamp-stack-on-ubuntu-14-04 [учебник о том, как вручную устанавливать LAMP в Ubuntu 14.04].
Теперь мы можем запустить наш playbook следующим образом:
ansible-playbook playbook.yml -i hosts -u -K
Вы должны увидеть что-то вроде этого:
Outputansible-playbook playbook.yml -i hosts -u -K
PLAY [wordpress] **************************************************************
GATHERING FACTS ***************************************************************
ok: [188.166.68.134]
TASK: [server | Update apt cache] *********************************************
ok: [188.166.68.134]
TASK: [server | Install required software] ************************************
[188.166.68.134] => (item=apache2,mysql-server,php5-mysql,php5,libapache2-mod-php5,php5-mcrypt,python-mysqldb)
PLAY RECAP ********************************************************************
После этого вы сможете получить доступ к странице Apache по умолчанию по адресу + http: /// +
. Потрясающие. Apache теперь установлен и работает на * wordpress-сервере *.
Если ваша сборка зависает бесконечно в точке `+ TASK: [server | Обновить apt cache] + `, это может указывать на отсутствие разрешений на целевом сервере. Убедитесь, что доступ sudo правильно настроен на * wordpress-сервере *.
PHP
Давайте разберемся с нашими требованиями PHP. Мы будем делать это в роли PHP. Отредактируйте файл основных задач для PHP:
nano roles/php/tasks/main.yml
Добавьте следующее (опять же, строка + --- +
должна быть уже там):
Роли / PHP / задачи / main.yml
---
- name: Install php extensions
apt: name={{ item }} state=present
sudo: yes
with_items:
- php5-gd
- libssh2-php
Это установит необходимые расширения PHP.
MySQL
Нам также нужно настроить базу данных MySQL для нашего сайта WordPress. Мы сделаем это в роли + mysql
.
Нам понадобится несколько переменных для этого. Для роли вы можете указать значения по умолчанию для любых переменных в файле + defaults / main.yml +
.
nano roles/mysql/defaults/main.yml
Добавьте имя базы данных, имя пользователя базы данных и пароль базы данных (которые вы хотите создать) в указанном порядке. Убедитесь, что вы выбрали безопасный ++
.
Роли / MySQL / по умолчанию / main.yml
---
wp_mysql_db: wordpress
wp_mysql_user: wordpress
wp_mysql_password:
Добавьте задачи для создания нашей базы данных и пользователя для доступа к ней.
nano roles/mysql/tasks/main.yml
Добавьте следующее содержание:
Роли / MySQL / задачи / main.yml
---
- name: Create mysql database
mysql_db: name={{ wp_mysql_db }} state=present
- name: Create mysql user
mysql_user:
name={{ wp_mysql_user }}
password={{ wp_mysql_password }}
priv=*.*:ALL
Эта роль выполняет следующие функции:
-
Создать базу данных MySQL
-
Создать пользователя MySQL
-
Предоставьте этому пользователю доступ к нашей базе данных
Переменные извлекаются автоматически из нашего более раннего файла, поэтому вам не нужно ничего менять здесь.
WordPress
И теперь, в тот момент, когда мы все ждали … WordPress!
С установленными требованиями к серверу мы можем настроить WordPress. Мы будем редактировать роль + wordpress
.
Мы добавляем несколько различных задач в файл role / wordpress / tasks / main.yml +
, поэтому оставьте его открытым для этого раздела.
nano roles/wordpress/tasks/main.yml
Сначала нам нужно загрузить WordPress в каталог + / tmp +
(из соображений безопасности вы заметите, что мы отключили проверку сертификата, что может прервать загрузку):
Роли / WordPress / Задачи / main.yml
---
- name: Download WordPress get_url:
url=https://wordpress.org/latest.tar.gz
dest=/tmp/wordpress.tar.gz
validate_certs=no
sudo: yes
После загрузки мы извлекаем файл gzip в + / var / www +
, место, которое Apache использует для хранения веб-контента:
Роли / WordPress / Задачи / main.yml
- name: Extract WordPress unarchive: src=/tmp/wordpress.tar.gz dest=/var/www/ copy=no
sudo: yes
После извлечения файлов обновим корневой каталог документов сайта Apache по умолчанию, чтобы он указывал на наш сайт WordPress:
Роли / WordPress / Задачи / main.yml
- name: Update default Apache site
sudo: yes
lineinfile:
dest=/etc/apache2/sites-enabled/000-default.conf
regexp="(.)+DocumentRoot /var/www/html"
line="DocumentRoot /var/www/wordpress"
sudo: yes
Это обновит + DocumentRoot +
для сайта Apache по умолчанию, чтобы он указывал на файлы WordPress, которые мы загрузили в + / var / www / wordpress +
Здесь вы заметите, что мы добавили блок «+ notify ». Это используется, когда вам нужно выполнить такие задачи, как перезапуск служб после того, как задача успешно завершена. Обработчики ` notify +` будут notific, только если наша задача changed.
Нам нужно добавить наш обработчик для + restart apache
. Сохраните то, что у вас есть, и откройте + role / wordpress / handlers / main.yml +
для редактирования:
nano roles/wordpress/handlers/main.yml
Добавьте это содержимое:
Роли / WordPress / обработчики / main.yml
---
- name: restart apache
service: name=apache2 state=restarted
sudo: yes
Этот обработчик будет вызываться при изменении задачи, которая указывает + notify: restart apache +
, в результате чего сервер перезапускает Apache.
-
Настройка WordPress *
Вернуться к + role / wordpress / tasks / main.yml +
.
Наконец, нам нужно сделать некоторые настройки для вашего сайта WordPress:
Сначала мы копируем пример файла конфигурации:
Роли / WordPress / Задачи / main.yml
- name: Copy sample config file
command: mv /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php creates=/var/www/wordpress/wp-config.php
sudo: yes
Обновите некоторые константы в этом файле, чтобы они соответствовали информации нашей базы данных:
Роли / WordPress / Задачи / main.yml
- name: Update WordPress config file
lineinfile:
dest=/var/www/wordpress/wp-config.php
regexp="{{ item.regexp }}"
line="{{ item.line }}"
with_items:
- {'regexp': "define\\('DB_NAME', '(.)+'\\);", 'line': "define('DB_NAME', '{{wp_mysql_db}}');"}
- {'regexp': "define\\('DB_USER', '(.)+'\\);", 'line': "define('DB_USER', '{{wp_mysql_user}}');"}
- {'regexp': "define\\('DB_PASSWORD', '(.)+'\\);", 'line': "define('DB_PASSWORD', '{{wp_mysql_password}}');"}
sudo: yes
Эта задача найдет строки, содержащие: + DB_NAME +
, + DB_USER +
и + DB_PASSWORD +
в нашем конфигурационном файле, и заменит их переменными из нашей книги воспроизведения.
После успешного завершения описанных выше шагов наша роль WordPress будет содержать два файла, представляющих интерес.
Вот полный файл задач для WordPress:
Роли / WordPress / Задачи / main.yml
---
- name: Download WordPress get_url:
url=https://wordpress.org/latest.tar.gz
dest=/tmp/wordpress.tar.gz
validate_certs=no
- name: Extract WordPress unarchive: src=/tmp/wordpress.tar.gz dest=/var/www/ copy=no
sudo: yes
- name: Update default Apache site
sudo: yes
lineinfile:
dest=/etc/apache2/sites-enabled/000-default.conf
regexp="(.)+DocumentRoot /var/www/html"
line="DocumentRoot /var/www/wordpress"
notify:
- restart apache
- name: Copy sample config file
command: mv /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php creates=/var/www/wordpress/wp-config.php
sudo: yes
- name: Update WordPress config file
lineinfile:
dest=/var/www/wordpress/wp-config.php
regexp="{{ item.regexp }}"
line="{{ item.line }}"
with_items:
- {'regexp': "define\\('DB_NAME', '(.)+'\\);", 'line': "define('DB_NAME', '{{wp_mysql_db}}');"}
- {'regexp': "define\\('DB_USER', '(.)+'\\);", 'line': "define('DB_USER', '{{wp_mysql_user}}');"}
- {'regexp': "define\\('DB_PASSWORD', '(.)+'\\);", 'line': "define('DB_PASSWORD', '{{wp_mysql_password}}');"}
sudo: yes
Вот файл для перезапуска Apache (который вы уже должны были создать):
Роли / WordPress / обработчики / main.yml
---
- name: restart apache
service: name=apache2 state=restarted
sudo: yes
Были сделаны! Запустите playbook в последний раз, чтобы установить и настроить WordPress:
ansible-playbook playbook.yml -i hosts -u -K
Вы должны иметь возможность просматривать свой сайт WordPress онлайн по адресу: + http: // your_server_ip +
.
изображение: https: //assets.digitalocean.com/articles/wordpress_1404/initial_config.png [форма установки WordPress]
Вы можете завершить настройку сайта WordPress вручную здесь.
Заключение
Поздравляем! Теперь вы можете установить сайт WordPress на любой сервер Ubuntu 14.04 с помощью одной команды:
ansible-playbook playbook.yml -i hosts -u -K
Все, что вам нужно сделать, это добавить IP-адрес вашего целевого сервера в файл + hosts +
и убедиться, что ваши разрешения установлены правильно.
Следующие шаги
Это было очень быстрое введение, чтобы вы начали работать с Ansible и WordPress. Возможно, вас заинтересуют следующие улучшения:
-
Исследуйте Ansible Galaxy и узнайте, как вы можете разместить свои собственные роли в Галактике
-
Автоматизируйте процесс установки, чтобы не требовалась ручная настройка вашего сайта WordPress.