Кукольный вывод агенту без уведомления - PullRequest
0 голосов
/ 16 ноября 2018

С учетом следующего примера:

[root@puppet ~]# cat notify_test.pp
define test (
  Boolean $condition = false,
) {

  if $condition {
    notify { "Debug Output of Test[${title}]": }
  }
}

$test_resource_name_a = 'A'
test { $test_resource_name_a: 
  condition => true,
}

$test_resource_name_b = 'B'
test { $test_resource_name_b: }



exec { 'TestExec':
  refreshonly => true,
  command     => '/usr/bin/echo "Mock Service Refresh"',
  logoutput   => true,
  subscribe   => Test[$test_resource_name_a, $test_resource_name_b],
}

, который должен только что-то печатать агенту, но, по-видимому, обновляет все подписанные ресурсы из-за ограничения ресурсов (см. https://puppet.com/docs/puppet/4.10/lang_containment.html). нежелательный результат:

[root@puppet ~]# puppet apply notify_test.pp
Notice: Compiled catalog for puppet in environment production in 0.10 seconds
Notice: Debug Output of Test[A]
Notice: /Stage[main]/Main/Test[A]/Notify[Debug Output of Test[A]]/message: defined 'message' as 'Debug Output of Test[A]'
Notice: /Stage[main]/Main/Exec[TestExec]/returns: Mock Service Refresh
Notice: /Stage[main]/Main/Exec[TestExec]: Triggered 'refresh' from 1 events
Notice: Applied catalog in 1.53 seconds

Таким образом, всякий раз, когда выполняется условие (например, моя пользовательская функция, использующая HTTP-клиент для получения данных от API REST, которую я использую, является моим манифестом, но не оказывает реального влияния на компиляцию каталога), все подписчики (например, службы) будутперезапускать каждые 30 минут.

Это поведение недопустимо, так как я могу напечатать что-то в агент Puppet (puppet agent -t) без уведомления / обновления автоматически содержащихся ресурсов?

1 Ответ

0 голосов
/ 16 ноября 2018

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

Но это означает, что с точки зрения Puppet каждый Notify ресурс изменяется каждый раз, когда он применяется.Это генерирует событие, которое передается в контейнер Notify и далее.

Это поведение недопустимо, поэтому как я могу напечатать что-то агенту марионеток (puppet agent -t) без уведомления/ обновить автоматически содержащиеся ресурсы?

Если у вас должны быть сообщения в журнале агента (в отличие от основного), тогда ваши возможности ограничены.На самом деле, лучшее, что я могу придумать, это написать собственный тип ресурса и провайдера, который всегда синхронизирован, но в любом случае отправляет сообщения в журнал.Я протестировал использование Exec с параметром unless, который выдает сообщение, но Puppet, похоже, не печатает вывод команды unless.Конечно, Notify прямо.

Если было бы достаточно отправить сообщение в журнал master , то для этого есть набор функций.Среди них note () , info () и debug () кажутся наиболее вероятными для вашей цели.

Дополнительное примечание : фраза «автономные ресурсы» предполагает, что есть и другой вид.До Puppet 6 вы могли объявить ресурсы в верхней области видимости, и они содержатся только самим каталогом, который не распространяет события ни на что другое.Но каждый ресурс, объявленный внутри контейнера - класс или определенный тип - содержится в этом контейнере.Это всегда казалось мне очень естественным.Обычно вещь, которая вводит людей в заблуждение по поводу сдерживания, состоит в том, что классы содержатся только тогда, когда вы явно делаете это так.Для этого есть веские причины, но я не буду вдаваться в них здесь.

...