Здравствуйте!
В этой статье я хочу рассказать об автоконфигурации в облаке. Для примера запустим ec2-инстанс, на котором «приготовится» WordPress.
Под автоконфигурацией я понимаю автоматическую установку и настройку пакетов, разворачивание приложений. Процесс настройки должен проходить без логина по ssh на конфигурируемый инстанс, буквально одной командой.
Чтобы получить инстанс с установленным WordPress, нам понадобятся Amazon EC2 API Tools и Chef-Solo, а также cookbook-и для него.
Cookbook — это сборник рецептов, по которым Chef-Solo будет “готовить” сервер (конфигурировать его). Нам понадобится несколько таких «поваренных книг», а именно:
Все, кроме wp, — это cookbook-и из комьюнити-репозитория. wp — это простой cookbook, состоящий из одного рецепта, с помощью которого Chef-Solo скачает последнюю версию WordPress из svn, создаст базу данных и установит его. Все нужные cookbook-и я собрал в репозитории на 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. Используя её, можно передавать любые данные на инстанс, в том числе и выполнять 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:
Если страница недоступна, то что-то пошло не так. Что именно, можно узнать, посмотрев log-файл autoconf-log.{date}, который будет лежать на инстансе в /root директории.
Таким образом, мы получили полностью настроенный и готовый к работе инстанс. Используя chef-рецепты в связке с user-data можно конфигурировать системы любой сложности. Причем, рецепты могут быть кросс-платформенными и с их помощью можно конфигурировать инстансы с разными ОС.
Самое интересное в таком подходе это то, что мы работаем с инфраструктурой, как с кодом (Infrastructure as a Code). Следовательно можно использовать те же методики, что и при разработке ПО (например TDD).
В этой статье показан один из простейших способов автоконфигурации, но можно пойти дальше: сделать образы с уже установленным chef-клиентом, чтобы инстанс, при запуске, настраивался chef-сервером в зависимости от роли. Но это уже тема для следующей статьи.
Автор: morkot