Управление конфигурацией: топология «push против pull»

22

Более развитые системы управления конфигурациями (CM), такие как Puppet и Chef, используют подход, основанный на извлечении: клиенты периодически запрашивают обновления у централизованного мастера. Некоторые из них также предлагают подход без мастера (например, на основе push), но утверждают, что он «не для производства» (Saltstack) или «менее масштабируемый» (Puppet). Единственная известная мне система с самого начала - это push-based Ansible.

В чем заключается конкретное преимущество масштабируемости системы, основанной на извлечении? Почему якобы легче добавить больше мастеров, чем агентов?

Например, agiletesting.blogspot.nl пишет:

в «вытягивающей» системе клиенты связываются с сервером независимо друг от друга, поэтому система в целом более масштабируема, чем «выталкивающая» система

С другой стороны, Rackspace демонстрирует, что они могут работать с системами 15K с помощью модели на основе push.

infastructures.org пишет:

Мы клянемся, используя методологию поддержки инфраструктур, используя такие инструменты, как SUP, CVSup, сервер rsync или cfengine. Вместо того, чтобы выдавать изменения клиентам, каждый отдельный клиентский компьютер должен отвечать за опрос золотого сервера при загрузке, а затем периодически, чтобы поддерживать свой собственный уровень оборотов. Прежде чем принять эту точку зрения, мы разработали обширные push-скрипты, основанные на ssh, rsh, rcp и rdist. Проблема, которую мы обнаружили с r-командами (или ssh), заключалась в следующем: когда вы запускаете сценарий, основанный на r-командах, чтобы протолкнуть изменения на ваши целевые машины, есть вероятность, что если у вас более 30 целевых хостов, один из них будет быть в любой момент. Ведение списка введенных в эксплуатацию машин становится кошмаром. В процессе написания кода, исправляющего это, вы получите сложный код-обертку для решения: таймауты от мертвых хостов; регистрация и повторная попытка мертвых хостов; создание и запуск параллельных заданий, чтобы попытаться поразить множество хостов за разумное время; и, наконец, обнаружение и предотвращение использования всех доступных TCP-сокетов на исходном компьютере со всеми исходящими сеансами rsh. Тогда у вас все еще есть проблема получения того, что вы только что сделали, в установочных образах для всех новых хостов, которые будут установлены в будущем, а также повторения этого для всех хостов, которые умирают и должны быть восстановлены завтра. После того, как мы решили реализовать репликацию на основе r-команд, мы обнаружили, что это того не стоит. Мы не планируем снова управлять инфраструктурой с помощью r-команд или с помощью какого-либо другого push-механизма. Они не масштабируются так хорошо, как методы, основанные на извлечении. создание и запуск параллельных заданий, чтобы попытаться поразить множество хостов за разумное время; и, наконец, обнаружение и предотвращение использования всех доступных TCP-сокетов на исходном компьютере со всеми исходящими сеансами rsh. Тогда у вас все еще есть проблема получения того, что вы только что сделали, в установочных образах для всех новых хостов, которые будут установлены в будущем, а также повторения этого для всех хостов, которые умирают и должны быть восстановлены завтра. После того, как мы решили реализовать репликацию на основе r-команд, мы обнаружили, что это того не стоит. Мы не планируем снова управлять инфраструктурой с помощью r-команд или с помощью какого-либо другого push-механизма. Они не масштабируются так хорошо, как методы, основанные на извлечении. создание и запуск параллельных заданий, чтобы попытаться поразить множество хостов за разумное время; и, наконец, обнаружение и предотвращение использования всех доступных TCP-сокетов на исходном компьютере со всеми исходящими сеансами rsh. Тогда у вас все еще есть проблема получения того, что вы только что сделали, в установочных образах для всех новых хостов, которые будут установлены в будущем, а также повторения этого для всех хостов, которые умирают и должны быть восстановлены завтра. После того, как мы решили реализовать репликацию на основе r-команд, мы обнаружили, что это того не стоит. Мы не планируем снова управлять инфраструктурой с помощью r-команд или с помощью какого-либо другого push-механизма. Они не масштабируются так хорошо, как методы, основанные на извлечении. и, наконец, обнаружение и предотвращение использования всех доступных TCP-сокетов на исходном компьютере со всеми исходящими сеансами rsh. Тогда у вас все еще есть проблема получения того, что вы только что сделали, в установочных образах для всех новых хостов, которые будут установлены в будущем, а также повторения этого для всех хостов, которые умирают и должны быть восстановлены завтра. После того, как мы решили реализовать репликацию на основе r-команд, мы обнаружили, что это того не стоит. Мы не планируем снова управлять инфраструктурой с помощью r-команд или с помощью какого-либо другого push-механизма. Они не масштабируются так хорошо, как методы, основанные на извлечении. и, наконец, обнаружение и предотвращение использования всех доступных TCP-сокетов на исходном компьютере со всеми исходящими сеансами rsh. Тогда у вас все еще есть проблема получения того, что вы только что сделали, в установочных образах для всех новых хостов, которые будут установлены в будущем, а также повторения этого для всех хостов, которые умирают и должны быть восстановлены завтра. После того, как мы решили реализовать репликацию на основе r-команд, мы обнаружили, что это того не стоит. Мы не планируем снова управлять инфраструктурой с помощью r-команд или с помощью какого-либо другого push-механизма. Они не масштабируются так хорошо, как методы, основанные на извлечении. Тогда у вас все еще есть проблема получения того, что вы только что сделали, в установочных образах для всех новых хостов, которые будут установлены в будущем, а также повторения этого для всех хостов, которые умирают и должны быть восстановлены завтра. После того, как мы решили реализовать репликацию на основе r-команд, мы обнаружили, что это того не стоит. Мы не планируем снова управлять инфраструктурой с помощью r-команд или с помощью какого-либо другого push-механизма. Они не масштабируются так хорошо, как методы, основанные на извлечении. Тогда у вас все еще есть проблема получения того, что вы только что сделали, в установочных образах для всех новых хостов, которые будут установлены в будущем, а также повторения этого для всех хостов, которые умирают и должны быть восстановлены завтра. После того, как мы решили реализовать репликацию на основе r-команд, мы обнаружили, что это того не стоит. Мы не планируем снова управлять инфраструктурой с помощью r-команд или с помощью какого-либо другого push-механизма. Они не масштабируются так хорошо, как методы, основанные на извлечении. или с любым другим толкающим механизмом в этом отношении. Они не масштабируются так хорошо, как методы, основанные на извлечении. или с любым другим толкающим механизмом в этом отношении. Они не масштабируются так хорошо, как методы, основанные на извлечении.

