DevOps: Часть I. Практика по Chef пишем рецепт для базы данных precona-server (mysql).

Текущие реалии требуют умение управлять большим количеством серверов. С ростом популярности облачного хостинга большое количество серверов может быть не только физическими но и виртуальными.

Для внедрения методологии devops на предприятие, требуется, чтобы все команда имела представление о системе управления конфигурациями. Данные практические работы будут строиться на базе Cloud Server'aх. Данное решение было принято для обеспечения у всех единой среды при составление и повторение практических работ. Платформа выбрана по соотношение цена-качество. В прошлых статьях о сравнение характеристик VDS серверов все тесты выполнялись приблизительно одинаково.

Что мы проделаем в данной лабораторное работе?

  • Познакомимся с готовыми cookbooks на Chef supermarket и с использованием рецепта cookbook 'percona', '~> 0.16.0' настроим сервер базы данных
  • Создадим свой первый cookbook для установки ruby через rvm и запуском Rails APP под управлением nginx c модулем passenger
  • Познакомимся с инструментами позволяющими оптимизировать работу (Vagrant, knife, berfshell)
  • Познакомимся с понятиями Роли(roles) и переменное окружение(environments)

Репозитарий рецептов текущей лабораторной работы chef cookbooks shop

Задача: Используя devops подходы развернуть партнерский интернет магазин на 2х серверах.

  • Сервер db - работает под percona server версии 5.6
  • Сервер backend - работает под управление Ruby on Rails приложения

Шаг 1

Для старта нам потребуется создать аккаунт и пополнить его удобным для Вас способом на 50р(минимальный платеж). Для упрощения работы Мы разместим свой публичный ключ для авторизации на новых серверах по ключу. ключ авторизации

Шаг 2

Создаем свой первый cloud vds сервер Ubuntu 14.04 64bit и устанавливаем оплату по часам. (По окончанию работ мы сможем убить для экономии машину)
Создать виртуальный сервер

Через пару минут в панели управления серверами появится информация для доступа по ip от root + password. Пробуем зайти на сервер по ключу. Если вы видите приглашение ввести пароль значит при добавление ключа возникла ошибка или опечатка.

ssh-copy-id -i ~/.ssh/ваш_ключ.pub root@IP_SEVER
После авторизации на сервере скачиваем последние версии пакетов
  wget https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.2_x86_64.deb
  wget https://opscode-omnibus-packages.s3.amazonaws.com/ubuntu/12.04/x86_64/chefdk_0.5.1-1_amd64.deb
Страницы для поиска нужных версий
Chef SDK
Vagrant

Устанавливаем пакеты:build-essential, lxc, git-core и vim
apt-get update && apt-get install build-essential lxc git-core vim -y
Установить скаченные пакеты можно командой
dpkg -i *.deb

В качестве провайдера для vagrant будем использовать lxc контейнер. Настраиваем Vagrant для отладки своих рецептов. Установим плагины lxc и berkshelf для Vagrant.
vagrant plugin install vagrant-lxc
vagrant plugin install vagrant-berkshelf

Добавляем файл подкачки на 2Gb для предотвращения падения процесса сборки рецептов во время отладки на виртуальном сервера. 1Gb ОЗУ может не хватить.
dd if=/dev/zero of=/swapfile bs=256M count=8
chown root:root /swapfile
chmod 0600 /swapfile
mkswap /swapfile
swapon /swapfile

Создаем вспомогательные каталоги для разработки наших рецептов.
mkdir cookbooks roles data_bags environments
Поздравляем! Development среда для создания Вашего первого рецепта готова.

Шаг 3: Создаем переменное окружение для development

Логически мы разделили сервера нашего приложение на 2 роли (db и backend). Взаимодействие между компонентами будет проходит через сеть. В среде разработчика это будет одна машина и бекенд будет подключатся по локальному ip 127.0.0.1. Определим ip адреса используемые в нашей системе для development окружения
создаем файл environments/development.json
{
  "name": "development",
  "description": "",
  "cookbook_versions": {

  },
  "json_class": "Chef::Environment",
  "chef_type": "environment",
  "default_attributes": {
                "shop_hosts": { "hosts" :  {
                                  "db1": "127.0.0.1",
                                  "back1": "127.0.0.1"
                                            }
				  }
                      },
  "override_attributes": {

  }
}
Для создание ролей можно воспользоваться командой
EDITOR=vim knife environment create development
В зависимости от настроек вашей системы роль будет загружена на chef server или будет показана ошибка. После редактирования можно сохранить данные в файл принудительно

Шаг 4: Создаем первый рецепт для установки percona mysql

knife cookbook create  db_mysql -o ./cookbooks/
EDITOR=vim knife role create db_server
За основу рецепта для поднятия базы данных мы возьмем рецепт из супермаркета chef-precona.
в файле db_mysql/attributes/default.rb определяем настройки для базы данных
 default["percona"]["server"]["bind_address"] ='*'
 default["myshop"]["password"] ='shopmy'
 default["myshop"]["user"] ='myshop'

