【问题标题】:Opening Mongo Shell using Chef使用 Chef 打开 Mongo Shell
【发布时间】:2026-02-16 13:25:02
【问题描述】:

我正在使用 chef 脚本来安装 mongo,配置复制并运行一些数据库初始化脚本 (load("initializeScript.js"))

Mongo 现在安装没有任何问题,但是为了配置副本成员,我需要打开 mongo shell 并运行如下命令:

rs.initiate() and rs.add("SERVER DETAILS")

我正在尝试这样做

 mongo_shell_command = 'mongo -ssl --sslPEMKeyFile ' +node['mongo']['ssl']['dir'] +node['hostname'] + '.pem --sslCAFile ' + node['mongo']['ssl']['dir'] + node['mongo']['cert'] + ' --sslAllowInvalidHostnames'

execute 'mongo_shell' do
        command mongo_shell_command
    end

    execute 'mongo_replicaSet' do
        command "mongo --eval rs.execute()"
        only_if { ::File.exist?(node['mongo']['config']) }
    end
execute 'initialize_db' do
             command "mongo --eval \"load(\"initializeScript.js\")\""
            cwd node['mongo']['script']['dir']
        end

但这失败了。

有没有其他方法可以使用 chef 打开 mongo shell 并执行这些命令

【问题讨论】:

    标签: mongodb chef-infra chef-recipe cookbook mongo-shell


    【解决方案1】:

    您所拥有的可以稍微清理一下,但总体而言,您的想法是正确的。你可以传入一个命令文件来运行,而不是使用load(),你可以只做mongo initializeScript.js。为了简单起见,您可能希望将所有三个初始化命令合并为一件事,但这取决于您。

    【讨论】:

      【解决方案2】:

      经过一番研发,我想出了办法。

      1. 无需专门打开 mongo shell。
      2. 最后使用--eval,直接运行命令。
      3. 需要提供延迟 资源,因为在 mongo 中初始化需要几秒钟。

      【讨论】:

      • 注意:运行函数需要单引号,例如command "mongo --eval 'db.serverStatus().storageEngine'"