我试图弄清楚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。
答案 0 :(得分:1)
为什么木偶不能理解不是操作符?
!
运算符由shell提供;这不是一个命令。您正在使用Exec
的默认提供程序(posix
),它直接运行您的命令,而不是通过shell运行。 (或者有记录要做。最近有人发现,有时posix
提供程序通过shell运行命令,显然与其文档相矛盾。)
在!
的{{1}}属性中使用Exec
无论如何有点愚蠢,当您可以放弃onlyif
并切换到而是!
属性。并删除重定向,这也依赖于shell。
这是找出某个程序是否已安装且可执行的正确方法吗?
通常最好知道程序是否在特定目标节点上可用,并在必要时确保 可用。如果您必须查询节点状态,那么通常最好通过自定义事实来实现。
话虽如此,我并不认为您的方法本质上是错误的,但当然它只会在unless
中指定的路径中查找所请求的程序。