Как создать Ansible Playbook для автоматизации установки Drupal в Ubuntu 14.04

Вступление

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

Ansible использует только SSH для удаленного выполнения команд, поэтому ему не нужен агент на удаленном сервере. Это делает Ansible предпочтительным по сравнению с другими популярными инструментами, такими как Puppet или Chef, когда вы не хотите устанавливать агенты на управляемых серверах.

Более того, гораздо легче начать работу с Ansible, поскольку он использует YAML (еще один язык разметки), который проще, чем более мощные языки программирования, используемые другими инструментами.

Drupal - это популярная CMS, установка которой занимает много времени, но ее легко автоматизировать. В этом руководстве мы собираемся создать Ansible Playbook, который автоматизирует установку и настройку Drupal и всех его зависимостей от систем, работающих под управлением Ubuntu 14.04.

Предпосылки

Вам понадобится следующее:

  • Сервер Ubuntu 14.04 (который доступен по SSH); на этом сервере будет работать Ansible и локальная копия Drupal

  • Необязательно: Дополнительные серверы Ubuntu 14.04, на которые вы хотите установить Drupal

  • Пользовательsudo на каждом сервере; вы должны использоватьsame username иsame password для каждого сервера, на котором вы хотите установить Drupal

  • Основное понимание того, как работает установка Drupal. Вы можете обратиться кHow To Install Drupal on an Ubuntu 14.04 Server with Apache, хотя вам не нужно предварительно устанавливать Drupal

[[step-1 -—- install-ansible]] == Шаг 1. Установите Ansible

Ansible недоступен в репозиториях по умолчанию, которые используетapt-get. Поэтому добавьте репозиторийppa:rquillo/ansible.

sudo add-apt-repository ppa:rquillo/ansible

Нажмите ENTER при появлении запроса.

Обновите списки пакетов.

sudo apt-get update

Установите Ansible.

sudo apt-get install ansible

[[step-2 -—- create-a-directory-for-the-playbook]] == Шаг 2. Создайте каталог для Playbook

Наборы инструкций Ansible называются playbooks. Хорошая идея - хранить все свои книги игр в одном каталоге. Создайте каталог с именемMyPlaybooks.

mkdir ~/MyPlaybooks

Назовем наш playbookdrupal_setup. Создайте новый каталог с именемdrupal_setup.

mkdir ~/MyPlaybooks/drupal_setup

[[step-3 -—- create-a-hosts-file]] == Шаг 3. Создайте файл hosts

В каждой playbook обычно есть файлhosts, содержащий имена серверов, которые он должен использовать.

В этом руководстве мы собираемся установить Drupal наlocalhost и еще один сервер,drupal_server. Вы можете добавить больше серверов в этот файл. Помните, что каждый добавляемый вами сервер должен быть доступен через SSH.

Используйтеnano, чтобы создать и отредактировать файл с именемhosts.

nano ~/MyPlaybooks/drupal_setup/hosts

Пусть оно имеет следующее содержание:

[drupal_hosts]
localhost
drupal_server_ip

Вы должны заменитьdrupalserverip на IP-адрес вашего второго сервера. Вы можете указать здесь любое количество IP-адресов; Вы можете использовать эту книгу для установки Drupal на любое количество серверов Ubuntu 14.04.

Note: Файлhosts - это файл, который вам следует обновить, если вы хотите повторно использовать эту книгу в будущем для настройки большего количества серверов Drupal. Обратите внимание, что вы должны удалить уже настроенные серверы из списка и добавить новые IP-адреса серверов, прежде чем перезапускать книгу воспроизведения.

Сохраните и закройте файл.

[[step-4 -—- create-a-role-to-apt-get-update]] == Шаг 4. Создайте роль для обновления apt-get

Создайте новый каталог для хранения всех ролей Playbook.

mkdir ~/MyPlaybooks/drupal_setup/roles

Нам нужноapt-get обновить серверы, прежде чем делать что-либо еще, поэтому создайте каталог для ролиupdate.

mkdir ~/MyPlaybooks/drupal_setup/roles/update

Каждая роль имеет одну или несколько задач. Создайте каталог с именемtasks для хранения всех задач, связанных с этой ролью.

