Текущие реалии требуют умение управлять большим количеством серверов. С ростом популярности облачного хостинга большое количество серверов может быть не только физическими но и виртуальными.
Для внедрения методологии 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. Пробуем зайти на сервер по ключу. Если вы видите приглашение ввести пароль значит при добавление ключа возникла ошибка или опечатка.
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
В качестве провайдера для 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
Создаем вспомогательные каталоги для разработки наших рецептов.
Шаг 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": { } }
Шаг 4: Создаем первый рецепт для установки percona mysql
knife cookbook create db_mysql -o ./cookbooks/
EDITOR=vim knife role create db_server
в файле 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
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.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
Для отладки рецепта выполняем команду первый запуск
Шаг 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
Делаем первичную инициализацию сервера базы данных
Продолжение следует...
В следующей части мы настроем backend и запустим свой интернет магазин в облаках ))