添加管理员用户并使用ansible启用身份验证后,我无法登录mongodb

添加管理员用户并使用ansible启用身份验证后,我无法登录mongodb,mongodb,ansible,Mongodb,Ansible,我想保护我的mongo db,我正试图用ansible和stackoverflow来解决这个问题: 我正在使用mongo v4.0.9。这是我剧本的相关部分: - name: Add mongo admin user mongodb_user: database: admin name: creds['mongo_admin_stg']['user'] password: creds['mongo_admin_stg']['pass'] state: pres

我想保护我的mongo db,我正试图用ansible和stackoverflow来解决这个问题: 我正在使用mongo v4.0.9。这是我剧本的相关部分:

- name: Add mongo admin user
  mongodb_user:
    database: admin
    name: creds['mongo_admin_stg']['user']
    password: creds['mongo_admin_stg']['pass']
    state: present
    roles: root
creds:
  mongo_admin_stg:
    user: admin
    password: ThePasW0ord
  mongo_admin_prod:
    user: god
    password: S3cr3tHeaven
  #...#
当我运行我的剧本时,没有错误。然后我加上几行

security:
  authorization: enabled
。。。到我的
/etc/mongod.conf

我在CentOS7服务器上运行mongod,因此我重新启动mongo服务,如下所示:

systemctl restart mongod.service
然后我尝试得到一个mongo shell,如下所示:

mongo tool-001:27017 -uadmin -pThePasW0ord  --authenticationDatabase "admin"
但我得到了这个错误信息:

2019-05-13T20:54:31.864+0000 E QUERY    [js] Error: Authentication failed. :
更新:如果我在运行playbook之后,在重新启动mongod服务之前打开MongoShell,我会发现
admin
数据库中没有集合:

> use admin
switched to db admin
> show collections
>
我错过了什么

更新:根据Zeitounator的回答。我决定对用户名和密码进行硬编码,看看是否会创建
admin
用户。所以我把我的剧本改成:

- name: Add mongo admin user
  mongodb_user:
    database: "admin"
    # name: "{{ creds['mongo_admin_stg']['user'] }}"
    # password: "{{ creds['mongo_admin_stg']['pass'] }}"
    # name: "{{ creds.mongo_admin_stg.user }}"
    # password: "{{ creds.mongo_admin_stg.pass }}"
    name: admin
    password: password
    state: present
    roles: root

我运行我的playbook,它没有错误地完成了,但是如果我在更新我的
/etc/mongod.conf
之前打开mongo shell,在重新启动
mongod
服务器之前,我仍然在
admin
数据库中看不到任何集合。

根据您的问题,我猜您之前在playbook中声明了一个变量:

- name: Add mongo admin user
  mongodb_user:
    database: admin
    name: creds['mongo_admin_stg']['user']
    password: creds['mongo_admin_stg']['pass']
    state: present
    roles: root
creds:
  mongo_admin_stg:
    user: admin
    password: ThePasW0ord
  mongo_admin_prod:
    user: god
    password: S3cr3tHeaven
  #...#

(侧注:如果这是你所做的,请查看并考虑加密敏感数据)

您只是遇到了一个问题(即,您没有使用它):您实际上是在声明要使用的变量的名称(作为基本标量),而不是用它的值替换它

这是正确的语法:

- name: Add mongo admin user
  mongodb_user:
    database: admin
    name: "{{ creds['mongo_admin_stg']['user'] }}"
    password: "{{ creds['mongo_admin_stg']['pass'] }}"
    state: present
    roles: root
请注意,您可以使用点表示法,在这种情况下,点表示法相当于一种可能更可读的表示法

    name: "{{ creds.mongo_admin_stg.user }}"
    password: "{{ creds.mongo_admin_stg.pass }}"
编辑:上面的内容是固定的,肯定是一个拦截器,但您仍然被卡住了。我的蒙哥知识是零。不过,以下是我所做的和成功的

  • 我在我的机器上启动了一个mongodb docker容器
  • 我从本地主机(以容器中打开的端口为目标)运行了上述ansible任务。这是一次成功

  • 我在容器中登录,启动mongo shell,选择admin db。。。并发布了一个帮助。。。我注意到有一个
    show users
    命令可用。这将返回新创建的用户


  • 我刚刚在一个新创建的容器上再次尝试,但用户不在那里。所以我确信ansible任务正在创建它。

    谢谢你的回答,但是
    admin
    用户仍然没有被创建。请查看我的更新。我能够在docker容器上成功完成您的步骤。。。编辑来了。(注意:如果你用我的mongo知识除以任何数字,你会得到一个运行时错误:))啊
    show users
    出于某种原因,我以为会在
    admin
    数据库中创建集合。现在我有一帮奇怪的管理员用户,我必须清理:)