- PVSM.RU - https://www.pvsm.ru -

Автоконфигурация в облаке Amazon при помощи Chef-Solo

Здравствуйте!

В этой статье я хочу рассказать об автоконфигурации в облаке. Для примера запустим ec2-инстанс, на котором «приготовится» WordPress.

Под автоконфигурацией я понимаю автоматическую установку и настройку пакетов, разворачивание приложений. Процесс настройки должен проходить без логина по ssh на конфигурируемый инстанс, буквально одной командой.

Автоконфигурация в облаке Amazon при помощи Chef Solo


Чтобы получить инстанс с установленным WordPress, нам понадобятся Amazon EC2 API Tools [1] и Chef-Solo [2], а также cookbook-и [3] для него.
Cookbook — это сборник рецептов, по которым Chef-Solo будет “готовить” сервер (конфигурировать его). Нам понадобится несколько таких «поваренных книг», а именно:

Все, кроме wp, — это cookbook-и из комьюнити-репозитория [10]. wp — это простой cookbook, состоящий из одного рецепта, с помощью которого Chef-Solo скачает последнюю версию WordPress из svn, создаст базу данных и установит его. Все нужные cookbook-и я собрал в репозитории [11] на git.
Для запуска Chef-Solo необходимы два конфигурационных файла solo.rb и node.json.

solo.rb:

file_cache_path "/var/chef-solo"
cookbook_path "/var/chef-solo/cookbooks"

Здесь задаётся путь к cookbook-ам.

node.json:

{
  "run_list": [
    "recipe[php::package]",
    "recipe[php::module_mysql]",
    "recipe[apache2]",
    "recipe[apache2::mod_php5]",
    "recipe[subversion]",
    "recipe[mysql::server]",
    "recipe[wp]"
  ],
  "php"    : { "conf_dir" : "/etc/" },
  "mysql"  : { "server_root_password" : "xxxie0AiquaiX",
               "service_name" : "mysqld",
               "platform" : "amazon" }
}

В этом файле указываем какие рецепты запускать и задаем параметры.

Приготовления окончены, можно приступать. Все, что нам осталось, это поднять инстанс командой из набора Amazon EC2 API Tools:

ec2-run-instances {ami} -t {instance shape} -k {key_name},

скачать cookbook-и и конфиги, установить и запустить chef-solo.
Но! Мы договорились, что заходить по ssh на инстанс не будем. Как нам выполнить несколько команд не логинясь на инстанс? Нам поможет очень полезная функция AWS — user-data [12]. Используя её, можно передавать любые данные на инстанс, в том числе и выполнять bash-скрипты.

chef-solo-inst.sh:

#!/bin/bash -x

#write logs
LOGS="/root/autoconf-log.$(date -I)"
exec > $LOGS 2>&1

SOLODIR="/var/chef-solo"
CFGDIR="$SOLODIR/wp-aws-chef-solo"

#install Chef 
rpm -ivh http://opscode-omnitruck-release.s3.amazonaws.com/el/6/x86_64/chef-10.14.4-2.el6.x86_64.rpm

#install git
yum -y install git

#create dir and download cookbooks
mkdir "$SOLODIR"
cd "$SOLODIR"
git clone https://github.com/morkot/wp-aws-chef-solo
git clone https://github.com/morkot/cookbooks

#run chef-solo
chef-solo -c "$CFGDIR"/solo.rb -j "$CFGDIR"/node.json

Теперь мы готовы поднять автоконфигурируемый инстанс:

ec2-run-instances ami-1624987f -t t1.micro -k {your_key_name} --user-data-file chef-solo-inst.sh

где --user-data-file chef-solo-inst.sh — это опция, которая говорит использовать в качестве user-data локально расположенный bash-скрипт.
Через несколько минут можно выполнить команду ec2-describe-instances, скопировать dns-имя поднятого инстанса и открыть в браузере http://{instance_dns_name}/wp, при этом должна открыться страница настройки WordPress:

Автоконфигурация в облаке Amazon при помощи Chef Solo

Если страница недоступна, то что-то пошло не так. Что именно, можно узнать, посмотрев log-файл autoconf-log.{date}, который будет лежать на инстансе в /root директории.

Таким образом, мы получили полностью настроенный и готовый к работе инстанс. Используя chef-рецепты в связке с user-data можно конфигурировать системы любой сложности. Причем, рецепты могут быть кросс-платформенными и с их помощью можно конфигурировать инстансы с разными ОС.

Самое интересное в таком подходе это то, что мы работаем с инфраструктурой, как с кодом (Infrastructure as a Code). Следовательно можно использовать те же методики, что и при разработке ПО (например TDD [13]).

В этой статье показан один из простейших способов автоконфигурации, но можно пойти дальше: сделать образы с уже установленным chef-клиентом, чтобы инстанс, при запуске, настраивался chef-сервером в зависимости от роли. Но это уже тема для следующей статьи.

Автор: morkot


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/amazon-web-services/17702

Ссылки в тексте:

[1] Amazon EC2 API Tools: http://aws.amazon.com/developertools/Amazon-EC2/351

[2] Chef-Solo: http://wiki.opscode.com/display/chef/Chef+Solo

[3] cookbook-и: http://wiki.opscode.com/display/chef/Cookbooks

[4] apache2: https://github.com/opscode-cookbooks/apache2

[5] mysql: https://github.com/opscode-cookbooks/mysql

[6] openssl: https://github.com/opscode-cookbooks/openssl

[7] php: https://github.com/opscode-cookbooks/php

[8] subversion: https://github.com/opscode-cookbooks/subversion

[9] wp: https://github.com/morkot/cookbooks/tree/master/wp

[10] комьюнити-репозитория: https://github.com/opscode-cookbooks

[11] репозитории: https://github.com/morkot/cookbooks

[12] user-data: http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html

[13] TDD: http://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5