我试图编写一个脚本来为使用Powershell的客户部署mongodb(无论Server2016附带什么版本)。我可以作为服务安装并启动并运行得很好,但我还想添加身份验证。具体来说,我想添加一个管理员用户和数据库用户。
最初我使用此powershell函数创建mongod服务:
function createMongoService([string] $mongoDbConfigPath, [string] $serviceName, [string] $storePath, [string] $authCmd)
{
$mongodexe = "$mongoInstallPath\bin\mongod.exe"
Write-Host "Activating Mongod as a service '$serviceName'"
"auth cmd = $authCmd"
& $mongodexe --config "$mongoDbConfigPath" --install --serviceName "$serviceName" --serviceDisplayName "Storfirst MongoDB" --port 27710 --dbpath "$storePath\db" $authCmd
if ($LASTEXITCODE -ne 0)
{
throw "Failed to start service"
}
}
在最初的情况下,$ authCmd是""。查看日志,我可以确认服务是在没有身份验证的情况下启动的。
2018-06-13T16:00:26.600-0700 I CONTROL [initandlisten] **警告: 未对数据库启用访问控制。 2018-06-13T16:00:26.600-0700 I CONTROL [initandlisten] **
对数据和配置的读写访问不受限制。
然后我用这个函数创建mongo用户:
function createAdminUser( [string] $mongoInstallPath, [string] $mongoAdminName, [string] $mongoAdminPass)
{
Write-Host "Creating admin user"
$createAdminCmd = `
"db.createUser( `
{ `
user: `"$mongoAdminName`",
pwd: `"$mongoAdminPass`",
roles: [ { role: `"userAdminAnyDatabase`", db: `"admin`" } ] `
} `
);"
"$createAdminCmd"
& "$mongoInstallPath\bin\mongo.exe" admin --port 27710 --eval "$createAdminCmd"
if ($LASTEXITCODE -ne 0)
{
throw "Failed to create admin user"
}
}
但是这会失败,并在屏幕上显示以下错误(mongodb日志中没有记录任何内容)。 mongoAdminName在此次运行中等于管理员,但如果我使用其他内容,它会使用等效的管理员名称给出相同的结果。
MongoDB shell版本v3.4.15-49-g4ef027f98d连接到: mongodb://127.0.0.1:27710 / admin MongoDB服务器版本: 3.4.15-49-g4ef027f98d 2018-06-13T16:10:00.125-0700 E QUERY [thread1] ReferenceError:未定义管理员:@(shell EVAL):1:17
即使我在powershell中手动输入预期的命令,也会发生这种情况。 我使用类似的命令在我们的自定义mongodb docker容器上创建用户并且没有问题,但在这种情况下我需要一个非容器解决方案。
计划是,一旦我创建了管理员用户,就重新执行createMongoService,这次使用authCmd等于" - auth",然后使用admin用户创建数据库用户标准认证实践。 我的问题是"这里发生了什么?!?"和"我该如何解决这个问题?"
答案 0 :(得分:1)
错误administrator is not defined
实际上是指生成的输出中存在的未加引号的值。基本上这是user
参数,如果您将其更改为"bill"
,则会得到bill is not defined
。所以这不是“MongoDB错误”,而是解释器的JavaScript错误。
这是因为在双引号内插入双引号,所以解决方法是更改引号方案:
$createAdminCmd =
"db.createUser(
{
user: '" + $mongoAdminName + "',
pwd: '" + $mongoAdminPass + "',
roles: [ { role: 'userAdminAnyDatabase', db: 'admin' } ]
}
);"
替代方法是以JavaScript解释器满意的方式转义双引号:
$createAdminCmd =
"db.createUser(
{
user: \`"$mongoAdminName\`",
pwd: \`"$mongoAdminPass\`",
roles: [ { role: \`"userAdminAnyDatabase\`", db: \`"admin\`" } ]
}
);"
然后其余的工作正常。
请记住,即使它“看起来像”你认为你可能只是在键入,但从JavaScript解释器的角度来看,它需要在执行之前“评估”内容,它仍然只是“一个字符串”。因此,相同的规则适用于JavaScript总是插入“字符串”。