Як зробити, щоб файл / dir існував умовно у Лялькочку?


18

Я намагаюся записати функцію в лялечку, яка зробить a, failякщо пройдений шлях до каталогу не існує.

if File["/some/path"]завжди повертає істину і if defined(File["/some/path"])повертає істину лише тоді, коли ресурс визначений у ляльці, незалежно від того, існує він насправді.

Чи є спосіб зробити це простим ifтвердженням?

Спасибі


2
Пам'ятайте: маніфести збираються на майстер. Вони нічого не знають про клієнта, крім фактів, які він подає. Тому або напишіть факт, що містить цю інформацію, або зробіть крок назад і скажіть нам, що ви насправді намагаєтеся вирішити, щоб ми могли придумати кращий підхід, ніж твердження if.
Денніс Каарсемейкер

Відповіді:


31

Вирішення цього питання: використовуйте onlyif на "test" exec та вимагайте його у вашій дії, яку ви хочете виконати:

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":}
Dennis Kaarsemaker

1
Спасибі. Це чудово підходить для однієї перевірки dir. Однак я намагаюся перевірити масив каталогів ... Якщо я додаю це до функції, я отримую помилку "не можу повторно визначити".
ddario

6
Відмінна ідея, але це означає, що на кожному запуску ляльок буде повідомлення "Exec [check_presence] / return: успішно виконане", що насправді дратує! Краще було б: exec {'check_presence': command => '/ bin / false', якщо => '/ usr / bin / test -e / path / must / be / available',} Це буде робити те саме, але створить помилку / повідомлення лише тоді, коли шлях насправді не існує.
S0me0ne

2
Все, що спричиняє невдачу "вимагати", призведе до помилки, оскільки те, що має невдачу залежність, будь-то, використовуючи 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
Це запускається лише на майстрі, і це для пошуку файлів у модулях.
бодгіт

Дякую, але ви могли також використовувати його для пошуку файлів в ОС, надавши повний шлях до нього чи ні?
Майк

Тільки на машині, де складається каталог, тобто майстер.
бодгіт

так, правильно.
Майк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.