Основная последовательность действий описана в файле cookbooks/db_mysql/recipes/default.rb
percona = node["percona"] 
server  = percona["server"] 
conf    = percona["conf"] 
mysqld  = (conf && conf["mysqld"]) || {} 
 
datadir           = mysqld["datadir"] || server["datadir"] 
passwords = EncryptedPasswords.new(node, node["percona"]["encrypted_data_bag"]) 
 
node.set["percona"]["use_chef_vault"] = false 
 
include_recipe "percona::server" 
 
execute "prepare_sql_dump" do 
  cwd '/usr/local/src/'  
 #command "zcat  /usr/local/src/partner.sql.gz  >  /usr/local/src/partner.sql && sed -i  's/TYPE=MyISAM//g' /usr/local/src/partner.sql && iconv -f cp1251 -t utf8 -c /usr/local/src/partner.sql > /usr/local/src/partner_utf8.sql" 
  command "zcat  /usr/local/src/partner.sql.gz  >  /usr/local/src/partner_utf8.sql" 
  action :nothing 
end 
 
 
 
remote_file "/usr/local/src/partner.sql.gz" do 
#  source "http://my-shop.ru/_files/prices/partner.sql.gz" 
  source "http://www.fkis.ru/system/myshop_dump.sql.gz" 
  not_if { File.exists?("/usr/local/src/partner.sql.gz") } 
  notifies :run, 'execute[prepare_sql_dump]', :immediately 
end 

remote_file "/usr/local/src/partner.sql.gz" do
#  source "http://my-shop.ru/_files/prices/partner.sql.gz"
  source "http://www.fkis.ru/system/myshop_dump.sql.gz"
  not_if { File.exists?("/usr/local/src/partner.sql.gz") }
  notifies :run, 'execute[prepare_sql_dump]', :immediately
end

template "/usr/local/src/myshop.sql" do
  owner "root"
  group "root"
  mode "0600"
  source "myshop_db.sql.erb"
  sensitive true
end

execute "mysql-add-shopuser" do
    command "/usr/bin/mysql -uroot -p'#{passwords.root_password}' -e 'SOURCE  /usr/local/src/myshop.sql; use myshop; SOURCE /usr/local/src/partner_utf8.sql;' && rm /usr/local/src/partner_utf8.sql"
    subscribes :run, resources("template[/usr/local/src/myshop.sql]"), :immediately
    only_if { File.exists?("/usr/local/src/partner_utf8.sql") }
end





ВАЖНО: Для корректной работы рецепта требуется определить пароль для root и системного пользователя debian-sys-maint
Для этого нам нужно создать файл секрет используемый для шифрования data_bag файлов
mkdir .chef
openssl rand -base64 512 | tr -d '\r\n' > .chef/encrypted_data_bag_secret
chef gem install knife-solo_data_bag
EDITOR=vim knife solo data bag create passwords root --secret-file .chef/encrypted_data_bag_secret

Содежимое файла root.json до шифрования
{
  "id": "root",
  "root_password": "123456"
}
и после шифрования
{
  "id": "root",
  "root_password": {
    "encrypted_data": "eqbEVlXbMy5CUbx7siZb53y3ytwWRFTIX7JlXgE2mRE=\n",
    "iv": "D5Zeras2tZuwSSG3ZG0z9A==\n",
    "version": 1,
    "cipher": "aes-256-cbc"
  }
}
Создаем Vagrant файл примерным содержимым
Vagrant.configure(2) do |config|
  config.vm.box = "fgrehm/trusty64-lxc"
  config.vm.provision :chef_zero do |chef|
   chef.log_level = :info
   chef.cookbooks_path = "cookbooks"
   chef.encrypted_data_bag_secret_key_path = ".chef/encrypted_data_bag_secret"
   chef.roles_path = "roles"
   chef.data_bags_path = "data_bags"
   chef.environments_path = "environments"
   chef.environment = "development"
   chef.add_recipe "hosts_shop"
   chef.add_role "db_server"
 end 
end

Для отладки рецепта выполняем команду первый запуск
vagrant up
Перезапуск сборки рецепта
vagrant provision

Шаг 4

Загружаем рецепт на Chef-Server

knife environment from file environments/production.json
knife role from file roles/db_server.json
knife data bag create passwords  --secret-file ~/.chef/encrypted_data_bag_secret
knife data bag from file passwords -a
berks install
berks upload


Делаем первичную инициализацию сервера базы данных
knife bootstrap 85.143.217.191 -x root -E production -r 'role[db_server]' --secret-file .chef/encrypted_data_bag_secret

Продолжение следует...
В следующей части мы настроем backend и запустим свой интернет магазин в облаках ))

Вам может понравиться