Как сделать файл / каталог существует условно в Puppet?

18

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

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

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

Благодарность

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

Ответы:

31

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

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

whatever {"foo...":
  .....
  require => Exec["check_presence"],
}
Паскаль Шмиль
источник
5
О, это зло, мне это нравится :-)
Деннис Каарсемейкер
1
Может быть еще проще: exec {"test -e / path / must / be / available":}
Деннис Каарсемакер
1
Благодарю. Это прекрасно работает для одной проверки DIR. Тем не менее, я пытаюсь проверить массив каталогов ... Если я добавлю это в функцию, я получу сообщение об ошибке «невозможно переопределить».
Ддарио
6
Отличная идея, но это означает, что при каждом запуске Puppet будет уведомление «Exec [check_presence] / Returns: успешно выполнено», что действительно раздражает! Лучше было бы: exec {'check_presence': command => '/ bin / false', если только => '/ usr / bin / test -e / path / must / be / available',} Это будет делать то же самое, но создаст ошибку / уведомление только тогда, когда путь действительно не существует.
S0me0ne
2
Все, что приводит к сбою «require», приведет к ошибке, поскольку все, что имеет ошибочную зависимость, используется ли onlyif илиак если ... Так что технически это работает, но вы получите много ошибок, зарегистрированных в ваших журналах марионеток ...
Дэвид Гарднер
0

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

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

Вы также можете использовать встроенную функцию find_file () для нее ... она возвращает undef, когда файл / путь не существует, и строку, если она существует.

https://puppet.com/docs/puppet/5.5/function.html#findfile

Майк
источник
1
Это будет работать только на мастере, и это для поиска файлов в модулях.
бодгит
Спасибо, но вы также можете использовать его для поиска файлов в ОС, указав полный путь к нему или нет?
Майк
Только на машине, на которой составляется каталог, т.е. на мастере.
боджит
Да все верно.
Майк