Вступление
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's
authorized_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, следуйте инструкциям в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.