Puppet 0.25.4在ubuntu上点空白拒绝执行以下命令:
exec {"initiate replica set": command => "echo 'rs.initiate()' | mongo", path => ["/usr/bin","/usr/sbin","/bin"], user => "root", require => Class["mongodb"] }
我可以以root身份执行命令,所以我猜可能是shell的问题。 不幸的是升级木偶不是一种select(无论如何会导致其他问题)。
我已经尝试指定二进制文件的显式path,而不是依赖于path参数,也改变命令:
"bash -c \"echo 'rs.initiate()' | mongo\""
依然不起作用。
有任何想法吗?
我收到一条错误消息,提示“无法从notrun更改为0”
通过运行echo $?查看从根目录运行shell时,实际返回的命令是什么echo $? 在运行实际的命令之后,可能它返回的不是0.如果是这样,你需要改变语句为:
exec {"initiate replica set": command => "echo 'rs.initiate()' | mongo", path => ["/usr/bin","/usr/sbin","/bin"], user => "root", require => Class["mongodb"], returns => $ActualReturnCode }
$ ActualReturnCode是你从echo $?获得的代码echo $? 以root身份运行命令之后。
关于mongodb还有一件事我忘了提及 – 当你安装这个软件包的时候,主mongodb数据库需要一些时间来启动,直到那时你将无法访问它。 因此,这里的解决方法是添加睡眠和一些重试,使得代码如下所示:
exec {"initiate replica set": command => "echo 'rs.initiate()' | mongo", path => ["/usr/bin","/usr/sbin","/bin"], user => "root", require => Class["mongodb"], retries => 5, sleep => 60, }
puppet 3为exec资源types提供了新的语法:
http://docs.puppetlabs.com/references/latest/type.html#exec
因此,LogicWreck和Golja的代码已经过时了。 现在tries retries参数,而sleep参数现在是try_sleep 。
exec { 'rs.initiate()': command => 'echo "rs.initiate()" | mongo', path => ['/usr/bin', '/usr/sbin', '/bin'], user => root, require => Service[mongodb], tries => 5, try_sleep => 60, unless => 'echo "rs.status()" | mongo | grep "members"' }
您可能会考虑在那里使用“除非”或“唯一”参数,以便仅在首次设置副本集时评估资源。
一种方法是:
exec {"initiate replica set": command => mongo admin /path/to/init.js", path => ["/usr/bin","/usr/sbin","/bin"], user => "root", require => Class["mongodb"], sleep => 60, retries => 5, }
其中init.js是:
res = rs.initiate() printjson(res)
如果命令执行没有错误,这将返回0。 使用printjson(res)仅用于开发/debugging模式。 稍后你可以摆脱它。
同样逻辑残骸说确保使用sleep ,因为启动可能需要几秒钟才能完成。