ubuntu 上的 Puppet 0.25.4 直接拒绝执行以下命令:
exec {"initiate replica set":
command => "echo 'rs.initiate()' | mongo",
path => ["/usr/bin","/usr/sbin","/bin"],
user => "root",
require => Class["mongodb"]
}
我自己可以以 root 身份执行该命令,所以我猜想这可能是 shell 的问题。不幸的是,升级 puppet 不是一个选项(而且无论如何都会导致其他问题)。
我尝试指定二进制文件的明确路径,而不是依赖路径参数,并且还将命令更改为:
"bash -c \"echo 'rs.initiate()' | mongo\""
仍然不起作用。
有任何想法吗?
我收到一条错误消息,内容类似于“无法从 notrun 更改为 0”
答案1
在运行实际命令后,通过运行以 root 身份运行的 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
}
echo $?
其中 $ActualReturnCode 是您以 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,
}
答案2
Puppet 3 对 exec 资源类型有新的语法:
https://puppet.com/docs/puppet/3.8/types/exec.html
因此,LogicWreck 和 Golja 的代码有点过时了。参数retries
是 now tries
,sleep
参数是 now 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"'
}
您可以考虑在其中使用“unless”或“onlyif”参数,以便仅在首次设置副本集时评估您的资源。
答案3
其中一种方法是:
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)
仅用于开发/调试模式。稍后您可以将其删除。
另外正如 Logic Wreck 所说,请务必使用sleep
,因为启动可能需要几秒钟才能完成。