如何在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.