mkdir ~/MyPlaybooks/drupal_setup/roles/update/tasks

Используйтеnano, чтобы создать и отредактировать новый файл задачи с именемmain.yml. Это файл, который сообщает Ansible, что делать, когда он выполняет эту роль.

nano ~/MyPlaybooks/drupal_setup/roles/update/tasks/main.yml

В этом файле используйте модуль Ansibleapt для обновления системы:

---

- name: apt-get update the server
  apt: update_cache=yes

Убедитесь, что в вашем файле нет лишних пробелов; Ansible привередлив в этом. Сохраните и закройте файл.

[[step-5 -—- create-a-role-to-set-up-php]] == Шаг 5. Создайте роль для настройки PHP

Создайте каталог для ролиphp.

mkdir ~/MyPlaybooks/drupal_setup/roles/php

Создайте каталогtasks для этой роли:

mkdir ~/MyPlaybooks/drupal_setup/roles/php/tasks

Drupal нужен веб-сервер, настроенный для использования PHP. В этом уроке мы используем Apache. Когда мы устанавливаем PHP, Apache устанавливается автоматически, поэтому нам не нужны никакие дополнительные команды для него.

Используйтеnano для создания и редактированияmain.yml для роли php.

nano ~/MyPlaybooks/drupal_setup/roles/php/tasks/main.yml

Используйте модуль Ansibleapt для установки PHP5 (и пакетов, от которых он зависит) и библиотеки PHP5 GD. Добавьте следующее в файл:

---

- name: Install PHP and associated packages
  apt: name=php5 state=latest

- name: Install PHP GD library
  apt: name=php5-gd state=latest
  notify:
    - Restart Apache

Apache должен быть перезапущен после установки библиотеки PHP GD. Следовательно, эта роль также нуждается в обработчике.

Все обработчики роли хранятся в отдельном каталоге. Создайте каталог с именемhandlers для текущей роли.

mkdir ~/MyPlaybooks/drupal_setup/roles/php/handlers

Используйтеnano для создания и редактирования файлаmain.yml.

nano ~/MyPlaybooks/drupal_setup/roles/php/handlers/main.yml

Добавьте следующий код к нему:

---

- name: Restart Apache
  service: name=apache2 state=restarted

Вы закончили с настройкой PHP и Apache.

[[step-6 -—- create-a-role-to-set-up-mysql]] == Шаг 6. Создание роли для настройки MySQL

Drupal нужна база данных для хранения настроек и контента. В этом уроке мы используем MySQL.

Создайте каталоги для этой роли и ее задач.

mkdir -p ~/MyPlaybooks/drupal_setup/roles/mysql/tasks

Первая задача этой роли устанавливает MySQL и его зависимости. Используйтеnano, чтобы создать и отредактировать файл с именемsetup.yml.

nano ~/MyPlaybooks/drupal_setup/roles/mysql/tasks/setup.yml

В этом файле мы скажем Ansible снова использовать модульapt для установки:

  • MySQL-сервер

  • libapache2-мод-Auth-MySQL

  • php5-MySQL

Итак, добавьте в файл следующее:

---

- name: Install MySQL server
  apt: name=mysql-server state=latest

- name: Install Apache module for MySQL authentication
  apt: name=libapache2-mod-auth-mysql state=latest

- name: Install MySQL module for PHP
  apt: name=php5-mysql state=latest

У нашей роли есть еще один файл задач. Поскольку Drupal нужна собственная база данных MySQL и пользователь базы данных, мы создадим отдельный файл задач для их создания. Используйтеnano, чтобы создать и отредактировать файл с именемcreate_db.yml.

nano ~/MyPlaybooks/drupal_setup/roles/mysql/tasks/create_db.yml

Ansible имеет модули, которые позволяют вам управлять MySQL. В этой задаче мы будем использовать следующие модули:

  • mysql_db - Чтобы создать новую базу данных для Drupal.

  • mysql_user Чтобы создать нового пользователя и разрешить ему доступ к базе данных.

Перед тем как использоватьmysql_db илиmysql_user, мы должны убедиться, что пакетPython MySQLdb установлен на удаленном хосте. Используйте модульapt для его установки.

Добавьте следующее содержимое в файл:

---
- name: Install Python MySQLdb
  apt: name=python-mysqldb state=latest

