Как не положить тысячи
серверов с помощью системы
централизованного управления
конфигурацией на примере
CFEngine
Дмитрий Самсонов
Дмитрий Самсонов
Ведущий системный администратор в OK.RU
Компетенция:
● Zabbix
● CFEngine
● Linux tuning
dmitry.samsonov@odnoklassniki.ru
https://www.linkedin.com/in/dmitrysamsonov
Одноклассники
>11000 серверов
>150 приложений
>600 кластеров
Разоблачение
Я предвзят
Разоблачение
Я предвзят
У меня есть опыт использования CFEngine только версии 3.3.x-3.4.x
Разоблачение
Я предвзят
У меня есть опыт использования CFEngine только версии 3.3.x-3.4.x
CFEngine не лидер и не аутсайдер рынка
Разоблачение
Я предвзят
У меня есть опыт использования CFEngine только версии 3.3.x-3.4.x
CFEngine не лидер и не аутсайдер рынка
Я не буду сравнивать configuration management на сегодняшний день
Разоблачение
Я предвзят
У меня есть опыт использования CFEngine только версии 3.3.x-3.4.x
CFEngine не лидер и не аутсайдер рынка
Я не буду сравнивать configuration management на сегодняшний день
У меня есть опыт использования только CFEngine и Ansible
Классические средства конфигурации
● ssh + scp + winexe
Классические средства конфигурации
● ssh + scp + winexe
● dssh-command + dscp + dwinexe-command
Классические средства конфигурации
● ssh + scp + winexe
● dssh-command + dscp + dwinexe-command
● Образ OS (регулярные обновления)
dssh-command
# cqn feeds-portlet-cdb | dssh-command -t 300 "hostname"
dssh-command
# cqn feeds-portlet-cdb | dssh-command -t 300 "hostname"
How much is 5 + 8 =
dssh-command
# cqn feeds-portlet-cdb | dssh-command -t 300 "hostname"
How much is 5 + 8 =
50, 100, 200...
dssh-command
# cqn feeds-portlet-cdb | dssh-command -t 300 "hostname"
How much is 5 + 8 = 13
Correct
srvd1352:O:0:srvd1352
dssh-command
# cqn feeds-portlet-cdb | dssh-command -t 300 "hostname"
How much is 5 + 8 = 13
Correct
srvd1352:O:0:srvd1352
Executing: "hostname"
Do you want to execute the command on servers in DL? [Yes/No]: Yes
srvd1353:O:0:srvd1353
dssh-command
# cqn feeds-portlet-cdb | dssh-command -t 300 "hostname"
How much is 5 + 8 = 13
Correct
srvd1352:O:0:srvd1352
Executing: "hostname"
Do you want to execute the command on servers in DL? [Yes/No]: Yes
srvd1353:O:0:srvd1353
Executing: "hostname"
Do you want to execute the command on servers in M100? [Yes/no]: Yes
srve1993:O:0:srve1993
srve2765:O:0:srve2765
...
Full output saved in /tmp/dsshFullOutput_29606_2016-10-14_13-17.log
file.
Сервера настроены неправильно
Как мы выбирали и что выбрали в 2012
● Интеграция с CMDB
● Установка пакетов
● Работа с файлами (копирование/редактирование/атрибуты)
● Контроль файлов (содержимое/атрибуты)
● Управление процессами и сервисами
● Ручной запуск политик
● Контроль версий, логирование изменений, отчеты
● Масштабирование, резервирование
● Поддержка Linux и Windows
● Проверка на наличие серверов без работающего CM
Как мы выбирали и что выбрали в 2012
● Производительность
Производительность
3000 клиентов
Как мы выбирали и что выбрали в 2012
● Производительность
● Зрелость
Современная история CM
“A theory of configuration maintenance was worked out by Mark Burgess with a practical implementation on present day computer systems in
the software CFEngine able to perform real time repair as well as preventive maintenance.”
https://en.wikipedia.org/wiki/Configuration_management#Operating_System_configuration_management
Как мы выбирали и что выбрали в 2012
● Зрелость
● Производительность
● Популярность
Популярность CM
CFEngine в Одноклассниках
CFEngine может быть простым
Типичная политика настройки приложения
"app_ok_feed" or => {"cmdb_group_feeds_proxy",
“cmdb_group_feeds_cache};
...
bundle agent app_ok_feed
{
vars:
"application" string => "ok-feed";
methods:
"app_ok" usebundle => app_ok("$(application)");
}
Библиотека настройки приложений
bundle agent app_ok(application)
{
vars:
"file[/ok/bin/$(application)][policy]" string => "copy";
"file[/ok/bin/$(application)][mode]" string => "0755";
"file[/ok/conf/$(application).conf][policy]" string => "copy";
"file[/root/ok/ok.properties][policy]" string => "edit";
"file[/root/ok/ok.properties][suffix]" string => "$(application)";
"file[/root/ok/ok.properties][type]" string => "file";
methods:
"files" usebundle => files_manage("$(this.bundle).file");
}
CFEngine может быть простым в
использовании
Добавить пользователя:
"user[git][policy]" string => "add";
Запустить сервис:
"service[mysql][policy]" string => "start";
Добавить крон:
"cron[do_well][cron]" string => "* * * * * do_well";
Установить пакет:
"package[rsyslog][policy]" string => "add";
Количество политик по типам
Библиотека
Служебные
Приложения
Возможно всё!
● IP routes
● HW RAID Write cache
● SELinux
● IPMI SOL
● Kernel modules
● RSS/RPS/RFS
Чем он нам не нравится
● Высокий порог вхождения
Чем он нам не нравится
● Высокий порог вхождения
● Сильно отстаёт от конкурентов
Чем он нам не нравится
● Высокий порог вхождения
● Сильно отстаёт от конкурентов
● Нет возможности расширять функционал
Чем он нам не нравится
● Высокий порог вхождения
● Сильно отстаёт от конкурентов
● Нет возможности расширять функционал
● Плохие шаблоны
Чем примечательна дата
4 апреля?
“В одну тихую весеннюю ночь, а именно с 4-
го на 5-ое апреля 2013-го года, ничто не
предвещало беды — юзеры непринуждённо
общались, грузили и комментили фоточки,
и собирали урожай, как вдруг всё ё***лось, и
что, с**а, характерно, обратно не
поднялось. Ни через час, ни через два, ни
через три. И даже не через 20 часов! … Что
это за централизованная система
управления, которая лёгким движением
руки позволяет отправить несколько
тысяч серверов в /dev/null, знают только её
разработчики…”
https://lurkmore.to/Одноклассники
Можно ли было избежать?
● Проверка синаксиса
● Тестовые окружения
● Ревью
● Мониторинг ошибок
CFEngine по-прежнему работает
постоянно и проверяет политики
каждые 5 минут
Как мы работаем
1. Проверка в git hooks
2. Проверка в тестовом окружении
3. Проверка на части прод серверов с
автоматизированным контролем нагрузки
4. Ревью
5. Плавное распространение по проду
GIT hooks
● Проверка синтаксиса
GIT hooks
● Проверка синтаксиса
● Автокоррекция стиля
GIT hooks
● Проверка синтаксиса
● Автокоррекция стиля
● Автозаполнение и проверка commit message
Как мы работаем
1. Проверка в git hooks
2. Проверка в тестовом окружении
3. Проверка на части прод серверов с
автоматизированным контролем нагрузки
4. Ревью
5. Плавное распространение по проду
Проверка в тестовом окружении
● Unstable - виртуалки
Проверка в тестовом окружении
● Unstable - виртуалки
● Testing - физические сервера
Как мы работаем
1. Проверка в git hooks
2. Проверка в тестовом окружении
3. Проверка на части прод серверов с
автоматизированным контролем нагрузки
4. Ревью
5. Плавное распространение по проду
Stable
● Прод сервера
Stable
● Прод сервера
● От каждого нового кластера
берётся один сервер
Stable
● Прод сервера
● От каждого нового кластера
берётся один сервер
● Все варианты железа и
приложений
Stable
● Прод сервера
● От каждого нового кластера
берётся один сервер
● Все варианты железа и
приложений
● Потеря прозрачна для
пользователей
Stable
● Прод сервера
● От каждого нового кластера
берётся один сервер
● Все варианты железа и
приложений
● Потеря прозрачна для
пользователей
● Обновления плавно в течение
одного часа
Stable
● Прод сервера
● От каждого нового кластера
берётся один сервер
● Все варианты железа и
приложений
● Потеря прозрачна для
пользователей
● Обновления плавно в течение
одного часа
● Для серверов автоматически
контролируется нагрузка
Как мы работаем
1. Проверка в git hooks
2. Проверка в тестовом окружении
3. Проверка на части прод серверов с
автоматизированным контролем нагрузки
4. Ревью
5. Плавное распространение по проду
Ревью
Ревью политики:
1. Соблюдение style guide (большая часть проверяется pre-commit хуком в git)
2. “Адекватность” кода
3. Использование последних версий методов
4. …
Ревью
Соблюдение всех условий для продвижения в прод:
1. Нет ошибок выполнения
2. Нет проблем с нагрузкой
3. “Промариновалось”
Ещё пара слов про ревью
● Исключение - инциденты!
Ещё пара слов про ревью
● Исключение - инциденты!
● Кто ревьювит?
Как мы работаем
1. Проверка в git hooks
2. Проверка в тестовом окружении
3. Проверка на части прод серверов с
автоматизированным контролем нагрузки
4. Ревью
5. Плавное распространение по проду
Production
● Поделен на независимые
части
Production
● Поделен на независимые
части
● Каждая часть применяет
изменения равномерно в
течение часа
Production
● Поделен на независимые
части
● Каждая часть применяет
изменения равномерно в
течение часа
● Обновления работают только
с 8:00 до 20:00
Как мы работаем
1. Проверка в git hooks
2. Проверка в тестовом окружении
3. Проверка на части прод серверов с
автоматизированным контролем нагрузки
4. Ревью
5. Плавное распространение по проду
План “Б”
● Альтернативный
минимальный набор
политик
● Изменяется очень редко
План “В”
cf-stop - остановка CFEngine на всём проде за
несколько минут
cf-update
exit
status=0
update+execute
execute
stop
exit
status=0
batch size x2
continue
Это надо делать обязательно
● Тестировать в разных условиях
● Долго тестировать на части прода
● Делать ревью
● Распространять обновления в продакшене плавно и
поэтапно
● Иметь план на случай аварии
Спасибо за внимание!
● Блог Одноклассников на Хабре
http://habrahabr.ru/company/odnoklassniki/
● Больше о нас и наших докладах
http://v.ok.ru/
Дмитрий Самсонов
dmitry.samsonov@odnoklassniki.ru
https://www.linkedin.com/in/dmitrysamsonov

