32
Ansible в мире меняющихся требований Малиновский Дмитрий

Thumbtack Expertise Days # 5 - Ansible

Embed Size (px)

Citation preview

Page 1: Thumbtack Expertise Days # 5 - Ansible

Ansibleв мире меняющихся требований

Малиновский Дмитрий

Page 2: Thumbtack Expertise Days # 5 - Ansible

Проект

↳ Высоконагруженная RTB-система

↳ Appnode - Java, Glassfish

↳ DB - Aerospike

↳ Baremetal серверы

↳ Удаленная команда сисадминов

Page 3: Thumbtack Expertise Days # 5 - Ansible

↳ production: 5 Appnode + 1 Aerospike, ~50k rps

↪ integration

↳ Деплой одного adserver > 30 минут

↪ Каждый раз все зависимости скачивались заново↪ копировались на все машины↪ Ansible использовался только как обертка над ssh

↳ Деплой сложен, сборка tar.gz со всеми зависимостями (java, glassfish,…)

↳ Тяжело менять/добавлять компоненты деплоя

Что было

Page 4: Thumbtack Expertise Days # 5 - Ansible

↳ production: 2 кластера из 5 Appnode + 1 Aerospike, ~125k rps

↪ integration↪ qa↪ performance

↳ Деплой одного adserver < 2 минут

↳ Деплой с помощью RPM пакетов

↳ Очень просто адаптировать деплой

Что стало?

Page 5: Thumbtack Expertise Days # 5 - Ansible

↳ Частые изменения окружений:↪ смена ip, hostname↪ новые окружения: perf, stg, qa, …

↳ Рефакторинг:↪ file-based configuration -> zookeeper↪ Glassfish -> netty

↳ Удаленная команда с доступом на prod↳ Бизнес-цели:

↪ интеграция с новыми партнерами↪ zero-downtime deployment

Проблемы

Page 6: Thumbtack Expertise Days # 5 - Ansible

Ansibleto the rescue

or not

Page 7: Thumbtack Expertise Days # 5 - Ansible

Что такое Ansible?

↳ agentless cm+orchestration+deployment tool

↪ python↪ ssh↪ ***magic***

↳ Easy to start

↳ Hard to master

↳ bit.ly/ansiblestart

Page 8: Thumbtack Expertise Days # 5 - Ansible

Установка

На управляющем хосте$ pip install ansible

На управляемые хосты ничего устанавливать не надо!

bit.ly/ansiblebest

Page 9: Thumbtack Expertise Days # 5 - Ansible

Задание списка управляемых хостов

↳ Текстовый файл (inventory)↳ Скрипт

↪ Cobbler↪ Digital Ocean↪ EC2↪ OpenStack↪ Vagrant↪ многие другие

bit.ly/ansiblebest

Page 10: Thumbtack Expertise Days # 5 - Ansible

Inventory

[appnode]

host1

host2 ansible_ssh_port=1234

[db]

host3

Inventory-файл по-умолчанию: /etc/ansible/hostsДругие inventory-файлы можно указывать с помощью$ANSIBLE_HOSTS и опции -i

bit.ly/ansiblebest

Page 11: Thumbtack Expertise Days # 5 - Ansible

Variables[appnode]

host1 timeout=50

host2 ansible_ssh_port=1234

[appnode:vars]

timeout = 1000

bit.ly/ansiblebest

Page 12: Thumbtack Expertise Days # 5 - Ansible

Variablesgroup_vars/main.yml

appnode.yml

db.yml

host_vars/main.yml

host1.yml

host2.yml

host3.yml

bit.ly/ansiblebest

Page 13: Thumbtack Expertise Days # 5 - Ansible

FactsПеременные, определенные на управляемых хостах

↳ ansible_architecture: x86_64

↳ ansible_devices: [{“sda”: {...}}, {“sdb”: {...}}]

↳ ansible_distribution: Ubuntu

↳ ansible_os_family: Debian

↳ ansible_processor_count: 8