Разве это не проблема реализации, а не архитектурная? Почему труднее написать многопоточный push-клиент, чем многопоточный pull-сервер?

Willem
источник
4
Просто заметка, Ansible тоже может сделать тягу через ansible-pull.
ceejayoz
1
Одним из основных преимуществ является обход NAT и брандмауэров. Это часто не контрольно-пропускной пункт, но иногда это изменит правила игры.
Дэн Гартвейт
СОЛЬ использует паб / саб ZeroMQ. Который отличается.
Дэн Гартвейт
1
Об этом много говорили в разделе « Развертывание приложения и конфигурация системы» в списке рассылки [devops-toolchain] [1]. [1]: code.google.com/p/devops-toolchain
sciurus
1
Кстати - HP Server Automation имеет push-моделирование и может управлять десятками тысяч устройств {раскрытие - я архитектор автоматизации для партнера HP}
warren

Ответы:

8

Проблема с системами на основе push заключается в том, что у вас должна быть полная модель всей архитектуры на центральном push-узле. Вы не можете толкнуть машину, о которой не знаете.

Очевидно, что это может работать, но требуется много работы, чтобы синхронизировать его.

Используя такие вещи, как Mcollective, вы можете конвертировать Puppet и другие CM в систему на основе push. Как правило, банальную систему легко преобразовать в пуш-систему, но не всегда просто пойти другим путем.

Существует также вопрос организационной политики. Система, основанная на push, передает все управление центральным администраторам. Таким способом очень сложно управлять сложностью. Я думаю, что проблема масштабирования - красная сельдь, любой подход масштабируется, если вы просто посмотрите на количество клиентов. Во многих отношениях толчок легче масштабировать. Однако динамическая конфигурация более или менее подразумевает, что у вас есть хотя бы версия для регистрации клиента по запросу.

В конечном счете, речь идет о том, какая система соответствует рабочему процессу и владельцу в вашей организации. Как правило, тяговые системы более гибкие.

Фред Волшебная Чудо-Собака
источник
2
Благодарность! Но почему динамическая конфигурация подразумевает тягу? Например, Ansible использует динамический push. Таким образом, кажется, что тот факт, что Puppet не может выполнять динамический push, является ограничением реализации, а не ограничением архитектуры, верно?
Виллем
4
@Willem По-настоящему «динамическая» среда означает, что новая машина может появиться где угодно, в любое время и потребовать настройки. Система на основе push требует, чтобы вы настроили эту систему на центральном узле; основанная на извлечении система может извлекать (общую) конфигурацию, не требуя от администратора среды каких-либо действий с серверами конфигурации.
voretaq7
1
Zabbix обнаруживает хосты, Ansible может использовать динамический инвентарь для проталкивания конфигурации на новые обнаруженные хосты.
bbaassssiiee
да, ansible может использовать множество источников для своей динамической инвентаризации, например, ESX API. Таким образом, вы узнаете о виртуальной машине, как только она будет создана, и сможете запускать воспроизведение по совпадению с образцом.
Дж. М. Беккер
11

