Pull to refresh

Comments 26

Из всего многообразия scm, puppet нравится больше всего. Жаль что ансибл проще (в одной такой статье можно весь ансибл описать) и везде где я работал, выгоднее использовать именно ансибл.

опишите пожалуйста, очень хочется сравнить эти инструменты чтобы не ошибиться с выбором)

На Хабре полно статей для сравнения этих инструментов и даже больше. Не забывайте, что в комментариях бывает иногда даже больше информации, чем в самой статье. Не ленитесь читать сотни комментариев под статьями.

Я вам таки больше скажу — у этих инструментов немного разная область применения, поэтому можно использовать и то, и другое. Мы используем puppet для поддержания конфигурации серверов в нужном состоянии, а ansible используем для разовых заданий (например, поднимаем кластера Ceph именно с помощью ansible).

Я рад что вы любите гетерогенные инфраструктуры. Жаль что нам надо работать, а не изучать 100500 компонентов инфраструктуры, для собственного ЧСВ. Нужен быстрый онбординг, низкие требования к квалификации и делать максимум задач в самые сжатые сроки.

Спасибо за статью. Подскажите, а как дебажить то, что ты пишешь? У puppet есть push режим? чтобы сделать что то типа

ansible-playbook .... --check --limit=host
puppet agent --noop
и можно дебажить, но практичнее через notice() и уже смотреть вывод на папет-мастере

Либо, сделать папет-дев-енв и в нем гонять, мы пошли таким путем

Спасибо за вопрос, дописал в статью параграф про запуск и дебаг.

Как мы пишем паппет-код: инструментальная обвязка, документация, тестирование, CI/CD

Это конечно интересно (многие проголосовали за это), но это уже все есть :)

А вот как Вы «подружили несколько папет-серверов» с этого места поподробнее!!!
Очень уж хочется узнать как это возможно.

Т.к. хотим «съехать» с папета4 на папет6 и если такое возможно (особенно бесшовно) — не держите в себе! Рецепт в студию (с)

