我有一个脚本,实际上只需要在服务器上运行一次,即在部署时,但我认为最好让 Puppet 管理它。该脚本重新映射了几个与本地系统用户冲突的旧用户 ID。
我检查这个的方法是 gopher 用户是否具有默认 uid 13。如果是这样,那么我需要运行我的重新映射脚本。
exec { "change_uid":
command => "/script/to/run.sh",
provider => 'shell',
path => [ "/bin", "/sbin", "/usr/bin", "/usr/sbin", "/usr/local/bin", "/usr/local/sbin" ],
onlyif => "test `/usr/bin/id -u gopher` -eq 13; echo $?",
}
我已经尝试了上述onlyif
检查的几种不同排列,但 exec 总是被代理人解雇。
当我直接在命令行上运行该命令时,它返回 0 或 1。这可能与 bash在 true 时返回 0 而在 false 时返回 1这一事实有关,但我认为更有可能是我误解了onlyif
工作方式.
当 gopher 的 uid=13 时,我怎样才能让这个 exec 启动?我愿意接受其他方法来实现我在这里想要完成的事情。
更新
我放弃了回声部分。最终的工作解决方案是:
exec { "change_uid":
command => "/script/to/run.sh",
path => [ "/bin", "/sbin", "/usr/bin", "/usr/sbin", "/usr/local/bin", "/usr/local/sbin" ],
onlyif => "test `id -u gopher` -eq 13",
}
使用ralsh
命令有助于测试,感谢@Daniel C. Sobral。我将@Daniel 标记为已接受的答案,因为这是主要问题,除了我对一些概念的误解,而且他首先回答了问题。谢谢大家。
您是否尝试在最后删除
echo $?
?那部分总是会成为整个事情
return 0
。该参数
onlyif
将流程执行限制为当指向的命令onlyif
返回成功(0
)时。例如:因此,当文件不存在时,它什么都不做。当我创建文件时,它会显示已执行
notice
的效果/bin/echo ok
。忽略那些
returns
东西。无论如何,由于您以 结束
onlyif
命令echo
,并且echo
总是返回成功,那么您exec
总是会被执行。删除它echo
并仅保留test
命令。