От make к ansible
TRANSCRIPT
От Make к Ansible31.05.2016 Хрусталев Юрийпри участии Ивана Гришаева
О чем это?Как-то раз нас попросили автоматизировать деплой приложения для одной операционной команды. Очень консервативной операционной команды.
— мы заменим тебя этим роботом.— а что он умеет делать?— ничего
История вопроса, требования● Создать ифраструктуру в облаке AWS (VPC, EC2, Security Groups)● Установить кластер приложений на Docker● Создать базы данных● Настроить маршрутизации между [микро]сервисами● Настроить пользователей● Сделать все как можно проще и без новых технологий
Попытка №1: Make?● Определенный уровень кросплатформенности *nix (mv/cp/ls/grep)● Работа с переменными окружения
|> CERT_NAME=staging-cert make upload-cert
● Проверки условий|PIP_REQ := requirements.txt|tools-setup: $(PIP_REQ)| virtualenv env| env/bin/pip install -U -r (PIP_REQ)
● Каскады вызова|setup-rds: tools-setup| ./createdb.sh
Попытка №1: (Make, AWS CLI, AWS ECS)● Запускаем с компьютера [Dev]Ops инженера
○ У него должны быть все зависиммости (AWS CLI, psql)○ Ключи в правильных местах ~/.aws/ ~/.ssh
● Пишем много json конфигов для разных сервисов● Пишем длинные Make файлы
○ make setup-vpc○ make setup-ec2○ make setup-rds○ make setup-application
● Промежуточные состояния○ Хранение общего описания системы
● ECS○ Amazon Linux
Попытка №1: Итоги● Конфигурационные файлы для хранение промежуточных состояния● Нет возможности управлять более чем одним кластером● Описание документации занимает 6 экранов● Все еще много ручного труда
○ Служебные пользователи○ Чтение runtime данных из AWS (ips, hostnames)○ awscli профиль
● Повышенные требования к машине исполнения скриптов○ Либы/конфиги
● Завязка на Amazon Linux● Управление ECS только через UI
Попытка №2: (Make, CloudFormation, AWS ECS)● CloudFromation хорошо умеет
○ EC2/VPC/SecurityGroups○ RDS
● Не умеет ECS и уровень приложения○ Обновления трактует как “убить” и “создать”○ Лимитированное скриптование○ Везде добавляет авто-генерированные имена (Name: aws-RDS-HRdj2ey)
● Make○ make setup-vpc-stack○ make setup-db-schema○ make setup-application-stack
Попытка №2: Итоги● Скрипты и make файл стали поменьше● Результаты CloudFormation тоже нужно переносить в конфиги● Все еще нет возможности управлять более чем одним кластером● Описание документации занимает 6 экранов● Бонус ad-hock команды
○ ansible all -a "rm -rf /"
Какие могут быть альтернативы Make● ant/maven - java● grunt/gulp/npm - node● shell/bash - хватит это терпеть!● puppet - не умеет push, ruby, не умеет локально● chef - он говно (с) https://telegram.me/devops_ru● saltstack - ???
Попытка №3: (Ansible, CloudFormation)● Обернули CloudFormation в Ansible
○ Официальная поддержка AWS○ Можно указать ключи доступа в конфиге, а не устанавливать их в системный профиль○ Умеет выполнять таски локально (и это конфигурируется)○ Промежуточное состояние теперь хранится в конфиге Ansible
cloudformation: stack_name: app-vpc-stack aws_access_key: xxx aws_secret_key: xxx state: present template: files/stack.json template_parameters: ParamEc2KeyName: admin-user
Попытка №3: (Ansible, CloudFormation)- shell: aws cloudformation describe-stacks --stack-name app-vpc-stack | describe.py register: describe_stack environment: AWS_ACCESS_KEY_ID: xxx AWS_SECRET_ACCESS_KEY:'xxx args: chdir: '{{ playbook_dir }}/../library/cf-role/tools'- debug: msg: '{{describe_stack.stdout_lines}}'
ok: [127.0.0.1] => { "msg": [ "Database: apphost.rds.amazonaws.com", "EC App node IPs:", " 52.76.1.1", " 52.77.1.2", "HTTP Load Balancer: lb2124477784.elb.amazonaws.com", ]}
Попытка №3: (Ansible, CloudFormation)[app-nodes]52.76.1.152.77.1.2
[docker-nodes:children]app-nodes
[ec2:children]app-nodes
[localhost]# Ваша машина127.0.0.1 ansible_python_interpreter=python
Попытка №3: (Ansible, CloudFormation)● Избавились от ECS
○ Docker-compose○ Systemd○ Amazon Linux -> Debian8
● Все сводится к ○ Раскладыванию темплейтов○ Запуску сервисов
Попытка №3: (Ansible, CloudFormation)● Настройка пользователей через Ansible
○ pg8000 - pure python postgreql driver
- name: Create application user/db command: > ./create-sql-user-database.py --user {{cf_rds_master_user}} --password {{cf_rds_master_password}} --host {{cf_rds_hostname}} --port {{cf_rds_db_port}} --database {{cf_rds_db_name}} --app-db-name {{cf_app_db_name}} --app-db-user {{cf_app_db_user}} --app-db-password {{cf_app_db_password}} args: chdir: '{{ playbook_dir }}/../library/cf/tools' when: cf_db_setup
Попытка №3: Итоги● Все хранится в git● Множество ролей
○ users○ console utils○ app cloudformation○ app packages○ app configs○ app dbsetup○ app users setup
● Требования к машине управления свелись до Python/yaml/openssl○ Более никаких cp/ls/grep/awk/make, которые имеют разные ключи на разных системах
Попытка №3: Итоги# 1. Setup EC2 node layeransible-playbook servers.yml --limit localhost --tags cf --extra-vars "cf_create=true"
# 2. setup DBansible-playbook servers.yml --limit localhost --tags cf --extra-vars="cf_db_setup=true"
# 3. setup EC2 nodes, run with configured keyansible-playbook servers.yml --tags app --private-key admin-user.pem
# 4. Configure ansible-playbook servers.yml --tags app-manage --limit manage-nodes \
--extra-vars="app_migrate_db=true"ansible-playbook servers.yml --tags app-manage --limit manage-nodes \
--extra-vars="app_install_fixtures=true"ansible-playbook servers.yml --tags app-manage --limit manage-nodes\
--extra-vars="app_install_api_users=true"
Попытка №3: Итоги● Возможность управлять несколькими кластерами
├── ansible.cfg├── ansible.requirements.yml├── group_vars│ ├── all.yml│ ├── app.yml├── inventories│ ├── hosts├── library <<< общий код│ ├── role1/│ ├── role2/│ ├── ...├── servers.yml
Попытка №3: Итоги● Документация перетекла в код● Роли можно переиспользовать● Промежуточное состояние хранится в git● Привязка к AWS не жесткая, есть возможность использоватьдругой
хостинг
Немного цифр● Время установки кластера - 15 минут
○ из них Cloud Formation - 10 минут○ при учете запуска скриптов в той же локации
● Обновление одного компонента занимает порядка 2х минут● 9 ролей написано для проекта
○ 6 из них общего назначения - будет использовать в других местах
● 5 ролей взято в ansible.galaxy ● Миграция на Ansible заняла две человеко-недели
Вопросы?