Мы в drupal-coder.ru достаточно часто сталикаваемся с задачами настройки выделенных серверов под Drupal сайты. В связи с этим уже достаточно давно ищем систему управлениями конфигурациями серверов, с помощью которой можно было бы автоматизировать и упростить выполнение этой задачи. Конечно систем управлениями конфигурациями достаточно много среди них puppet и сhef, но мне они показались сложноватыми. И вот относительно недавно я познакомился с системой управлениями конфигурациями Ansible. Мне понравилась эта система управления конфигурациями, потому что:
- На серверы не требуется устанавливать какие-либо демоны.
- Все работает через SSH.
- Достаточно простой язык для написания сценариев настройки сервера.
В этой статье я не буду подробно описывать систему Ansible и синтаксис написания скриптов (этому я посвящу отдельную статью), а просто опишу пример сценария Ansible для настройки сервера с Debian для Drupal проекта в конфигурации Nginx + Apache + PHP + APC + MySQL + Memcached.
Порядок настройки сервера следующий:
- На сервер управления конфигурациями или просто на рабочую станцию устанавливаем Ansible.
- Пишем конфигурацию и указываем ip адрес сервера, который необходимо настроить.
- Запускаем скрипт, и Ansible по SSH подключается к серверу и производит настройку.
Для примера рассмотрим ситуацию, что нам необходимо настроить сервер 192.168.0.1 для сайта drupal-admin.ru
Установка Ansible
Устанавливаем Python и несколько пакетов
aptitude install python2.6 python-yaml python2.6-paramiko python2.6-jinja2
Скачиваем и устанавливаем Ansible
git clone git://github.com/ansible/ansible.git cd ./ansible make install
Далее в файл ~/etc/ansible/hosts пишем IP адрес сервера
[drupal-admin.ru] 192.168.0.1
в файл ~/.profile вписываем настройки соединения ssh:
export ANSIBLE_TRANSPORT='ssh' export ANSIBLE_SSH_ARGS='-o PasswordAuthentication=no -o ControlMaster=auto -o ControlPath=/tmp/ansible-ssh-%h-%p-%r'
теперь нужно выполнить команды, чтобы каждый раз не указывать ключ подключения к серверу
ssh-agent bash ssh-add ~/.ssh/id_rsa ssh-copy-id root@192.168.0.1
Для проверки правильности установки Ansible можно запустить следующую команду
ansible all -m ping -u root
Конфигурация Ansible
Конфигурация представляет из себя папку со следующими файлами
drupal-admin.ru — install.yml — setup.yml — tasks/ # Папка со скриптами настройки сервера —— setup.yml — files/ # Папка с конфигурационными файлами для настройки сервера —— apache2.conf —— envvars —— memcached.conf —— my.cnf —— nginx_drupal-admin.ru —— ports.conf —— drupal-admin.ru —— vsftpd.conf — handlers/ # В этой папке хранятся скрипты с обработчиками событий событиями —— setup.yml
Сценарий install.yml
Этот файл представляет из себя скрипт первоначальной настройки сервера, запускается 1 раз перед настройкой сервера.
---
#указываем для каких хостов запускаем скрипт
- hosts: drupal-admin.ru
user: root
tasks:
# Создаем пользователя webmaster
- name: create user webmaster
action: user name=webmaster createhome=yes
#Добавляем репозиторий backports
- name: install repo
action: apt_repository repo='deb http://backports.debian.org/debian-backports squeeze-backports main'
notify:
- refresh apt cache
Сценарий setup.yml
Этот сценарий настраивает сервер на нужную нам конфигурацию. Если что-то необходимо поменять, то вносим изменения в нужный файл конфигурации и запускаем этот сценарий.
---
- hosts: tk-shop.ru
user: root
vars:
user: webmaster #это переменная которую мы будет использовать в скрипте tasks/setup.yml
site: tk-shop.ru #это переменная которую мы будет использовать в скрипте tasks/setup.yml
tasks:
- include: tasks/setup.yml
handlers:
- include: handlers/setup.yml
Файл tasks/setup.yml - представляет из себя список задач, которые требуется выполнить для настройки сервера.
#установка нужных пакетов
- name: ensure packages is at the latest version
action: apt pkg=apache2-mpm-prefork,mysql-server,php5,php5-gd,php5-mysql,php5-memcached,php5-xcache,memcached,drush,nginx,vsftpd,rsync state=latest update-cache=yes force=yes install_recommends=yes
#создание папок в пользовательском каталог /home/webmaster для размещения сайта и логов
- name: create directories
action: file path=$item owner=$user group=$user state=directory
with_items:
- /home/${user}/domains
- /home/${user}/tmp
- /home/${user}/logs
- /home/${user}/domains/${site}
- /home/${user}/domains/${site}/html
- /home/${user}/domains/${site}/logs
# Переносим конфигурацию Apache на сервер
- name: install apache2.conf
action: copy src=files/apache2.conf dest=/etc/apache2/apache2.conf
notify:
- reload apache
- name: install apache2 ports.conf
action: copy src=files/ports.conf dest=/etc/apache2/ports.conf
notify:
- reload apache
- name: update envvars
action: copy src=files/envvars dest=/etc/apache2/envvars
notify:
- restart apache
#Добавляем virtualhost
- name: install apache2 virtual hosts
action: copy src=files/$site dest=/etc/apache2/sites-available/$site
notify:
- reload apache
- name: activate apache2 virtual host
action: command /usr/sbin/a2ensite $site
notify:
- reload apache
# Копируем настройки nginx
- name: install nginx conf
action: copy src=files/nginx_$site dest=/etc/nginx/sites-available/$site
notify:
- restart nginx
# Добавляем VirtualHost
- name: enable nginx conf
action: file src=/etc/nginx/sites-available/$site dest=/etc/nginx/sites-enabled/$site state=link
notify:
- restart nginx
# Копируем конфигурацию MySQL
- name: install mysql conf
action: copy src=files/my.cnf dest=/etc/mysql/my.cnf
notify:
- restart mysql
# Копируем конфигурацию PHP
- name: install xcache conf
action: copy src=files/xcache.ini dest=/etc/php5/conf.d/xcache.ini
notify:
- restart apache
# Копируем конфигурацию memcached
- name: install memcached conf
action: copy src=files/memcached.conf dest=/etc/memcached.conf
notify:
- restart memcached
# Копируем конфигурацию vsftpd.conf
- name: install vsftpd conf
action: copy src=files/vsftpd.conf dest=/etc/vsftpd.conf
notify:
- restart vsftpd
# Копируем sysctl.conf
- name: install sysctl.conf
action: copy src=files/sysctl.conf dest=/etc/sysctl.conf
notify:
- save sysctl
Файл handlers/setup.yml - представляет из скрипты для обработки событий
#Перезапуск Apache - name: restart apache action: service name=apache2 state=restarted # Загрузка конфигурации Apache - name: reload apache action: service name=apache2 state=reloaded # Перезапуск Memcached - name: restart memcached action: service name=memcached state=restarted # Перезапуск vsftpd - name: restart vsftpd action: service name=vsftpd state=restarted # Перезапуск MySQL - name: restart mysql action: service name=mysql state=restarted # Перезапуск nginx - name: restart nginx action: service name=nginx state=restarted # Запись настроек sysctl.conf - name: save sysctl action: command sysctl -p # Обновление кэша apt - name: refresh apt cache action: apt update-cache=yes
Предварительная настройка сервера
Для этого запускаем скрипт init.yml только 1 раз.
ansible-playbook init.yml -u root
После выполнения этого скрипта на сервере в /etc/passwd необходимо вписать для пользователя webmaster окружение /bin/bash
Обновление конфигурации сервера
Для этого запускаем скрипт setup.yml. Этот скрипт запускаем каждый раз, когда изменяем конфигурацию сервера
ansible-playbook setup.yml -u root
Заключение
В результате мы получили настроенный сервер по адресу 192.168.0.1, для обновления конфигурации сервера достаточно запустить скрипт setup.yml, при этом система сама обновит нужные файлы и при необходимости перезапустит необходимые службы.
Описанная мною конфигурация является достаточно простой, потому что в каталоге files содержатся файлы конфигурации именно для настраиваемого сервера. Для большей автоматизации можно написать шаблоны файлов конфигурации, что позволит для всех серверов подобной конфигурации держать одинаковые шалоны, а настройки изменять только переменными. Ну я пока с этого начал мне уже кажется очень удобно.