От Make к Ansible

20
От Make к Ansible 31.05.2016 Хрусталев Юрий при участии Ивана Гришаева

Transcript of От Make к Ansible

Page 1: От Make к Ansible

От Make к Ansible31.05.2016 Хрусталев Юрийпри участии Ивана Гришаева

Page 2: От Make к Ansible

О чем это?Как-то раз нас попросили автоматизировать деплой приложения для одной операционной команды. Очень консервативной операционной команды.

— мы заменим тебя этим роботом.— а что он умеет делать?— ничего

Page 3: От Make к Ansible

История вопроса, требования● Создать ифраструктуру в облаке AWS (VPC, EC2, Security Groups)● Установить кластер приложений на Docker● Создать базы данных● Настроить маршрутизации между [микро]сервисами● Настроить пользователей● Сделать все как можно проще и без новых технологий

Page 4: От Make к Ansible

Попытка №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

Page 5: От Make к Ansible

Попытка №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

Page 6: От Make к Ansible

Попытка №1: Итоги● Конфигурационные файлы для хранение промежуточных состояния● Нет возможности управлять более чем одним кластером● Описание документации занимает 6 экранов● Все еще много ручного труда

○ Служебные пользователи○ Чтение runtime данных из AWS (ips, hostnames)○ awscli профиль

● Повышенные требования к машине исполнения скриптов○ Либы/конфиги

● Завязка на Amazon Linux● Управление ECS только через UI

Page 7: От Make к Ansible

Попытка №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

Page 8: От Make к Ansible

Попытка №2: Итоги● Скрипты и make файл стали поменьше● Результаты CloudFormation тоже нужно переносить в конфиги● Все еще нет возможности управлять более чем одним кластером● Описание документации занимает 6 экранов● Бонус ad-hock команды

○ ansible all -a "rm -rf /"

Page 9: От Make к Ansible

Какие могут быть альтернативы Make● ant/maven - java● grunt/gulp/npm - node● shell/bash - хватит это терпеть!● puppet - не умеет push, ruby, не умеет локально● chef - он говно (с) https://telegram.me/devops_ru● saltstack - ???

Page 10: От Make к Ansible

Попытка №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

Page 11: От Make к Ansible

Попытка №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", ]}

Page 12: От Make к Ansible

Попытка №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

Page 13: От Make к Ansible

Попытка №3: (Ansible, CloudFormation)● Избавились от ECS

○ Docker-compose○ Systemd○ Amazon Linux -> Debian8

● Все сводится к ○ Раскладыванию темплейтов○ Запуску сервисов

Page 14: От Make к Ansible

Попытка №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

Page 15: От Make к Ansible

Попытка №3: Итоги● Все хранится в git● Множество ролей

○ users○ console utils○ app cloudformation○ app packages○ app configs○ app dbsetup○ app users setup

● Требования к машине управления свелись до Python/yaml/openssl○ Более никаких cp/ls/grep/awk/make, которые имеют разные ключи на разных системах

Page 16: От Make к Ansible

Попытка №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"

Page 17: От Make к Ansible

Попытка №3: Итоги● Возможность управлять несколькими кластерами

├── ansible.cfg├── ansible.requirements.yml├── group_vars│ ├── all.yml│ ├── app.yml├── inventories│ ├── hosts├── library <<< общий код│ ├── role1/│ ├── role2/│ ├── ...├── servers.yml

Page 18: От Make к Ansible

Попытка №3: Итоги● Документация перетекла в код● Роли можно переиспользовать● Промежуточное состояние хранится в git● Привязка к AWS не жесткая, есть возможность использоватьдругой

хостинг

Page 19: От Make к Ansible

Немного цифр● Время установки кластера - 15 минут

○ из них Cloud Formation - 10 минут○ при учете запуска скриптов в той же локации

● Обновление одного компонента занимает порядка 2х минут● 9 ролей написано для проекта

○ 6 из них общего назначения - будет использовать в других местах

● 5 ролей взято в ansible.galaxy ● Миграция на Ansible заняла две человеко-недели

Page 20: От Make к Ansible

Вопросы?