bit.ly/ansiblebest

Page 14: Thumbtack Expertise Days # 5 - Ansible

Modules

↳ template: отрендерить шаблон и положить на управляемый хост

↳ copy: скопировать файл на управляемый хост

↳ git: управление копией репозитория

↳ archive: упаковка и распаковка архивов

↳ shell: исполнение произвольных команд

↳ Всего более 250 модулей

bit.ly/ansiblebest

Page 15: Thumbtack Expertise Days # 5 - Ansible

Команда ansibleПозволяет выполнить простую задачу на группах серверов$ ansible appnode -m pinghost1 | success >> { "changed": false, "ping": "pong"}

host2 | success >> { "changed": false, "ping": "pong"}

bit.ly/ansiblebest

Page 16: Thumbtack Expertise Days # 5 - Ansible

Команда 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

Page 17: Thumbtack Expertise Days # 5 - Ansible

Playbook

---

- hosts: appnode

tasks:

- service: name=nginx state=started

$ ansible-playbook playbook.yml

bit.ly/ansiblebest

Page 18: Thumbtack Expertise Days # 5 - Ansible

Include

---

- hosts: appnode

tasks:

- include: path/to/other/tasks.yml

roles:

- role: appnode

- include: otherplaybook.yml

bit.ly/ansiblebest

Page 19: Thumbtack Expertise Days # 5 - Ansible

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

Page 20: Thumbtack Expertise Days # 5 - Ansible

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

Page 21: Thumbtack Expertise Days # 5 - Ansible

Шаблонизатор: 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

Page 22: Thumbtack Expertise Days # 5 - Ansible

Role---

- hosts: appnode

roles:

- role: appnode

roles/appnode/

tasks/main.yml

defaults/...

vars/...

files/...

templates/...

handlers/...

bit.ly/ansiblebest

Page 23: Thumbtack Expertise Days # 5 - Ansible

Окружения

inventory/

production

integration

qa

performance

$ ansible-playbook -i inventory/production deploy.yml

Page 24: Thumbtack Expertise Days # 5 - Ansible

Окружения: проблемы

↳ Список серверов “захардкожен” в 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

Page 25: Thumbtack Expertise Days # 5 - Ansible

Переменные: проблемы

↳ Существует 15(!) способов определить переменную↳ yaml + jinja = боль

↪ name: {{ othervar }} # ka-boom!↪ name: ‘{{ othervar }}’

↳ Нельзя просто создать факт в playbook↪ set_fact создает временную переменную↪ Официальный ответ - создавать файл в /etc/ansible/facts.d

Решения:↳ Локализовывать переменные в месте их использования↳ Переменные, зависящие от окружения выносить в inventory↳ Сложные структуры использовать по минимуму

Page 26: Thumbtack Expertise Days # 5 - Ansible

Переменные: проблемы

↳ 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

Page 27: Thumbtack Expertise Days # 5 - Ansible

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,appnpdedeploy prod glassfish,appnode

Page 28: Thumbtack Expertise Days # 5 - Ansible

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,...}

Page 29: Thumbtack Expertise Days # 5 - Ansible

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!

Page 30: Thumbtack Expertise Days # 5 - Ansible

Ansible: backwards compatibility

↳ Обновление с 1.5.4 на 1.7.x поломало модуль copy

↳ include role with_items: deprecated & unsupported

↪ “потому что мы не можем загрузить все созданные переменные”

Page 31: Thumbtack Expertise Days # 5 - Ansible

Заключение↳ Ansible - чаще обертка над bash+pssh, чем CM tool↳ Понятия часто расходятся с реальностью↳ Сложно разработать процесс, не укладывающийся в

рамки “best practices”Тем не менее,↳ “it works”↳ проблемы решаемы в обозримое время↳ структура, продуманная один раз, применима для

(почти) любых новых проектов↳ админы любят :)

Page 32: Thumbtack Expertise Days # 5 - Ansible

Спасибо за внимание!Вопросы?