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

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

В этой статье я хочу рассказать об автоконфигурации в облаке. Для примера запустим 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-сервером в зависимости от роли. Но это уже тема для следующей статьи.
  • +20
  • 7,1k
  • 8
EPAM
154,38
Компания для карьерного и профессионального роста
Поделиться публикацией

Похожие публикации

Комментарии 8

    +4
    Для того, что бы не ставить Chef ручками и не заливать каждый раз обновленные coockbooks на сервер лучше использовать Knife. Для Chef-Solo даже есть Knife-Solo с полезными командами. Так же, что бы не хранить все coockbooks в репозитории (поскольку этот набор папок и файлов в 99% случаев не меняется), а только свои кастомные и не следить за их зависимостями (у многих кукбуков есть зависимости, которые тоже нужно скачивать) лучше использовать Librarian. Для таких статей лучше начинать со структуры кухни (kitchen), что бы новички понимали как «эта магия» работает.
    Спасибо за статью.
      +2
      За Librarian спасибо, не слышал о нём. Для новичов уже есть несколько статей на хабре. Кроме того есть Chef Wiki. Думаю, что официальная документация лучшее место для получения знаний. Я хотел в этой статье показать сам подход: автоматизация + работа с инфраструтурой как с кодом.
      0
      Даёшь puppet рядом! Неплохо бы их рядом посмотреть, но не холивара ради, а для объективного сравнения, чтобы можно было выбрать более подходящий под конкретную задачу инструмент.

      ps: Если что, я puppet`ист
        0
        Раз Вы puppet-ист, то вам и карты в руки. Я, к сожалению, только читал о нём, на практике не применял. Вы можете повторить мои действия, но с использованием Puppet, а результатами и выводами поделиться с нами.
        0
        Ещё удобно заранее упаковать тарбол со всем необходимым и вместе с параметрами узла выложить в надёжное место в интернете.

        Конфиг chef-solo при этом будет выглядеть как-то так:

        file_cache_path "/var/chef-solo"
        cookbook_path "/var/chef-solo/cookbooks"
        data_bag_path "/var/chef-solo/data_bags"
        role_path "/var/chef-solo/roles"
        
        json_attribs "http://safe.place.in.net/chef/" + `hostname -f`.chomp! + ".json"
        recipe_url "http://safe.place.in.net/chef/chef-solo.tar.gz"
        
        log_location "/var/log/chef/solo.log"
        verbose_logging true
        

          0
          Где-то я это видел… :)

          Я бы все-таки не ставил WP через предлагаемый OPSCode рецепт, т.к. он по непонятным причинам тянет за собой кучу зависимостей, вроде Pear и прочего, по моему это вообще один из самых неудачных рецептов в репозитории…
            +1
            WP как раз ставится через собственный, очень простой, рецепт. В статье об этом указано.
              0
              Ох елки, извини, в следующий раз буду читать внимательней.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое