You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB部署后/var/run/mongodb重启消失+Ansible创建admin用户报错求助

MongoDB相关问题解决方案

问题1:重启实例后/var/run/mongodb目录消失

原因

/var/run是基于tmpfs的临时文件系统,系统重启后会被清空。手动创建的目录无法在重启后保留,必须由服务管理进程自动创建。

解决方案

  1. 利用systemd自动管理目录
    MongoDB官方提供的systemd服务文件(通常位于/lib/systemd/system/mongod.service)默认已配置RuntimeDirectory=mongodb,该配置会在mongod服务启动时自动创建/var/run/mongodb目录,并设置正确的权限(mongodb用户/组)。如果你的服务文件没有这项配置,按以下步骤修改:
    • 编辑mongod服务文件:
      sudo nano /lib/systemd/system/mongod.service
      
    • 在[Service]段添加:
      RuntimeDirectory=mongodb
      RuntimeDirectoryMode=0751
      
    • 重新加载systemd配置并重启服务:
      sudo systemctl daemon-reload
      sudo systemctl restart mongod
      
  2. 移除Ansible中手动创建目录的任务
    删除Playbook中Create Directory /var/run/mongodb的任务,避免手动创建与systemd自动创建冲突。

问题2:Ansible添加admin用户失败

排查方向及解决方案

1. 确保临时配置文件禁用认证

检查mongod_init.conf.j2模板,确认security段配置为:

security:
  authorization: disabled

只有禁用认证后,才能无密码连接并创建管理员用户。

2. 使用官方Ansible模块替代Shell命令

既然已安装python3-pymongo,推荐使用community.mongodb.mongodb_user模块管理用户,比Shell命令更可靠且易维护。修改Playbook中用户创建部分:

# 替换原有的认证检查和用户创建任务
- name: 等待MongoDB服务就绪
  community.mongodb.mongodb_ping:
    host: localhost
    port: 27017
  until: result is succeeded
  retries: 10
  delay: 2
  register: result

- name: 在admin库创建root权限的admin用户
  community.mongodb.mongodb_user:
    database: admin
    name: admin
    password: "{{ password }}"
    roles:
      - role: root
        db: admin
    state: present

3. 修复Playbook执行逻辑

  • 移除冗余的Starting MongoDB service任务,因为notify: restart mongodb已会触发服务重启。
  • 确认mongoAuth变量的连接字符串中,密码已通过urlencode()正确转义,且authSource设置为admin。

修改后的关键任务片段

# 安装pymongo后直接使用模块创建用户
- name: 安装PyMongo
  apt:
    update_cache: yes
    name: "python3-pymongo"
    state: "latest"    

# 复制临时无认证配置
- name: 加载临时无认证配置文件
  ansible.builtin.copy:
    src: ../templates/mongodb/mongod_init.conf.j2
    dest: /etc/mongod.conf
    owner: root
    group: root
    mode: '0644'
  notify:
    - restart mongodb

# 等待MongoDB启动完成
- name: 等待MongoDB服务激活
  service:
    name: mongod
    state: started
  register: mongod_service
  until: mongod_service.status.ActiveState == "active"
  retries: 5
  delay: 3

# 创建admin用户
- name: 创建root权限的admin用户
  community.mongodb.mongodb_user:
    database: admin
    name: admin
    password: "{{ password }}"
    roles: ["root"]
    state: present

# 切换到带认证的配置文件
- name: 加载启用认证的配置文件
  ansible.builtin.copy:
    src: ../templates/mongodb/mongod.conf.j2
    dest: /etc/mongod.conf
    owner: root
    group: root
    mode: '0644'
  notify:
    - restart mongodb

内容的提问来源于stack exchange,提问作者brijesh kalavadia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 11:21:07