В нашем случае ситуация достаточно тяжёлая, потому что написано много кода посредственного качества под третий паппет, а в новый (изначально пятый, но к моменту запуска уже шестой) паппет мы хотели не просто перенести старые манифесты, а применять подходы Infrastructure as Code и писать качественный код, покрывая его тестами. Между третьим и шестым паппетом большая разница: как минимум, отличаются парсеры (https://puppet.com/docs/puppet/3.8/experiments_future.html), разные версии hiera (hiera 1 в третьем паппете и hiera 5 в шестом), поэтому мы потихоньку переписываем старые манифесты с нуля и переводим сервера со старого паппета на новый поштучно (ну, или скорее по группам).
Кроме огромного объёма манифестов, которые нам нужно переписать, встала ещё одна проблема: для бэкапов мы используем экспортируемые ресурсы, а для работы экспортируемых ресурсов нужна одна общая PuppetDB. Разные версии паппета совместимы с разными версиями PuppetDB, обратной совместимости нет (во всяком случае, не при такой разнице версий, как у нас), поэтому мы написали прокси для старого паппета, который реализует интерфейс старой PuppetDB и кладёт данные в новую PuppetDB. Ну и плюс были небольшие приседания с сертификатами для того, чтобы в одну и ту же PuppetDB ходили несколько новых паппетсерверов (засада кроется в двусторонней проверке TLS-сертификатов, каждый паппетсервер хочет, чтобы у PuppetDB был сертификат, выпущенный этим же паппетсервером).
Третий момент — сетевая конфигурация, которая хранится в Hiera и должна быть одинакова для сервера вне зависимости от того, под какой версией паппета этот сервер. Здесь просто — вынесли эту Hiera в отдельный репозиторий и подключаем его ко всем паппетсерверам.


В вашем случае проблем, скорее всего, будет меньше: если я правильно понимаю, то парсер четвёртой и шестой версии паппета если и отличается, то не так сильно, во всяком случае, лямбды туда уже завезли, да и окружения используются по умолчанию.
Раз у вас настроен CI/CD — попробуйте залить существующий код под шестой паппет, прогоните тесты, поймёте масштаб бедствий. Если тесты не покажут проблем, то переключайте агенты под новый паппет, прогоняйте в режиме noop, смотрите, бомбанёт что-нибудь или нет.

Было бы еще хорошо предоставить «стартовый набор», чтобы можно было поднять папет-мастер + паппетДБ + Хиеру + какой-то Дэшборд (одним манифестом) для новичков (возможно во второй статье). Часто встречал трудности у новичков именно в этом месте (с чего начать).
вот именно, на форже есть каждый компонент по отдельности, а собрать воедино у новичков — тот еще квест, как и просто иметь ПаппетДБ, хотелось бы к ней и «мордочку», чтобы видеть что там происходит

Foreman это такой комбайн, который, насколько мне известно, умеет работать не только с Puppet в качестве бэкэнда.
В случае с Puppet Foreman выступает в роли ENC, про это, как раз, я расскажу в следующей части.

Форман именно что «комбайн», и не всегда оправдано его применение
Еще и с модулями может быть засада — что-то перестало поддерживаться, что-то изменилось.
В настоящий момент я занимаюсь миграцией с одного большого модуля на другой. Оба модуля имеют подмодули с одинаковыми именами ресурсов, что приводит к конфликтам. Я удалил конфликтующие подмодули и теперь получаю ошибку не найденой зависимости. Переименовывать все чохом не хочу, так как кодовая база старая, есть много легаси, которое хотелось бы идентифицировать и удалить. Коллеги сказали, что нормальных инструментов для отслеживания зависимостей нет, придется их определять методом тыка. Это действительно так или все же есть какой-то способ? --debug в командной строке агента полезной информации не дает.

Если хотя бы один из модулей под вашим управлением — поменяйте название конфликтующего ресурса, добавьте туда название модулей, например (см. мой пример с разными провайдерами для пакета).
Про отслеживание зависимостей — так как в терминологии паппета нет понятия "подмодуль", тут нужно уточнить, речь идёт об отдельных модулях-зависимостях (тогда надо смотреть в metadata.json/Puppetfile/Modulefile), или о ресурсах внутри одного модуля, от которых зависят другие ресурсы внутри этого модуля (вообще паппет показывает, в каком именно месте используется необъявленный ресурс)?

Прошу прощения, я имел в виду ресурсы внутри модуля. В качестве примера могу назвать создание пользователя. В старом модуле это было условно core::deploy_user в новом стало base::deploy_user. Оба ресурса создают пользователя deploy и просто добавление модуля base уже приводит к тому, что каталог не собирается. Если удалить core::deploy_user вознкают ошибки из-за того, что ресурс не найден. Используется он во многих модулях и сейчас я просто переименовал его в core::deploy_userNNN, где NNN число уникальное для каждого модуля. Это позволило мне понять, какой именно модуль требует core::deploy_user. Но я надеялся, что есть менее время затартный способ найти используемые зависимости.

Если я правильно понимаю, то ошибка именно из-за дублирования ресурса user { 'deploy': } в старом и новом модуле. Решается эта проблема так:


Есть и другие способы достигнуть идемпотентности при добавлении ресурсов, а именно использование функций defined и ensure_resources...
Да, ошибка из-за дублирования ресурса. Но мне нужно переключить на новый ресурс только те модули, которые сейчас реально используются. Если я просто удалю старый ресурс у меня будет ошибка, что ресурс не найден, но не будет информации как именно модуль пытался его использовать. Я пытаюсь найти способ узнать это без перебора всех зависимостей.
Приветствую, в первую очередь хочу поблагодарить автора за замечательную статью, с нетерпением жду продолжения.
Хотел чисто технический вопрос уточнить. Мне нужно содержимое папки с паппет сервера перекинуть в папку на клиенте. Буду благодарен за помощь.
Мб это не бест практис?
class copy_certs {
file {
  '/home/name/certs':
  ensure  => directory,
  recurse => true,
  mode => '0644',
  owner => 'root',
  group => 'root',
  source => '/etc/puppetlabs/code/environments/ubuntu_vdi_test/modules/files/certs',
}
}


Пробовал добавить в source
source => 'file:///etc/puppetlabs/code/environments/ubuntu_vdi_test/modules/files/certs',
Ошибка всегда одинаковая.
Error: /Stage[main]/Copy_certs/File[/home/name/certs]: Could not evaluate: Could not retrieve information from environment ubuntu_vdi_test source(s) file:///etc/puppetlabs/code/environments/ubuntu_vdi_test/modules/files/certs

А про это я как раз расписал в описании ресурса типа file: https://habr.com/ru/company/avito/blog/507346/#file, конкретно в параметре source.
Если указывать схему file:, то исходные файлы будут браться с той ноды, на которой запускается паппет-агент. Чтобы брать файлы с паппетсервера, нужно использовать схему puppet:, и использовать правильные пути на самом паппетсервере.
Директория /etc/puppetlabs/code/environments/ubuntu_vdi_test/modules/files/certs не прокатит — нужна поддиректория files внутри какого-нибудь модуля. Например, назовём модуль certs, путь на паппетсервере будет /etc/puppetlabs/code/environments/ubuntu_vdi_test/modules/certs/files/certs; чтобы брать файлы по этому пути — используйте source => 'puppet:///modules/certs/certs' (при условии, что окружение ноды — ubuntu_vdi_test).

Спасибо большое! Это помогло!
Sign up to leave a comment.