Puppet 无法执行命令

Puppet 无法执行命令

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 triessleep参数是 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,因为启动可能需要几秒钟才能完成。

相关内容