В случае, если он кому-то интересен, я думаю, что, как минимум, я могу предоставить отчет об опыте работы с пользователем, впервые применив Ansible «из коробки», в контексте управления исправлениями для множественных установок критически важных систем. в облаке Амазонки. Чтобы понять мои предвзятые мнения или предубеждения, я должен объяснить, что у меня есть предпочтение Ruby на уровне сценариев автоматизации, и в прошлом я настраивал проекты для использования конфигурации марионеток главного агента для каждого проекта-Vpc. Так что мой опыт противоречит предрассудкам, если таковые были.

Мой недавний опыт был очень благоприятен для динамического перехода к изменяющемуся состоянию от десятков до многих сотен серверов, которые можно масштабировать или увеличивать, отключать и обновлять. В моей ситуации простая команда Ansible 1.7 ad hoc была всем, что мне нужно для создания патча. Однако ввиду эффективности установки AnsibleController (на t2.micro) на Vpc для этой цели в будущем я намерен расширить методику для более сложных требований.

Итак, позвольте мне вернуться к вопросу, заданному в этой теме: плюсы и минусы толчка в динамично меняющемся состоянии.

Предположения типа сервера, на который я нацелился, были:

  • Нет предположения, что IP-адреса или сгенерированные Amazon локальные имена хостов будут долговечны - они могут как приходить, так и уходить
  • Все экземпляры были созданы из образов машин, которые уже имели возможность сделать доступ по SSH одним привилегированным пользователем с правами администратора.
  • Чтобы разделить серверы и, возможно, разделить их на группы, в соответствии с функцией или в соответствии с этапом разработки (например, тест или продукт), это будет сделано путем запуска определенных тегов Amazon согласованных условных имен.
  • То, что я бы исправлял администрирование серверов Linux и Windows по отдельности, с помощью различных специальных команд, поэтому было бы вполне приемлемо просто допустить сбой при входе в систему для конкретного Linux при обращении к серверу Windows

С учетом этих условий очень просто создать образ машины AnsibleController для установки на множество Vpcs и настроить (с учетными данными) in situ в существующих учетных записях сервера. Автоматизировано в каждом экземпляре, созданном из изображения

  1. Задание cron для установки исправления на работающие серверы через равные промежутки времени, чтобы через определенные промежутки времени происходил постоянный доступ к требуемому состоянию.
  2. Способ вычисления инвентаря Ansible на каждом таком интервале.

Второй элемент может быть сделан относительно сложным, если необходимо (через структуру Info инвентаря Ansible). Но если сложность не требуется, вот очень простой пример сценария для вычисления всех экземпляров Amazon EC2 с каждым интервалом cron и направления результатов в соответствующий файл инвентаризации (например, / etc / ansible / hosts)…

#!/bin/bash
# Assumes aws-cli/1.3.4 Python/2.6.9 Linux/3.4.73-64.112.amzn1.x86_64 or greater
# http://aws.amazon.com/releasenotes/8906204440930658
# To check yum list aws-cli
# Assumes that server is equipped with AWS keys and is able to access some or all
# instances in the account within it is running.
# Provide a list of host IPs each on a separate line
# If an argument is passed then treat it as the filename, whether local or absolute 
# path, to which the list is written

function list-of-ips {
    /usr/bin/aws ec2 describe-instances --filters '[ {"Name": "instance-state-code", "Values": [ "16" ] } ]' | grep -w PrivateIpAddress | awk  '{x=$2; gsub("\"","", x); gsub(",","", x); if(x && FNR!=1){print x;}}' | uniq
 }

if [ -n "$1" ]; then
   list-of-ips > "$1"
else
   list-of-ips
fi

Единственное предостережение для варианта использования - команда patch должна быть идемпотентной. Желательно провести предварительное тестирование, чтобы удостовериться, что оно выполнено, а также убедиться, что исправление выполняет именно то, для чего предназначено.

Подводя итог, я проиллюстрировал пример использования, в котором динамический толчок эффективен против поставленных целей. Это повторяемое решение (в смысле инкапсуляции в изображение, которое можно развернуть в нескольких учетных записях и регионах). По моему опыту, на сегодняшний день метод динамического толчка намного проще обеспечить - и начать действовать - чем альтернативы, доступные из наборов инструментов, доступных нам в настоящее время.

johnz
источник
2
//, @jonz, это дискуссия, для которой, я думаю, опытные разработчики полюбили модель Stack Exchange. Мне особенно нравятся термины, которые вы выбрали, и что в этом ответе сначала перечислены предположения.
Натан Басанезе