Быстрая настройка Debian сервера под Drupal c помощью системы управления конфигурациями Ansible

Опубликовано admin - сб, 11/10/2012 - 20:51

Мы в drupal-coder.ru достаточно часто сталикаваемся с задачами настройки выделенных серверов под Drupal сайты. В связи с этим уже достаточно давно ищем систему управлениями конфигурациями серверов, с помощью которой можно было бы автоматизировать и упростить выполнение этой задачи. Конечно систем управлениями конфигурациями достаточно много среди них puppet и сhef, но мне они показались сложноватыми. И вот относительно недавно я познакомился с системой управлениями конфигурациями Ansible. Мне понравилась эта система управления конфигурациями, потому что:

  1. На серверы не требуется устанавливать какие-либо демоны.
  2. Все работает через SSH.
  3. Достаточно простой язык для написания сценариев настройки сервера.

В этой статье я не буду подробно описывать систему Ansible и синтаксис написания скриптов (этому я посвящу отдельную статью), а просто опишу пример сценария Ansible для настройки сервера с Debian для Drupal проекта в конфигурации Nginx + Apache + PHP + APC + MySQL + Memcached.
Порядок настройки сервера следующий:

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

Добавить комментарий

Filtered HTML

  • Допустимые HTML-теги: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd>
  • Строки и абзацы переносятся автоматически.
  • Web page addresses and email addresses turn into links automatically.