[recovery mode] Автоматизированная установка WordPress на VPS с помощью Ansible
Добрый день, Хабр.Не так давно я начал разбираться с замечательным инструментом для любого DevOps — Ansible. Сегодня хочу представить на ваш взыскательный суд небольшую вводную статью по использованию этого, во многом прекрасного, инструмента. Итак, начнем.
Что такое Ansible Ansible — это инструмент для автоматизации задач системного администратора и не только. Если своими словами — это та штука, которая позволяет автоматически настраивать сервера пачками.Кто-то скажет, что он не нужен, т.к. есть Chef, Puppet, etc. Я с этими людьми абсолютно соглашусь. Если вы можете использовать эти инструменты — отлично. Я же пишу эту статью для тех, кто хочет немного понять как работает Ansible и как с его помощью можно многое автоматизировать.
Если вы до этого не сталкивались с Ansible вообще, то советую почитать статью компании Селектел. Отличная статья.
Максимум автоматизации Давайте определимся, что нам нужно, чтоб запустить Wordpress на VPS сервере с установленной Ubuntu: Nginx Mysql PHP5 Memcached для использования W3Total Cache плагина Wordpress Вот в таком порядке мы и будем писать роли для настройки сервера.Структура каталогов для нашей задачи будет такая: Nginx В каталоге roles/nginx/tasks создаем main.yml со следующим содержимым: — name: Add nginx repository apt_repository: repo='ppa: nginx/stable'
— name: Install nginx action: apt pkg=nginx-extras state=installed update_cache=true
— name: Disable default site file: path: /etc/nginx/sites-enabled/default state: absent Все, что начинается с новой строки как »- name» — это отдельная задача для Ansible. Разбираем то, что написано по шагам: Добавляем репозиторий nginx (ppa: nginx/stable) Устанавливаем nginx-extras (При необходимости он содержит SPDY модуль и его можно включить в конфиге) Удаляем симлинк на конфиг по умолчанию В каталоге roles/nginx/handlers создаем файл main.yml со следующим содержимым: — name: restart nginx service: name: nginx state: restarted Это описание сервиса для перезагрузки Nginx’а. Он нам понадобится после установки конфига для нашего Wordpress’а.На этом с Nginx’ом все. Два простых файла нам позволят установить репозиторий в систему, установить вебсервер, убрать его настройки по умолчанию и определить сервис для его перезагруки.
Идем далее.
MySQL Я привык ставить Percona MySQL server. Лучше он или хуже — можно долго спорить. Я привык и использую его.Принцип абсолютно тот же. Файл roles/percona-mysql/tasks/main.yml:
— name: Add GPG key for repository command: apt-key adv --keyserver keyserver.ubuntu.com --recv CD2EFD2A
— name: Add Percona repository shell: echo «deb http://repo.percona.com/apt {{ ansible_lsb['codename'] }} main» | tee /etc/apt/sources.list.d/percona.list creates=/etc/apt/sources.list.d/percona.list
— name: Install Percona MySQL server apt: pkg:»{{ item }}» update_cache: true with_items: — percona-server-server-5.5 — percona-server-client-5.5 — python-mysqldb
— name: Change root password (fail is not a problem) mysql_user: name: root password:»{{ mysql_root_password}}» ignore_errors: yes Теперь по шагам:
Добавляем ключ репозитория Добавляем сам репозиторий с проверкой, что файл /etc/apt/sources.list.d/percona.list создался Устанавливаем три пакета: percona-server-server-5.5 percona-server-client-5.5 python-mysqldb (нужен для управления mysql сервером из ansible) Меняем пароль рута на указанный в переменных (см. ниже) Переменные мы укажем в основном yml файле ниже. Там же будут указаны имя базы, пользователь с паролем и т.п.PHP5 Поскольку мы не используем Apache, то и php мы будем использовать с php-fpm. Для этого в файл roles/php5/handlers/main.yml описываем сервис php5-fpm: — name: restart php5-fpm service: name: php5-fpm state: restarted Его мы вызовем после конфигурирования php5-fpm, чтоб перезапустить демон.Содержимое roles/php5/tasks/main.yml: — name: install php5 apt: pkg={{ item }} with_items: — php5 — php5-cgi — php5-fpm — php5-memcache — php5-memcached — php5-mcrypt — php5-mysql — php5-gd — php5-curl — php5-xmlrpc
— name: change listen socket lineinfile: dest: '/etc/php5/fpm/pool.d/www.conf' insertafter: 'listen = 127.0.0.1:9000' line: 'listen = /var/run/fpm.socket' notify: restart php5-fpm Первым шагом мы устанавливаем необходимые пакеты. Здесь все просто.А вот второй шаг более интересен. Разберемся подробнее. В Nginx мы будем использовать общение с php5-fmp через unix-соккет. Для этого нам надо в конфиге пула www демона php5-fpm указать, чтоб он слушал соккет по нужному нам пути. Модуль lineinfile позволяет нам это сделать: «dest» — это путь, где нужно внести правки. «insertafter» — найти в указанном файле строку «listen = 127.0.0.1:9000» и вставить после нее указанное в «line» «notify» — Послать уведомление сервису «restart php5-fpm» (вот зачем нужно было описание сервиса php5-fpm) Memcached С этим сервисом все очень просто. Нужно установить его и все. Содержимое roles/memcached/tasks/main.yml: — name: install memcached server apt: pkg: memcached Wordpress Вот тут мы и установим автоматически Wordpress, создадим для него базу данных и конфигурацию nginx. Почему именно здесь? Все просто. Вы можете взять любую роль и использовать ее в других своих ansible проектах. Или создать еще одну роль и развернуть не wordpress, а свой какой-то проект рядом с wordpress’ом. Т.е. это сделано для банального удобства.Итак, roles/wordpress/tasks/main.yml:
— name: creating database mysql_db: name:»{{ db_name }}» state: «present» login_user: «root» login_password:»{{ mysql_root_password }}»
— name: creating database user mysql_user: name:»{{ db_user }}» password:»{{ db_password }}» priv:»{{ db_name }}.*: ALL» state: «present» login_user: «root» login_password:»{{ mysql_root_password }}»
— name: install nginx configuration template: src: wordpress.conf dest: /etc/nginx/sites-available/wordpress.conf notify: restart nginx
— name: activate site configuration file: src: '/etc/nginx/sites-available/wordpress.conf' dest: '/etc/nginx/sites-enabled/wordpress.conf' state: 'link'
— name: download WordPress get_url: url:»{{ download_url }}» dest:»/tmp/latest.tar.gz»
— name: creating directory for WordPress file: path:»{{ wpdirectory }}» state: «directory» owner: «www-data» group: «www-data»
— name: unpack WordPress installation shell: «tar xvfz /tmp/latest.tar.gz -C {{ wpdirectory }} && chown -R www-data: www-data {{ wpdirectory }}» А теперь пройдем по каждому пункту: Создаем базу данных, указав параметры подключения (логин root и его пароль) Создаем пользователя базы данных с паролем, указав при этом его права на только что созданную базу Создаем конфигурацию сервера в Nginx, используя заранее заготовленный шаблон (см. ниже) и посылаем сигнал на рестарт сервиса Nginx Активируем сервер в Nginx, создав симлинк Скачиваем, указанную в переменных, версию Wordpress Создаем каталог для Wordpress Распаковываем скачанный архив и устанавливаем необходимые права на файлы и каталоги Теперь шаблон конфигурации сервера Nginx roles/wordpress/templates/wordpress.conf: server { listen 80 default_server;
root {{ wpdirectory }}/wordpress; index index.php index.html index.htm;
server_name {{ domain }};
location / { try_files $uri $uri/ /index.php? q=$uri&$args; }
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/www; }
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 location ~ \.php$ { try_files $uri =404; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } }
server { listen 80; server_name www.{{ domain }}; location / { return 301 http://{{ domain }}; } } Описывать принципы конфигурации Nginx — это тема для отдельной статьи и даже не одной. Оставим это дело для домашнего задания.Сборка воедино и запуск установки Для того, чтоб Ansible знал, что и как запускать, нам надо написать playbook wordpress.yml: — hosts: appservers-php sudo: yes vars: — mysql_root_password: «SuperP@S$w0rd» — domain: «example.com» — download_url: «http://wordpress.org/latest.tar.gz» — wpdirectory:»/var/www» — db_name: «wordpress» — db_user: «wordpress» — db_password: «wordpress» roles: — { role: nginx } — { role: percona-mysql } — { role: memcached } — { role: php5 } — { role: wordpress } Этот файл указывает Ansible что, на каких серверах, в какой последовательности и с какими правами выполнять.hosts — это список хостов из файла hosts (см.ниже), на которых должны быть произведены все действия; sudo — выполнять ли все действия из под sudo; vars — переменные, которые используются в ролях: mysql_root_password — какой пароль установить пользователю root в MySQL domain — домен сайта, который указывается в конфигурации nginx wpdirectory — в какой каталог установить Wordpress db_* — соответствующие параметры для MySQL roles — выполняемые задачи (роли) И осталось нам описать только список серверов для установки всего в файле hosts: [appservers-php] example.com ansible_ssh_host=10.0.0.2 ansible_ssh_user=ubuntu Блок в первой строке обозначает на список хостов, который указан в wordress.yml. Дальше собственно каждый сервер с новой строки.Первым указывается домен сервера.Вторым указывает IP адрес сервера, куда должен идти Ansible по ssh. Этот параметр не обязательный, если у вас домен уже сконфигурирован на нужный сервер.Третьим параметром идет имя пользователя, с которым Ansible будет заходить на сервер через ssh.Теперь можно запускать установку:
ansible-playbook -i hosts wordpress.yml -kK k — запросить ssh пароль. K — запросить sudo пароль После окончания работы можно заходить на сервер по HTTP и сконфигурировать Wordpress для работы.
Готовый рецепт можно взять на github.
Надеюсь, что это немного поможет вам автоматизировать рутину на работе (и дома). Спасибо, что читали.