Puppet" onlyif"属性找不到(!)运算符

时间:2016-01-28 14:55:56

标签: node.js puppet redhat

我试图弄清楚Node包PM2是否安装在路径和可执行文件中,或者是否使用以下puppet代码。

 exec { "create symbolic link for pm2":
    cwd => "${pm2_link_dir}",
    path => ['/usr/bin','/bin','/usr/sbin','/sbin'],
    onlyif => "! which node &> /dev/null",
    command => "ln -s ../lib/node_modules/pm2/bin/pm2 pm2"
}

它告诉我找不到命令"!"。这是找出某些程序是否已安装且可执行的正确方法?为什么木偶不能理解不是操作符?我正在研究Redhat master和slave。

1 个答案:

答案 0 :(得分:1)

  

为什么木偶不能理解不是操作符?

!运算符由shell提供;这不是一个命令。您正在使用Exec的默认提供程序(posix),它直接运行您的命令,而不是通过shell运行。 (或者有记录要做。最近有人发现,有时posix提供程序通过shell运行命令,显然与其文档相矛盾。)

!的{​​{1}}属性中使用Exec无论如何有点愚蠢,当您可以放弃onlyif并切换到而是!属性。并删除重定向,这也依赖于shell。

  

这是找出某个程序是否已安装且可执行的正确方法吗?

通常最好知道程序是否在特定目标节点上可用,并在必要时确保 可用。如果您必须查询节点状态,那么通常最好通过自定义事实来实现。

话虽如此,我并不认为您的方法本质上是错误的,但当然它只会在unless中指定的路径中查找所请求的程序。