Мы в 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 содержатся файлы конфигурации именно для настраиваемого сервера. Для большей автоматизации можно написать шаблоны файлов конфигурации, что позволит для всех серверов подобной конфигурации держать одинаковые шалоны, а настройки изменять только переменными. Ну я пока с этого начал мне уже кажется очень удобно.