Puppet:仅当值不相等时才执行

Puppet:仅当值不相等时才执行

我有一个脚本,实际上只需要在服务器上运行一次,即在部署时,但我认为最好让 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命令。

相关内容