Nano Hash - криптовалюты, майнинг, программирование

Применение одного класса марионеток независимо от сбоев других классов

Дано

манифест/site.pp

...
include foo::bar
include baz::alpha
include baz::beta
include baz::gamma
...

Где

  • foo::bar создает /etc/puppetlabs/puppet/config_file.yaml
  • От foo::alpha до foo::gamma — это настраиваемые типы, которые используют классы puppet_x, для работы которых требуется указанный выше файл, и выдает Puppet::Error, если файл недоступен.
  • Классы с baz::alpha по baz::gamma используют пользовательские типыfoo:beta`` throughfoo:gamma``` для определения ресурсов.

Вопрос

Как я могу гарантировать, что foo::bar будет выполняться до конца независимо от сбоя любого из классов baz?

Я открыт для любых предложений о том, как этого добиться. Предпочтительным решением было бы такое, которое не требует массовой перезаписи для foo пользовательских типов, но если это единственный способ, я это сделаю.

Попытки

  • Использование Class['foo::bar'] -> Class[...] -> ... (штриховая стрелка) для обеспечения порядка применения.
  • Использование Class['foo::bar'] ~> Class[...] -> ... (тильда-стрелка) для обеспечения порядка применения.
  • Добавление autorequire(:file) ко всем пользовательским типам с foo::alpha по foo::gamma.
  • Не оставляя никакой связи между foo::bar и любым другим классом.
  • Попытка catch Puppet:error do err(message) end во всех foo поставщиках пользовательских типов.

Реальная проблема

Я не знал, что Puppet попытается создать экземпляры всех классов, прежде чем применить изменения, которые должен был выполнить любой из них. Даже когда используется «этап», все классы инициализируются до того, как что-либо будет сделано.

Что на самом деле происходило, так это то, что один из пользовательских типов пытался использовать служебный класс Ruby, который зависел от файла конфигурации, который был бы создан классом foo::bar в его собственном методе «инициализации».

Этот служебный класс мог бы привести к катастрофическому сбою, если бы файл конфигурации отсутствовал. Что приведет к обратному каскаду к Puppet и приведет к сбою всего запуска.

25.02.2018

  • Только предложение, поскольку вы не опубликовали полные определения манифеста — я нашел очень полезными параметры before, after, require, notifypuppet.com/blog/class-containment-puppet 25.02.2018
  • Перед и Уведомление функционально эквивалентны стрелке тире и стрелке тильды. (Я думаю, что у меня все получилось правильно.) В любом случае, я нашел настоящий источник проблемы и опубликую ответ, как только подтвержу, что исправление работает. 26.02.2018
  • Я упоминаю до и после именно потому, что это не так. Я знаю, что они должны быть, но у меня были проблемы не раз. Я всегда ненавидел марионеток за это. 26.02.2018

Ответы:


1

Примечание. Я все еще изучаю Puppet, поэтому применяйте эти рекомендации с осторожностью.

На самом деле невозможно заставить класс запускаться полностью перед абсолютно всем остальным, что вы пытаетесь сделать. Puppet всегда инициализирует все используемые вами классы, прежде чем пытаться применить любой из них. Даже если вы используете «стадию», чтобы попытаться решить проблему.

Оглядываясь назад, это должно было быть очевидно. Puppet не может вызывать методы «autorequire», «autobefore», «autoafter» или «autonotify», если он еще не инициализировал экземпляры настраиваемого типа, поэтому он не может завершить упорядочивание до тех пор, пока это не будет сделано.

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

Простой заказ

манифест/site.pp

node default {
...
include foo::bar
include baz::alpha
include baz::beta
include baz::gamma

Class['foo::bar']
-> Class['baz::alpha']
-> Class['baz::beta']
-> Class['baz::gamma']
...
}

Это применит классы в указанном порядке, от 'foo::bar' до 'baz::gamma', если только что-то еще не мешает. Доступны и другие операторы, см. Язык: отношения.

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

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

Этапы

При особых обстоятельствах, с которыми мне еще предстоит столкнуться, может потребоваться убедиться, что определенные классы выполняются до/после всего на «основном» этапе или на любом другом этапе. При использовании этого метода возникают некоторые проблемы, см. раздел Язык: этапы выполнения.

Основная идея заключается в том, что вы можете объявить свои собственные этапы и связать их друг с другом, используя «простые» методы, описанные выше. Затем вы можете назначить классы этапам. Каждый этап будет выполняться в указанном вами порядке, а классы на этом этапе будут выполняться либо в их естественном порядке, либо в любом порядке, который вы указали.

Проблема в том, что вам нужно использовать «ресурсоподобные» спецификации для классов, а не «включать». Это означает, что вы можете указать класс только один раз. Если вы попытаетесь указать его дважды, это вызовет ошибку от Puppet.

module/somewhere/manifest/something.pp

class somewhere::something {
  ...
  include baz::alpha
  include baz::beta
  include baz::gamma

  stage { 'beforemain':
    before => Stage['main'],
  }

  class { 'foo::bar':
    stage => beforemain,
  }

  Class['baz::alpha']
  -> Class['baz::beta']
  -> Class['baz::gama']
}

Класс 'foo::bar' будет применен перед всеми классами 'baz', поскольку он выполняется на этапе 'beforemain', а по умолчанию классы 'baz' выполняются на этапе 'main'. .

Вышеупомянутое будет работать, но если вы добавите следующее:

модуль/в другом месте/манифест/elsewhen.pp

class elsewhere::elsewhen {
  ...
  include foo::bar
  ...
 }

и примените класс 'elsewhere::elsewhen' в том же каталоге, что и 'somewhere::something', вы получите сообщение об ошибке от Puppet.

26.02.2018
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..