Как не положить тысячи серверов с помощью системы централизованного управления конфигурацией на примере CFEngine

  • 1.
    Как не положитьтысячи серверов с помощью системы централизованного управления конфигурацией на примере CFEngine Дмитрий Самсонов
  • 2.
    Дмитрий Самсонов Ведущий системныйадминистратор в OK.RU Компетенция: ● Zabbix ● CFEngine ● Linux tuning dmitry.samsonov@odnoklassniki.ru https://www.linkedin.com/in/dmitrysamsonov
  • 3.
  • 4.
  • 5.
    Разоблачение Я предвзят У меняесть опыт использования CFEngine только версии 3.3.x-3.4.x
  • 6.
    Разоблачение Я предвзят У меняесть опыт использования CFEngine только версии 3.3.x-3.4.x CFEngine не лидер и не аутсайдер рынка
  • 7.
    Разоблачение Я предвзят У меняесть опыт использования CFEngine только версии 3.3.x-3.4.x CFEngine не лидер и не аутсайдер рынка Я не буду сравнивать configuration management на сегодняшний день
  • 8.
    Разоблачение Я предвзят У меняесть опыт использования CFEngine только версии 3.3.x-3.4.x CFEngine не лидер и не аутсайдер рынка Я не буду сравнивать configuration management на сегодняшний день У меня есть опыт использования только CFEngine и Ansible
  • 9.
  • 10.
    Классические средства конфигурации ●ssh + scp + winexe ● dssh-command + dscp + dwinexe-command
  • 11.
    Классические средства конфигурации ●ssh + scp + winexe ● dssh-command + dscp + dwinexe-command ● Образ OS (регулярные обновления)
  • 12.
    dssh-command # cqn feeds-portlet-cdb| dssh-command -t 300 "hostname"
  • 13.
    dssh-command # cqn feeds-portlet-cdb| dssh-command -t 300 "hostname" How much is 5 + 8 =
  • 14.
    dssh-command # cqn feeds-portlet-cdb| dssh-command -t 300 "hostname" How much is 5 + 8 = 50, 100, 200...
  • 15.
    dssh-command # cqn feeds-portlet-cdb| dssh-command -t 300 "hostname" How much is 5 + 8 = 13 Correct srvd1352:O:0:srvd1352
  • 16.
    dssh-command # cqn feeds-portlet-cdb| dssh-command -t 300 "hostname" How much is 5 + 8 = 13 Correct srvd1352:O:0:srvd1352 Executing: "hostname" Do you want to execute the command on servers in DL? [Yes/No]: Yes srvd1353:O:0:srvd1353
  • 17.
    dssh-command # cqn feeds-portlet-cdb| dssh-command -t 300 "hostname" How much is 5 + 8 = 13 Correct srvd1352:O:0:srvd1352 Executing: "hostname" Do you want to execute the command on servers in DL? [Yes/No]: Yes srvd1353:O:0:srvd1353 Executing: "hostname" Do you want to execute the command on servers in M100? [Yes/no]: Yes srve1993:O:0:srve1993 srve2765:O:0:srve2765 ... Full output saved in /tmp/dsshFullOutput_29606_2016-10-14_13-17.log file.
  • 18.
  • 19.
    Как мы выбиралии что выбрали в 2012 ● Интеграция с CMDB ● Установка пакетов ● Работа с файлами (копирование/редактирование/атрибуты) ● Контроль файлов (содержимое/атрибуты) ● Управление процессами и сервисами ● Ручной запуск политик ● Контроль версий, логирование изменений, отчеты ● Масштабирование, резервирование ● Поддержка Linux и Windows ● Проверка на наличие серверов без работающего CM
  • 20.
    Как мы выбиралии что выбрали в 2012 ● Производительность
  • 21.
  • 22.
    Как мы выбиралии что выбрали в 2012 ● Производительность ● Зрелость
  • 23.
    Современная история CM “Atheory of configuration maintenance was worked out by Mark Burgess with a practical implementation on present day computer systems in the software CFEngine able to perform real time repair as well as preventive maintenance.” https://en.wikipedia.org/wiki/Configuration_management#Operating_System_configuration_management
  • 24.
    Как мы выбиралии что выбрали в 2012 ● Зрелость ● Производительность ● Популярность
  • 25.
  • 26.
  • 27.
  • 28.
    Типичная политика настройкиприложения "app_ok_feed" or => {"cmdb_group_feeds_proxy", “cmdb_group_feeds_cache}; ... bundle agent app_ok_feed { vars: "application" string => "ok-feed"; methods: "app_ok" usebundle => app_ok("$(application)"); }
  • 29.
    Библиотека настройки приложений bundleagent app_ok(application) { vars: "file[/ok/bin/$(application)][policy]" string => "copy"; "file[/ok/bin/$(application)][mode]" string => "0755"; "file[/ok/conf/$(application).conf][policy]" string => "copy"; "file[/root/ok/ok.properties][policy]" string => "edit"; "file[/root/ok/ok.properties][suffix]" string => "$(application)"; "file[/root/ok/ok.properties][type]" string => "file"; methods: "files" usebundle => files_manage("$(this.bundle).file"); }
  • 30.
    CFEngine может бытьпростым в использовании Добавить пользователя: "user[git][policy]" string => "add"; Запустить сервис: "service[mysql][policy]" string => "start"; Добавить крон: "cron[do_well][cron]" string => "* * * * * do_well"; Установить пакет: "package[rsyslog][policy]" string => "add";
  • 31.
    Количество политик потипам Библиотека Служебные Приложения
  • 32.
    Возможно всё! ● IProutes ● HW RAID Write cache ● SELinux ● IPMI SOL ● Kernel modules ● RSS/RPS/RFS
  • 33.
    Чем он намне нравится ● Высокий порог вхождения
  • 34.
    Чем он намне нравится ● Высокий порог вхождения ● Сильно отстаёт от конкурентов
  • 35.
    Чем он намне нравится ● Высокий порог вхождения ● Сильно отстаёт от конкурентов ● Нет возможности расширять функционал
  • 36.
    Чем он намне нравится ● Высокий порог вхождения ● Сильно отстаёт от конкурентов ● Нет возможности расширять функционал ● Плохие шаблоны
  • 37.
  • 38.
    “В одну тихуювесеннюю ночь, а именно с 4- го на 5-ое апреля 2013-го года, ничто не предвещало беды — юзеры непринуждённо общались, грузили и комментили фоточки, и собирали урожай, как вдруг всё ё***лось, и что, с**а, характерно, обратно не поднялось. Ни через час, ни через два, ни через три. И даже не через 20 часов! … Что это за централизованная система управления, которая лёгким движением руки позволяет отправить несколько тысяч серверов в /dev/null, знают только её разработчики…” https://lurkmore.to/Одноклассники
  • 39.
    Можно ли былоизбежать? ● Проверка синаксиса ● Тестовые окружения ● Ревью ● Мониторинг ошибок
  • 41.
    CFEngine по-прежнему работает постояннои проверяет политики каждые 5 минут
  • 42.
    Как мы работаем 1.Проверка в git hooks 2. Проверка в тестовом окружении 3. Проверка на части прод серверов с автоматизированным контролем нагрузки 4. Ревью 5. Плавное распространение по проду
  • 43.
    GIT hooks ● Проверкасинтаксиса
  • 44.
    GIT hooks ● Проверкасинтаксиса ● Автокоррекция стиля
  • 45.
    GIT hooks ● Проверкасинтаксиса ● Автокоррекция стиля ● Автозаполнение и проверка commit message
  • 46.
    Как мы работаем 1.Проверка в git hooks 2. Проверка в тестовом окружении 3. Проверка на части прод серверов с автоматизированным контролем нагрузки 4. Ревью 5. Плавное распространение по проду
  • 47.
    Проверка в тестовомокружении ● Unstable - виртуалки
  • 48.
    Проверка в тестовомокружении ● Unstable - виртуалки ● Testing - физические сервера
  • 49.
    Как мы работаем 1.Проверка в git hooks 2. Проверка в тестовом окружении 3. Проверка на части прод серверов с автоматизированным контролем нагрузки 4. Ревью 5. Плавное распространение по проду
  • 50.
  • 51.
    Stable ● Прод сервера ●От каждого нового кластера берётся один сервер
  • 52.
    Stable ● Прод сервера ●От каждого нового кластера берётся один сервер ● Все варианты железа и приложений
  • 53.
    Stable ● Прод сервера ●От каждого нового кластера берётся один сервер ● Все варианты железа и приложений ● Потеря прозрачна для пользователей
  • 54.
    Stable ● Прод сервера ●От каждого нового кластера берётся один сервер ● Все варианты железа и приложений ● Потеря прозрачна для пользователей ● Обновления плавно в течение одного часа
  • 55.
    Stable ● Прод сервера ●От каждого нового кластера берётся один сервер ● Все варианты железа и приложений ● Потеря прозрачна для пользователей ● Обновления плавно в течение одного часа ● Для серверов автоматически контролируется нагрузка
  • 56.
    Как мы работаем 1.Проверка в git hooks 2. Проверка в тестовом окружении 3. Проверка на части прод серверов с автоматизированным контролем нагрузки 4. Ревью 5. Плавное распространение по проду
  • 57.
    Ревью Ревью политики: 1. Соблюдениеstyle guide (большая часть проверяется pre-commit хуком в git) 2. “Адекватность” кода 3. Использование последних версий методов 4. …
  • 58.
    Ревью Соблюдение всех условийдля продвижения в прод: 1. Нет ошибок выполнения 2. Нет проблем с нагрузкой 3. “Промариновалось”
  • 59.
    Ещё пара словпро ревью ● Исключение - инциденты!
  • 60.
    Ещё пара словпро ревью ● Исключение - инциденты! ● Кто ревьювит?
  • 61.
    Как мы работаем 1.Проверка в git hooks 2. Проверка в тестовом окружении 3. Проверка на части прод серверов с автоматизированным контролем нагрузки 4. Ревью 5. Плавное распространение по проду
  • 62.
    Production ● Поделен нанезависимые части
  • 63.
    Production ● Поделен нанезависимые части ● Каждая часть применяет изменения равномерно в течение часа
  • 64.
    Production ● Поделен нанезависимые части ● Каждая часть применяет изменения равномерно в течение часа ● Обновления работают только с 8:00 до 20:00
  • 65.
    Как мы работаем 1.Проверка в git hooks 2. Проверка в тестовом окружении 3. Проверка на части прод серверов с автоматизированным контролем нагрузки 4. Ревью 5. Плавное распространение по проду
  • 67.
    План “Б” ● Альтернативный минимальныйнабор политик ● Изменяется очень редко
  • 68.
    План “В” cf-stop -остановка CFEngine на всём проде за несколько минут
  • 69.
  • 70.
    Это надо делатьобязательно ● Тестировать в разных условиях ● Долго тестировать на части прода ● Делать ревью ● Распространять обновления в продакшене плавно и поэтапно ● Иметь план на случай аварии
  • 71.
    Спасибо за внимание! ●Блог Одноклассников на Хабре http://habrahabr.ru/company/odnoklassniki/ ● Больше о нас и наших докладах http://v.ok.ru/ Дмитрий Самсонов dmitry.samsonov@odnoklassniki.ru https://www.linkedin.com/in/dmitrysamsonov