- name: Create the Drupal database
  mysql_db: db={{ db_name }} state=present

- name: Create the Drupal user
  mysql_user: >
    name={{ db_user }}
    password={{ db_password }}
    priv={{ db_name }}.*:ALL
    host=localhost

Обратите внимание, что строки, заключенные в \ {\ {}}, обозначают переменные. В этой задаче у нас есть переменные{{ db_user }},{{ db_password}} и{{ db_name }}. Мы собираемся установить значения этих переменных на следующем шаге.

Далее нам нужно сообщить Ansible, что у этой роли две задачи. Для этого мы создаем файлmain.yml.

nano ~/MyPlaybooks/drupal_setup/roles/mysql/tasks/main.yml

Добавьте следующий код в этот файл:

---

- include: setup.yml
- include: create_db.yml

[[step-7 -—- create-a-role-to-install-drupal]] == Шаг 7. Создайте роль для установки Drupal

Пришло время перейти к установке самого Drupal.

Создайте каталоги для этой роли и ее задач.

mkdir -p ~/MyPlaybooks/drupal_setup/roles/drupal/tasks

Используйтеnano для создания и редактирования файла задачи с именемmain.yml.

nano ~/MyPlaybooks/drupal_setup/roles/drupal/tasks/main.yml

В этом задании мы скажем Ansible выполнить следующие действия:

  • Установитеgit на удаленный хост. Это необходимо, потому что мы будем использовать модуль Ansiblegit

  • Используйте модульgit от Ansible, чтобы клонировать последнюю стабильную версию Drupal из репозиторияhttp://git.drupal.org/project/drupal.git. Скачанные файлы помещаются в/var/www/html/drupal

  • Создайте файлыsettings.php иservices.yml из файлов по умолчанию

  • Обновите разрешения дляsettings.php,services.yml иsites/default/files

Добавьте следующий код в файл:

---

- name: Install git
  apt: name=git state=latest

- name: Clone Drupal
  git: >
    repo=http://git.drupal.org/project/drupal.git
    dest=/var/www/html/drupal/
    update=no

- name: Create settings.php
  command: cp /var/www/html/drupal/sites/default/default.settings.php /var/www/html/drupal/sites/default/settings.php

- name: Create services.yml
  command: cp /var/www/html/drupal/sites/default/default.services.yml /var/www/html/drupal/sites/default/services.yml

- name: Update permissions of settings.php
  file: path=/var/www/html/drupal/sites/default/settings.php mode=777

- name: Update permissions of services.yml
  file: path=/var/www/html/drupal/sites/default/services.yml mode=777

- name: Update permissions of files directory
  file: >
    path=/var/www/html/drupal/sites/default/files
    mode=777
    state=directory
    recurse=yes

Вы захотите обновить разрешения для этих файлов позже после завершения установки браузера на каждом сервере (на каждом сервере, а не через Ansible).

[[step-8 -—- create-a-file-to-use-all-the-roles]] == Шаг 8. Создайте файл для использования всех ролей

На данный момент все наши роли готовы. Теперь нам нужно их использовать.

Используйтеnano, чтобы создать файл с именемsite.yml. Это файл, который мы на самом деле запустим с Ansible.

nano ~/MyPlaybooks/drupal_setup/site.yml

В этом файле мы выполняем следующие действия:

  • Укажите хосты, на которых будет работать этот Playbook

  • Укажите, чтоsudo следует использовать для выполнения всех задач этого пособия.

  • Установите значения по умолчанию для переменных, используемых в различных ролях

  • Запустите все роли

Добавьте следующий код к нему:

---

- hosts: drupal_hosts

  sudo: yes

  vars:
    - db_name: drupal
    - db_user: drupal_user
    - db_password: drupal_db_pass

  roles:
    - update
    - php
    - mysql
    - drupal

Убедитесь, что вы изменили значение переменнойdb_password на другое значение, кромеdrupal_db_pass. Вы можете изменить значения двух других переменных, чтобы они соответствовали вашим предпочтениям.

[[step-9 -—- install-an-ssh-connection]] == Шаг 9 - Установите соединение SSH

Перед запуском Playbook в вашем файле~/.ssh/known_hosts должна быть запись для каждого из хостов, упомянутых в файлеhosts.

