我有一个脚本,只需要在服务器上运行一次,即在部署时,但是认为最好是让Puppetpipe理它。 该脚本重新映射与本地系统用户冲突的多个旧版用户标识。
我检查的方式是,如果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时为false的事实有关,但是我认为它更可能是我误解了这种方式作品。
当gopher的uid = 13时,我怎么能做到这一点呢? 我打开替代方法来实现我在这里要完成的事情。
UPDATE
我放弃了回声部分。 最终的工作解决scheme是:
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有助于testing,谢谢@Daniel C. Sobral。 我认为@丹尼尔是被接受的答案,因为这是主要问题,除了我对一些概念的误解外,他还首先回答。 谢谢大家。
你有没有尝试删除echo $? 最后?
这部分将始终使整个事情return 0 。
仅当onlyif指向的命令返回成功( 0 )时,参数onlyif限制进程执行。 例如:
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', }
所以,当文件不存在时,它什么也不做。 当我创build文件时,它会显示一个notice ,表示已执行/bin/echo ok 。
忽略, returns东西。
无论如何,因为你用一个echo结束了onlyif命令,并且echo总是返回成功,那么你的exec总是被执行。 删除该echo ,只留下test命令。