MongoDB部署后/var/run/mongodb重启消失+Ansible创建admin用户报错求助
MongoDB相关问题解决方案
问题1:重启实例后/var/run/mongodb目录消失
原因
/var/run是基于tmpfs的临时文件系统,系统重启后会被清空。手动创建的目录无法在重启后保留,必须由服务管理进程自动创建。
解决方案
- 利用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
- 编辑mongod服务文件:
- 移除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
相关产品推荐
相关产品推荐