Самый простой способ сделать это - подключиться один раз к каждому серверу, указанному в файле~/MyPlaybooks/drupal_setup/hosts, с этого сервера, используя SSH.

Подключитесь кlocalhost через SSH, используя команду:

ssh localhost

Если вы впервые подключаетесь к серверу таким образом, вам будет выдано сообщение с сообщением:

The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is b1:18:3d:19:15:21:39:5a:f7:9f:3c:37:68:ba:62:01.
Are you sure you want to continue connecting (yes/no)?

Как только вы скажетеyes, вы получите сообщение:

Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.

Подключитесь к любым другим серверам, перечисленным в файлеhosts:

ssh drupal_sudo_user@drupal_server_ip

Убедитесь, что вы заменили имя пользователя и IP-адрес фактической информацией для каждого сервера. Учтите, что имя пользователя sudo (drupal_sudo_user в примере) и пароль должны быть одинаковыми для каждого сервера, включаяlocalhost.

Note: Вместо использования паролей вы можете скопировать открытый ключ SSH для пользователя sudoAnsible server’s в файлdrupal_sudo_user'sauthorized_keys на каждом управляемом сервере.

Как только вы подключились к каждому серверу, вы готовы запустить Playbook.

[[step-10 -—- run-the-playbook]] == Шаг 10. Запустите Playbook

Playbook теперь готов к тестированию. Запустите его с помощью командыansible-playbook. Параметр-k заставляет Ansible запрашивать пароль SSH, и в этом нет необходимости, если вы настроили аутентификацию без пароля. Параметр-K заставляет Ansible запрашивать парольsudo.

cd ~/MyPlaybooks/drupal_setup/
ansible-playbook -i hosts site.yml -kK

Введите пароль SSH и дождитесь запуска Playbook. После завершения запуска у вас будет новая установка Drupal на вашем сервере.

Note: Флаг-k можно не указывать, если вы добавили ключ SSH от пользователя sudoAnsible server’s на каждый управляемый сервер.

Это займет несколько минут, и Ansible покажет вам, что он делает на каждом этапе.

Important: Если вы хотите запустить этот скрипт для настройки большего количества серверов в будущем, вы должны удалить IP-адреса серверов, которые уже настроены, из файла~/MyPlaybooks/drupal_setup/hosts, иначе Ansible перезапишет ваш настроенный Сайты Drupal.

[[step-11 -—- set-up-drupal]] == Шаг 11 - Установите Drupal

Теперь вы сможете использовать браузер для доступа к Drupal и завершить установку через браузер наhttp://your_server_ip/drupal/.

Drupal Setup Page

Если вам нужна помощь в завершении установки браузера для Drupal, следуйте инструкциям вthis article.

Настройки вашей базы данных будут переменными, которые вы установили в разделеvars файла~/MyPlaybooks/drupal_setup/site.yml.

Дважды проверьте, что на каждом сервере установлена ​​успешная установка Drupal.

[[step-12 -—- clean-up-the-host-list]] == Шаг 12 - Очистить список хостов

Пришло время удалить хосты из файла~/MyPlaybooks/drupal_setup/hosts. Таким образом, если вы снова запустите playbook, вы случайно не перезапишите хосты, которые вы уже настроили.

Поиск проблемы

Обратите внимание, что YAML чувствителен к пробелам. Если у вас возникли проблемы с вашей playbook, возможно, у вас неправильный отступ или лишние пробелы в ваших файлах.yml.

Если вы видите ошибку, которая выглядит следующим образом:

fatal: [server-name] => Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host.

Это означает, что вы пропустили добавление записи для одного или нескольких хостов в файл~/.ssh/known_hosts.

Сначала вам нужно будет вручную установить SSH-подключение кlocalhost или к целевому удаленному серверу. Затем попробуйте запустить Playbook снова.

Заключение

С помощью этого урока вы научились создавать игровую книгу Ansible, которая настраивает для вас Drupal, а также Apache и MySQL. Прежде чем использовать эту пьесу в производственных системах, вам нужно будет в дальнейшем использовать ее для повышения безопасности установки. Вы также можете использовать команды Drush в playbook для управления установкой Drupal.

Related