Как автоматизировать установку WordPress в Ubuntu 14.04 с помощью Ansible

Вступление

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.

Related