SlideShare a Scribd company logo
Ansible
в мире меняющихся требований
Малиновский Дмитрий
Проект
↳ Высоконагруженная RTB-система
↳ Appnode - Java, Glassfish
↳ DB - Aerospike
↳ Baremetal серверы
↳ Удаленная команда сисадминов
↳ production: 5 Appnode + 1 Aerospike, ~50k rps
↪ integration
↳ Деплой одного adserver > 30 минут
↪ Каждый раз все зависимости скачивались заново
↪ копировались на все машины
↪ Ansible использовался только как обертка над ssh
↳ Деплой сложен, сборка tar.gz со всеми зависимостями (java, glassfish,…)
↳ Тяжело менять/добавлять компоненты деплоя
Что было
↳ production: 2 кластера из 5 Appnode + 1 Aerospike, ~125k rps
↪ integration
↪ qa
↪ performance
↳ Деплой одного adserver < 2 минут
↳ Деплой с помощью RPM пакетов
↳ Очень просто адаптировать деплой
Что стало?
↳ Частые изменения окружений:
↪ смена ip, hostname
↪ новые окружения: perf, stg, qa, …
↳ Рефакторинг:
↪ file-based configuration -> zookeeper
↪ Glassfish -> netty
↳ Удаленная команда с доступом на prod
↳ Бизнес-цели:
↪ интеграция с новыми партнерами
↪ zero-downtime deployment
Проблемы
Ansible
to the rescue
or not
Что такое Ansible?
↳ agentless cm+orchestration+deployment tool
↪ python
↪ ssh
↪ ***magic***
↳ Easy to start
↳ Hard to master
↳ bit.ly/ansiblestart
Установка
На управляющем хосте
$ pip install ansible
На управляемые хосты ничего устанавливать не
надо!
bit.ly/ansiblebest
Задание списка управляемых хостов
↳ Текстовый файл (inventory)
↳ Скрипт
↪ Cobbler
↪ Digital Ocean
↪ EC2
↪ OpenStack
↪ Vagrant
↪ многие другие
bit.ly/ansiblebest
Inventory
[appnode]
host1
host2 ansible_ssh_port=1234
[db]
host3
Inventory-файл по-умолчанию: /etc/ansible/hosts
Другие inventory-файлы можно указывать с помощью
$ANSIBLE_HOSTS и опции -i
bit.ly/ansiblebest
Variables
[appnode]
host1 timeout=50
host2 ansible_ssh_port=1234
[appnode:vars]
timeout = 1000
bit.ly/ansiblebest
Variables
group_vars/main.yml
appnode.yml
db.yml
host_vars/main.yml
host1.yml
host2.yml
host3.yml
bit.ly/ansiblebest
Facts
Переменные, определенные на управляемых хостах
↳ ansible_architecture: x86_64
↳ ansible_devices: [{“sda”: {...}}, {“sdb”: {...}}]
↳ ansible_distribution: Ubuntu
↳ ansible_os_family: Debian
↳ ansible_processor_count: 8
bit.ly/ansiblebest
Modules
↳ template: отрендерить шаблон и положить на управляемый хост
↳ copy: скопировать файл на управляемый хост
↳ git: управление копией репозитория
↳ archive: упаковка и распаковка архивов
↳ shell: исполнение произвольных команд
↳ Всего более 250 модулей
bit.ly/ansiblebest
Команда ansible
Позволяет выполнить простую задачу на группах серверов
$ ansible appnode -m ping
host1 | success >> {
"changed": false,
"ping": "pong"
}
host2 | success >> {
"changed": false,
"ping": "pong"
}
bit.ly/ansiblebest
Команда ansible
$ ansible appnode -m service -a “name=nginx state=restarted”
host1 | success >> {
"changed": True,
"name": "nginx",
"state": "restarted",
}
host2 | success >> {
"changed": True,
"name": "nginx",
"state": "restarted",
}
bit.ly/ansiblebest
Playbook
---
- hosts: appnode
tasks:
- service: name=nginx state=started
$ ansible-playbook playbook.yml
bit.ly/ansiblebest
Include
---
- hosts: appnode
tasks:
- include: path/to/other/tasks.yml
roles:
- role: appnode
- include: otherplaybook.yml
bit.ly/ansiblebest
Handlers
---
- hosts: appnode
handlers:
- name: restart nginx
service: name=nginx state=restarted
tasks:
- template: src=appnode.j2 dest=/etc/nginx/conf.d/appnode.conf
notify: restart nginx
bit.ly/ansiblebest
Register & when
---
- hosts: appnode
tasks:
- stat: path=/var/lib/redis/mydb.aof
register: mydbst
- shell: echo ‘mydb.aof exists`
when: mydbst.stat.exists
bit.ly/ansiblebest
Шаблонизатор: jinja2
---
- hosts: appnode
vars:
servicename: appnode
workdir: /home/app
user: app
group: app
tasks:
- service: name={{ servicename }} state=started
- file: path={{ workdir }} owner={{ user }} group={{ group }}
bit.ly/ansiblebest
Role
---
- hosts: appnode
roles:
- role: appnode
roles/appnode/
tasks/main.yml
defaults/...
vars/...
files/...
templates/...
handlers/...
bit.ly/ansiblebest
Окружения
inventory/
production
integration
qa
performance
$ ansible-playbook -i inventory/production deploy.yml
Окружения: проблемы
↳ Список серверов “захардкожен” в inventory
↪ политика именования веток в deploy-репозитории - по версиям
↳ ini-like формат inventory не позволяет хранить сложные структуры в
переменных, что приводит к
inventory/production/hosts
group_vars/
↳ Отсутствие single point of truth
↪ salt-master/chef-server/puppet-server
↪ aws: 169.254.169.254
Переменные: проблемы
↳ Существует 15(!) способов определить переменную
↳ yaml + jinja = боль
↪ name: {{ othervar }} # ka-boom!
↪ name: ‘{{ othervar }}’
↳ Нельзя просто создать факт в playbook
↪ set_fact создает временную переменную
↪ Официальный ответ - создавать файл в /etc/ansible/facts.d
Решения:
↳ Локализовывать переменные в месте их использования
↳ Переменные, зависящие от окружения выносить в inventory
↳ Сложные структуры использовать по минимуму
Переменные: проблемы
↳ inventory
↪ host key=value
↪ [group:vars]
↳ inventory/group_vars
↳ inventory/host_vars
↳ group_vars
↳ host_vars
↳ register
↳ include_vars module
↳ playbook
↪ vars
↪ vars_files
↳ role/defaults
↳ role/vars
↳ set_fact module
↳ facts
↳ include: tasks.yml
key: value
Playbook: проблемы
↳ ansible-playbook -i prod deploy.yml --tags appnode или
ansible-playbook -i prod appnode.yml --tags deploy?
↳ Директива hosts, привязывающая действия к хостам = нет
универсальных playbook-ов
↳ Как часть задач из одного playbook включить в другой playbook?
Решения:
↳ Минимизация playbook-ов:
↪ включать только роли
↳ Каждый playbook делает одно простое действие
↪ появление оберток
ansible-playbook -i inventory/prod deploy.yml --tags glassfish,appnpde
deploy prod glassfish,appnode
Role: проблемы
↳ По документации, роль - способ выделения абстракций (app, db,
balancer)
↳ Фактически - возможность задавать относительные пути
↪ template: src=/path/to/templates/mytmpl.j2
↪ template: src=mytmpl.j2
↳ Для разрешения сложных зависимостей между ролями приходится
изобретать велосипед
Решения:
↳ Отходить от “best practices”:
↪ roles/appnode/{tasks,templates,files,...}
↪ roles/appnode/build/{tasks,templates,files,...}
roles/appnode/install/{tasks,templates,files,...}
roles/appnode/configure/{tasks,templates,files,...}
Customizing work with git
↳ git: repo=git://ourrepo branch=changeset-123 больше не работает :(
↪ git module вытягивает только refs/heads и refs/tags
↪ changeset-123 == refs/changeset/123
↳ git fetch ssh://gerrit/repo refs/changeset/123 &&
git checkout FETCH_HEAD
↳ shell: to the rescue!
Ansible: backwards compatibility
↳ Обновление с 1.5.4 на 1.7.x поломало модуль copy
↳ include role with_items: deprecated & unsupported
↪ “потому что мы не можем загрузить все созданные переменные”
Заключение
↳ Ansible - чаще обертка над bash+pssh, чем CM tool
↳ Понятия часто расходятся с реальностью
↳ Сложно разработать процесс, не укладывающийся в
рамки “best practices”
Тем не менее,
↳ “it works”
↳ проблемы решаемы в обозримое время
↳ структура, продуманная один раз, применима для
(почти) любых новых проектов
↳ админы любят :)
Спасибо за внимание!
Вопросы?

More Related Content

What's hot

Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Ontico
 
Консольные приложения на Go
Консольные приложения на GoКонсольные приложения на Go
Консольные приложения на Go
Andrey Smirnov
 
Анатомия веб-сервиса (РИТ-2014)
Анатомия веб-сервиса (РИТ-2014)Анатомия веб-сервиса (РИТ-2014)
Анатомия веб-сервиса (РИТ-2014)Andrey Smirnov
 
Загрузка, обработка, хранение и отдача статики
Загрузка, обработка, хранение и отдача статикиЗагрузка, обработка, хранение и отдача статики
Загрузка, обработка, хранение и отдача статикиKirill Mokevnin
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
Badoo Development
 
CI/CD-приложений на Tarantool: от пустого репозитория — до продакшна
CI/CD-приложений на Tarantool: от пустого репозитория — до продакшнаCI/CD-приложений на Tarantool: от пустого репозитория — до продакшна
CI/CD-приложений на Tarantool: от пустого репозитория — до продакшна
Mail.ru Group
 
Highload 2014. PostgreSQL: ups, DevOps.
Highload 2014. PostgreSQL: ups, DevOps.Highload 2014. PostgreSQL: ups, DevOps.
Highload 2014. PostgreSQL: ups, DevOps.
Alexey Lesovsky
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...
Ontico
 
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
 Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт... Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
Ontico
 
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...Ontico
 
04 web server_deployment_ru
04 web server_deployment_ru04 web server_deployment_ru
04 web server_deployment_ru
mcroitor
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
SmartTools
 
Streaming replication in practice
Streaming replication in practiceStreaming replication in practice
Streaming replication in practice
Alexey Lesovsky
 
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Ontico
 
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Ontico
 
High Availability в жизни обычного разработчика
High Availability в жизни обычного разработчикаHigh Availability в жизни обычного разработчика
High Availability в жизни обычного разработчика
Sumy PHP User Grpoup
 
07 virtual hosts_ru
07 virtual hosts_ru07 virtual hosts_ru
07 virtual hosts_ru
mcroitor
 
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (..."Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
AvitoTech
 
Архитектура хранения фотографий в Badoo
Архитектура хранения фотографий в BadooАрхитектура хранения фотографий в Badoo
Архитектура хранения фотографий в Badoo
Badoo Development
 

What's hot (20)

Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
 
Консольные приложения на Go
Консольные приложения на GoКонсольные приложения на Go
Консольные приложения на Go
 
Анатомия веб-сервиса (РИТ-2014)
Анатомия веб-сервиса (РИТ-2014)Анатомия веб-сервиса (РИТ-2014)
Анатомия веб-сервиса (РИТ-2014)
 
Загрузка, обработка, хранение и отдача статики
Загрузка, обработка, хранение и отдача статикиЗагрузка, обработка, хранение и отдача статики
Загрузка, обработка, хранение и отдача статики
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
 
Chef
ChefChef
Chef
 
CI/CD-приложений на Tarantool: от пустого репозитория — до продакшна
CI/CD-приложений на Tarantool: от пустого репозитория — до продакшнаCI/CD-приложений на Tarantool: от пустого репозитория — до продакшна
CI/CD-приложений на Tarantool: от пустого репозитория — до продакшна
 
Highload 2014. PostgreSQL: ups, DevOps.
Highload 2014. PostgreSQL: ups, DevOps.Highload 2014. PostgreSQL: ups, DevOps.
Highload 2014. PostgreSQL: ups, DevOps.
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...
 
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
 Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт... Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
 
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
 
04 web server_deployment_ru
04 web server_deployment_ru04 web server_deployment_ru
04 web server_deployment_ru
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
 
Streaming replication in practice
Streaming replication in practiceStreaming replication in practice
Streaming replication in practice
 
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
 
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
 
High Availability в жизни обычного разработчика
High Availability в жизни обычного разработчикаHigh Availability в жизни обычного разработчика
High Availability в жизни обычного разработчика
 
07 virtual hosts_ru
07 virtual hosts_ru07 virtual hosts_ru
07 virtual hosts_ru
 
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (..."Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
 
Архитектура хранения фотографий в Badoo
Архитектура хранения фотографий в BadooАрхитектура хранения фотографий в Badoo
Архитектура хранения фотографий в Badoo
 

Similar to Thumbtack Expertise Days # 5 - Ansible

Как приручить проектное окружение. PHP UG Minsk, июнь'2014
Как приручить проектное окружение. PHP UG Minsk, июнь'2014Как приручить проектное окружение. PHP UG Minsk, июнь'2014
Как приручить проектное окружение. PHP UG Minsk, июнь'2014kamazee
 
От Make к Ansible
От Make к AnsibleОт Make к Ansible
От Make к Ansible
Ivan Grishaev
 
Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Nikita Borzykh
 
Percona XtraBackup: экспертные возможности (Алексей Копытов)
Percona XtraBackup: экспертные возможности (Алексей Копытов)Percona XtraBackup: экспертные возможности (Алексей Копытов)
Percona XtraBackup: экспертные возможности (Алексей Копытов)Ontico
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Ontico
 
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Ruby Meditation
 
Михаил Юматов: SaltStack
Михаил Юматов: SaltStackМихаил Юматов: SaltStack
Михаил Юматов: SaltStackit-people
 
Docker
DockerDocker
«​Масштабируемый DevOps​» Александр Колесень
«​Масштабируемый DevOps​» Александр Колесень«​Масштабируемый DevOps​» Александр Колесень
«​Масштабируемый DevOps​» Александр Колесень
IT Share
 
Масштабируемый DevOps
Масштабируемый DevOpsМасштабируемый DevOps
Масштабируемый DevOps
Minsk Linux User Group
 
Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.
Ontico
 
"OpenStack & Oracle — взболтать, но не смешивать". Сергей Филимонцев, Яндекс
"OpenStack & Oracle — взболтать, но не смешивать". Сергей Филимонцев, Яндекс"OpenStack & Oracle — взболтать, но не смешивать". Сергей Филимонцев, Яндекс
"OpenStack & Oracle — взболтать, но не смешивать". Сергей Филимонцев, Яндекс
Yandex
 
Дмитрий Перлов openSUSE Build Server: tips & tricks кросс-дистрибутивной сб...
Дмитрий Перлов openSUSE Build Server: tips & tricks кросс-дистрибутивной   сб...Дмитрий Перлов openSUSE Build Server: tips & tricks кросс-дистрибутивной   сб...
Дмитрий Перлов openSUSE Build Server: tips & tricks кросс-дистрибутивной сб...
Minsk Linux User Group
 
2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes
2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes
2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes
Омские ИТ-субботники
 
Application deployment & configuration management
Application deployment & configuration managementApplication deployment & configuration management
Application deployment & configuration managementAlexander Kirillov
 
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2rit2011
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 
Олесь Писаренко "Открываем Яндекс.Танк"
Олесь Писаренко "Открываем Яндекс.Танк"Олесь Писаренко "Открываем Яндекс.Танк"
Олесь Писаренко "Открываем Яндекс.Танк"
Yandex
 

Similar to Thumbtack Expertise Days # 5 - Ansible (20)

Как приручить проектное окружение. PHP UG Minsk, июнь'2014
Как приручить проектное окружение. PHP UG Minsk, июнь'2014Как приручить проектное окружение. PHP UG Minsk, июнь'2014
Как приручить проектное окружение. PHP UG Minsk, июнь'2014
 
От Make к Ansible
От Make к AnsibleОт Make к Ansible
От Make к Ansible
 
Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.
 
Percona XtraBackup: экспертные возможности (Алексей Копытов)
Percona XtraBackup: экспертные возможности (Алексей Копытов)Percona XtraBackup: экспертные возможности (Алексей Копытов)
Percona XtraBackup: экспертные возможности (Алексей Копытов)
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
 
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
 
Михаил Юматов: SaltStack
Михаил Юматов: SaltStackМихаил Юматов: SaltStack
Михаил Юматов: SaltStack
 
Docker
DockerDocker
Docker
 
«​Масштабируемый DevOps​» Александр Колесень
«​Масштабируемый DevOps​» Александр Колесень«​Масштабируемый DevOps​» Александр Колесень
«​Масштабируемый DevOps​» Александр Колесень
 
Масштабируемый DevOps
Масштабируемый DevOpsМасштабируемый DevOps
Масштабируемый DevOps
 
Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.
 
"OpenStack & Oracle — взболтать, но не смешивать". Сергей Филимонцев, Яндекс
"OpenStack & Oracle — взболтать, но не смешивать". Сергей Филимонцев, Яндекс"OpenStack & Oracle — взболтать, но не смешивать". Сергей Филимонцев, Яндекс
"OpenStack & Oracle — взболтать, но не смешивать". Сергей Филимонцев, Яндекс
 
Дмитрий Перлов openSUSE Build Server: tips & tricks кросс-дистрибутивной сб...
Дмитрий Перлов openSUSE Build Server: tips & tricks кросс-дистрибутивной   сб...Дмитрий Перлов openSUSE Build Server: tips & tricks кросс-дистрибутивной   сб...
Дмитрий Перлов openSUSE Build Server: tips & tricks кросс-дистрибутивной сб...
 
2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes
2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes
2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes
 
Приручаем linux-консоль
Приручаем linux-консольПриручаем linux-консоль
Приручаем linux-консоль
 
php frameworks
php frameworksphp frameworks
php frameworks
 
Application deployment & configuration management
Application deployment & configuration managementApplication deployment & configuration management
Application deployment & configuration management
 
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Олесь Писаренко "Открываем Яндекс.Танк"
Олесь Писаренко "Открываем Яндекс.Танк"Олесь Писаренко "Открываем Яндекс.Танк"
Олесь Писаренко "Открываем Яндекс.Танк"
 

Thumbtack Expertise Days # 5 - Ansible

  • 1. Ansible в мире меняющихся требований Малиновский Дмитрий
  • 2. Проект ↳ Высоконагруженная RTB-система ↳ Appnode - Java, Glassfish ↳ DB - Aerospike ↳ Baremetal серверы ↳ Удаленная команда сисадминов
  • 3. ↳ production: 5 Appnode + 1 Aerospike, ~50k rps ↪ integration ↳ Деплой одного adserver > 30 минут ↪ Каждый раз все зависимости скачивались заново ↪ копировались на все машины ↪ Ansible использовался только как обертка над ssh ↳ Деплой сложен, сборка tar.gz со всеми зависимостями (java, glassfish,…) ↳ Тяжело менять/добавлять компоненты деплоя Что было
  • 4. ↳ production: 2 кластера из 5 Appnode + 1 Aerospike, ~125k rps ↪ integration ↪ qa ↪ performance ↳ Деплой одного adserver < 2 минут ↳ Деплой с помощью RPM пакетов ↳ Очень просто адаптировать деплой Что стало?
  • 5. ↳ Частые изменения окружений: ↪ смена ip, hostname ↪ новые окружения: perf, stg, qa, … ↳ Рефакторинг: ↪ file-based configuration -> zookeeper ↪ Glassfish -> netty ↳ Удаленная команда с доступом на prod ↳ Бизнес-цели: ↪ интеграция с новыми партнерами ↪ zero-downtime deployment Проблемы
  • 7. Что такое Ansible? ↳ agentless cm+orchestration+deployment tool ↪ python ↪ ssh ↪ ***magic*** ↳ Easy to start ↳ Hard to master ↳ bit.ly/ansiblestart
  • 8. Установка На управляющем хосте $ pip install ansible На управляемые хосты ничего устанавливать не надо! bit.ly/ansiblebest
  • 9. Задание списка управляемых хостов ↳ Текстовый файл (inventory) ↳ Скрипт ↪ Cobbler ↪ Digital Ocean ↪ EC2 ↪ OpenStack ↪ Vagrant ↪ многие другие bit.ly/ansiblebest
  • 10. Inventory [appnode] host1 host2 ansible_ssh_port=1234 [db] host3 Inventory-файл по-умолчанию: /etc/ansible/hosts Другие inventory-файлы можно указывать с помощью $ANSIBLE_HOSTS и опции -i bit.ly/ansiblebest
  • 13. Facts Переменные, определенные на управляемых хостах ↳ ansible_architecture: x86_64 ↳ ansible_devices: [{“sda”: {...}}, {“sdb”: {...}}] ↳ ansible_distribution: Ubuntu ↳ ansible_os_family: Debian ↳ ansible_processor_count: 8 bit.ly/ansiblebest
  • 14. Modules ↳ template: отрендерить шаблон и положить на управляемый хост ↳ copy: скопировать файл на управляемый хост ↳ git: управление копией репозитория ↳ archive: упаковка и распаковка архивов ↳ shell: исполнение произвольных команд ↳ Всего более 250 модулей bit.ly/ansiblebest
  • 15. Команда ansible Позволяет выполнить простую задачу на группах серверов $ ansible appnode -m ping host1 | success >> { "changed": false, "ping": "pong" } host2 | success >> { "changed": false, "ping": "pong" } bit.ly/ansiblebest
  • 16. Команда ansible $ ansible appnode -m service -a “name=nginx state=restarted” host1 | success >> { "changed": True, "name": "nginx", "state": "restarted", } host2 | success >> { "changed": True, "name": "nginx", "state": "restarted", } bit.ly/ansiblebest
  • 17. Playbook --- - hosts: appnode tasks: - service: name=nginx state=started $ ansible-playbook playbook.yml bit.ly/ansiblebest
  • 18. Include --- - hosts: appnode tasks: - include: path/to/other/tasks.yml roles: - role: appnode - include: otherplaybook.yml bit.ly/ansiblebest
  • 19. Handlers --- - hosts: appnode handlers: - name: restart nginx service: name=nginx state=restarted tasks: - template: src=appnode.j2 dest=/etc/nginx/conf.d/appnode.conf notify: restart nginx bit.ly/ansiblebest
  • 20. Register & when --- - hosts: appnode tasks: - stat: path=/var/lib/redis/mydb.aof register: mydbst - shell: echo ‘mydb.aof exists` when: mydbst.stat.exists bit.ly/ansiblebest
  • 21. Шаблонизатор: jinja2 --- - hosts: appnode vars: servicename: appnode workdir: /home/app user: app group: app tasks: - service: name={{ servicename }} state=started - file: path={{ workdir }} owner={{ user }} group={{ group }} bit.ly/ansiblebest
  • 22. Role --- - hosts: appnode roles: - role: appnode roles/appnode/ tasks/main.yml defaults/... vars/... files/... templates/... handlers/... bit.ly/ansiblebest
  • 24. Окружения: проблемы ↳ Список серверов “захардкожен” в inventory ↪ политика именования веток в deploy-репозитории - по версиям ↳ ini-like формат inventory не позволяет хранить сложные структуры в переменных, что приводит к inventory/production/hosts group_vars/ ↳ Отсутствие single point of truth ↪ salt-master/chef-server/puppet-server ↪ aws: 169.254.169.254
  • 25. Переменные: проблемы ↳ Существует 15(!) способов определить переменную ↳ yaml + jinja = боль ↪ name: {{ othervar }} # ka-boom! ↪ name: ‘{{ othervar }}’ ↳ Нельзя просто создать факт в playbook ↪ set_fact создает временную переменную ↪ Официальный ответ - создавать файл в /etc/ansible/facts.d Решения: ↳ Локализовывать переменные в месте их использования ↳ Переменные, зависящие от окружения выносить в inventory ↳ Сложные структуры использовать по минимуму
  • 26. Переменные: проблемы ↳ inventory ↪ host key=value ↪ [group:vars] ↳ inventory/group_vars ↳ inventory/host_vars ↳ group_vars ↳ host_vars ↳ register ↳ include_vars module ↳ playbook ↪ vars ↪ vars_files ↳ role/defaults ↳ role/vars ↳ set_fact module ↳ facts ↳ include: tasks.yml key: value
  • 27. Playbook: проблемы ↳ ansible-playbook -i prod deploy.yml --tags appnode или ansible-playbook -i prod appnode.yml --tags deploy? ↳ Директива hosts, привязывающая действия к хостам = нет универсальных playbook-ов ↳ Как часть задач из одного playbook включить в другой playbook? Решения: ↳ Минимизация playbook-ов: ↪ включать только роли ↳ Каждый playbook делает одно простое действие ↪ появление оберток ansible-playbook -i inventory/prod deploy.yml --tags glassfish,appnpde deploy prod glassfish,appnode
  • 28. Role: проблемы ↳ По документации, роль - способ выделения абстракций (app, db, balancer) ↳ Фактически - возможность задавать относительные пути ↪ template: src=/path/to/templates/mytmpl.j2 ↪ template: src=mytmpl.j2 ↳ Для разрешения сложных зависимостей между ролями приходится изобретать велосипед Решения: ↳ Отходить от “best practices”: ↪ roles/appnode/{tasks,templates,files,...} ↪ roles/appnode/build/{tasks,templates,files,...} roles/appnode/install/{tasks,templates,files,...} roles/appnode/configure/{tasks,templates,files,...}
  • 29. Customizing work with git ↳ git: repo=git://ourrepo branch=changeset-123 больше не работает :( ↪ git module вытягивает только refs/heads и refs/tags ↪ changeset-123 == refs/changeset/123 ↳ git fetch ssh://gerrit/repo refs/changeset/123 && git checkout FETCH_HEAD ↳ shell: to the rescue!
  • 30. Ansible: backwards compatibility ↳ Обновление с 1.5.4 на 1.7.x поломало модуль copy ↳ include role with_items: deprecated & unsupported ↪ “потому что мы не можем загрузить все созданные переменные”
  • 31. Заключение ↳ Ansible - чаще обертка над bash+pssh, чем CM tool ↳ Понятия часто расходятся с реальностью ↳ Сложно разработать процесс, не укладывающийся в рамки “best practices” Тем не менее, ↳ “it works” ↳ проблемы решаемы в обозримое время ↳ структура, продуманная один раз, применима для (почти) любых новых проектов ↳ админы любят :)