如何在Puppet中有条件地存在文件/目录?


18

我试图在puppet中编写一个函数,fail如果传递的目录路径不存在,该函数将执行a 。

if File["/some/path"]始终返回true,并且if defined(File["/some/path"])仅在puppet中定义了资源时才返回true,无论它是否实际存在。

有没有一种简单的方法可以做到这一点if?

谢谢


2
记住:清单在主数据库上编译。除了提交的事实外,他们对客户一无所知。因此,要么写一个包含此信息的事实,要么退一步告诉我们您实际上要解决的问题,因此我们可以提供一种比if语句更好的方法。
— 丹尼斯·卡斯玛克

Answers:


31

解决方法:仅在exec“测试”上使用onlyif,并在您要执行的操作中要求它:

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 2013年

1
谢谢。这非常适合单个目录检查。但是,我正在尝试验证目录数组...如果将其添加到函数中,则会收到“无法重新声明”错误。
— 2013年

6
这是个好主意,但这意味着在每次运行Puppet时,都会出现“ Exec [check_presence] / returns:成功执行”的通知,这真令人讨厌!更好的是:exec {'check_presence':命令=>'/ bin / false',除非=>'/ usr / bin / test -e / path / must / be / available',}这样做是一样的,但是仅当路径确实不存在时才会创建错误/通知。
— S0me0ne 2014年

2
任何导致“需求”失败的东西都会产生错误,因为无论依赖项失败了,无论使用onlyif还是除非......从技术上讲,它可以正常工作,但是您会在p日志中记录很多错误...
— David Gardner

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
这将仅在主服务器上运行,并且用于在模块中查找文件。
— bodgit '19

谢谢,但是您也可以通过提供完整路径来使用它在操作系统上查找文件吗?
— 迈克,

仅在正在编译目录的计算机上,即在主计算机上。
— bodgit '19

是的,这是对的。
— 迈克,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.