Вопрос: Как сделать файл / dir условно в Puppet?


Я пытаюсь написать функцию в марионетке, которая сделает fail если путь к переданному каталогу не существует.

if File["/some/path"] всегда возвращает true, и if defined(File["/some/path"]) возвращает только true, если ресурс определен в марионетке, независимо от того, существует ли он на самом деле.

Есть ли способ сделать это с помощью простого if заявление?

благодаря


14
2018-06-19 11:26


Источник




Ответы:


Обходной путь для этого: используйте onlyif для «теста» exec и требуйте его в действии, которое вы хотите выполнить:

exec {"check_presence":
  command => '/bin/true',
  onlyif => '/usr/bin/test -e /path/must/be/available',
}

whatever {"foo...":
  .....
  require => Exec["check_presence"],
}

27
2018-06-19 11:34



О, это зло, мне это нравится :-) - Dennis Kaarsemaker
«зло» - мое второе имя ...;) - Pascal Schmiel
Может быть еще проще: exec {"test -e / path / must / be / available":} - Dennis Kaarsemaker
Благодарю. Это отлично подходит для одной проверки. Тем не менее, я пытаюсь проверить массив каталогов ... Если я добавлю это в функцию, я получаю сообщение об ошибке «can not redeclare». - ddario
Отличная идея, но это означает, что на каждом запуске Puppet появится сообщение «Exec [check_presence] / returns: выполнено успешно», что очень раздражает! Лучше было бы: exec {'check_presence': command => '/ bin / false', если => '/ usr / bin / test -e / path / should / be / available',} Это будет делать то же самое, но будет создавать только сообщение об ошибке / уведомлении, когда путь действительно не существует. - S0me0ne


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


4
2018-06-19 11:29



Это абсолютно правильно. docs.puppetlabs.com/guides/tools.html#puppet-agent-or-puppetd - Dennis Kaarsemaker
Вы абсолютно правы. Спасибо, что нашли время, чтобы найти эту ссылку. Я удалил свой комментарий, чтобы не путать проблему. Однако я хотел бы предложить вам обновить ваш ответ. Манифесты скомпилированный на хозяине, но оцениваются на клиенте. В частности, без этого уточнения механизм функционирования «onlyif» и подобных директив становится неясным. - BMDan


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

exec { 'module_name':
   command => "command to run with variables", # Double quotes for Variable interpolation
   path   => "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:",
   onlyif => 'test -d /mydirectory',
   }

Добавление пути - это то, что действительно сделал трюк для меня. По какой-то причине, даже если я добавил путь к тестовой команде, такой как /bin/test похоже, что это не так.

Надеюсь, это поможет другим, у кого может быть такая же проблема.


0
2018-05-19 16:34