Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Ansible make

142 views

Published on

Make всем хорош, кроме того, что времени писать на нем нет, доклад явно топит за ansible
https://www.youtube.com/watch?v=MwkTKwhQqaE

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

Ansible make

  1. 1. От Make к Ansible 31.05.2016 Хрусталев Юрий при участии Ивана Гришаева
  2. 2. О чем это? Как-то раз нас попросили автоматизировать деплой приложения для одной операционной команды. Очень консервативной операционной команды. — мы заменим тебя этим роботом. — а что он умеет делать? — ничего
  3. 3. История вопроса, требования ● Создать ифраструктуру в облаке AWS (VPC, EC2, Security Groups) ● Установить кластер приложений на Docker ● Создать базы данных ● Настроить маршрутизации между [микро]сервисами ● Настроить пользователей Сделать все как можно проще и без новых технологий
  4. 4. Попытка №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
  5. 5. Попытка №1: (Make, AWS CLI, AWS ECS) ● Запускаем с компьютера [Dev]Ops инженера ○ У него должны быть все зависиммости (AWS CLI, psql) ○ Ключи в правильных местах ~/.aws/ ~/.ssh ● Пишем много json конфигов для разных сервисов ● Пишем длинные Make файлы ○ make setup-vpc ○ make setup-ec2 ○ make setup-rds
  6. 6. Попытка №1: Итоги ● Конфигурационные файлы для хранение промежуточных состояния ● Нет возможности управлять более чем одним кластером ● Описание документации занимает 6 экранов ● Все еще много ручного труда ○ Служебные пользователи ○ Чтение runtime данных из AWS (ips, hostnames) ○ awscli профиль ● Повышенные требования к машине исполнения скриптов
  7. 7. Попытка №2: (Make, CloudFormation, AWS ECS) ● CloudFromation хорошо умеет ○ EC2/VPC/SecurityGroups ○ RDS ● Не умеет ECS и уровень приложения ○ Обновления трактует как “убить” и “создать” ○ Лимитированное скриптование ○ Везде добавляет авто-генерированные имена (Name: aws-RDS-HRdj2ey) ● Make
  8. 8. Попытка №2: Итоги ● Скрипты и make файл стали поменьше ● Результаты CloudFormation тоже нужно переносить в конфиги ● Все еще нет возможности управлять более чем одним кластером ● Описание документации занимает 6 экранов ● Бонус ad-hock команды ○ ansible all -a "rm -rf /"
  9. 9. Какие могут быть альтернативы Make ● ant/maven - java ● grunt/gulp/npm - node ● shell/bash - хватит это терпеть! ● puppet - не умеет push, ruby, не умеет локально ● chef - он говно (с) https://telegram.me/devops_ru ● saltstack - ???
  10. 10. Попытка №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
  11. 11. Попытка №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", ] }
  12. 12. Попытка №3: (Ansible, CloudFormation) [app-nodes] 52.76.1.1 52.77.1.2 [docker-nodes:children] app-nodes [ec2:children] app-nodes [localhost] # Ваша машина 127.0.0.1 ansible_python_interpreter=python
  13. 13. Попытка №3: (Ansible, CloudFormation) ● Избавились от ECS ○ Docker-compose ○ Systemd ○ Amazon Linux -> Debian8 ● Все сводится к ○ Раскладыванию темплейтов ○ Запуску сервисов
  14. 14. Попытка №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
  15. 15. Попытка №3: Итоги ● Все хранится в git ● Множество ролей ○ users ○ console utils ○ app cloudformation ○ app packages ○ app configs ○ app dbsetup
  16. 16. Попытка №3: Итоги # 1. Setup EC2 node layer ansible-playbook servers.yml --limit localhost --tags cf --extra-vars "cf_create=true" # 2. setup DB ansible-playbook servers.yml --limit localhost --tags cf --extra-vars="cf_db_setup=true" # 3. setup EC2 nodes, run with configured key ansible-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"
  17. 17. Попытка №3: Итоги ● Возможность управлять несколькими кластерами ├── ansible.cfg ├── ansible.requirements.yml ├── group_vars │ ├── all.yml │ ├── app.yml ├── inventories │ ├── hosts ├── library <<< общий код │ ├── role1/ │ ├── role2/ │ ├── ... ├── servers.yml
  18. 18. Попытка №3: Итоги ● Документация перетекла в код ● Роли можно переиспользовать ● Промежуточное состояние хранится в git ● Привязка к AWS не жесткая, есть возможность использоватьдругой хостинг
  19. 19. Немного цифр ● Время установки кластера - 15 минут ○ из них Cloud Formation - 10 минут ○ при учете запуска скриптов в той же локации ● Обновление одного компонента занимает порядка 2х минут ● 9 ролей написано для проекта ○ 6 из них общего назначения - будет использовать в других местах ● 5 ролей взято в ansible.galaxy ● Миграция на Ansible заняла две человеко-недели
  20. 20. Вопросы?

×