我有一个脚本,实际上只需要在服务器上运行一次,即在部署时,但我认为最好让 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
检查的几种不同排列,但代理上的执行者总是被解雇。
当我在命令行上直接运行该命令时,它返回 0 或 1。这可能与 bash 有关为真时返回 0,为假时返回 1,但我认为更有可能是我误解了工作方式onlyif
。
当 gopher 的 uid=13 时,我怎样才能让这个 exec 触发?我愿意用其他方式来实现我在这里试图完成的任务。
更新
我删除了 echo 部分。最终的解决方案是:
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 的答案标记为可接受的答案,因为这是主要问题,除了我对一些概念的误解之外,而且他先回答了。谢谢大家。
答案1
echo $?
最后你尝试删除了吗?
这部分将永远构成整个事物return 0
。
答案2
该参数onlyif
将进程执行限制到 指向的命令onlyif
返回成功时 ( 0
)。例如:
dcs@shadowfax:~/tmp$ ls -l test
ls: cannot access test: No such file or directory
dcs@shadowfax:~/tmp$ ralsh exec "/bin/echo ok" onlyif="/usr/bin/test -f test"
exec { '/bin/echo ok':
returns => ['0'],
}
dcs@shadowfax:~/tmp$ touch test
dcs@shadowfax:~/tmp$ ralsh exec "/bin/echo ok" onlyif="/usr/bin/test -f test"
notice: /Exec[/bin/echo ok]/returns: executed successfully
exec { '/bin/echo ok':
returns => 'notrun',
}
因此,当文件不存在时,它不会执行任何操作。当我创建文件时,它会显示已执行notice
的操作/bin/echo ok
。
别理会那些returns
东西。
无论如何,由于您onlyif
以 结尾命令echo
,并且echo
始终返回成功,因此您的命令exec
始终会被执行。删除它echo
并仅保留test
命令。