一.准备环境:
1.centos7 环境
2.安装ansible环境
3.mongodb二进制文件:可以先用yum安装拿取需要mongodb二进制文件,也可以在官网下载
mongod, mongodump,mongoexport, mongofiles,mongoimport,mongorestore,mongos,mongosh,mongostat
4.mongodb安装主机,作者用192.168.126.128,192.168.126.129,192.168.126.130三台服务器作为mongodb副本集安装环境
二.规划:
1.变量规划:
安装路径:mongodb_dir: /kingdee/mongodb
监听端口:mongodb_port: 27017
运行用户:mongodb_start_user: yzj
用户名称:mongodbuser: yzjuser
用户密码:mongodbpass: Mytest@@@@@@1203
集群IP: mongodb_ip: 192.168.126.128,192.168.126.129,192.168.126.130
实例名称: mongodb_instance: datacore
2.mongodb目录规划:
数据目录:/kingdee/mongodb/27017/data
执行文件:/kingdee/mongodb/27017/bin
日志文件:/kingdee/mongodb/27017/logs
3.集群规划:
192.168.126.128,192.168.126.129,192.168.126.130
主:192.168.126
从:192.168.126.129
仲裁:192.168.126.130
三.编写ansible-playbook:
1.创建ansible-playbook目录:
mkdir -p roles/mongodb_cluster/{files,tasks,templates,vars}
2.模板文件配置:
cd roles/mongodb_cluster/templates
#集群认证模板文件
vim cluster_mongodb_auth.conf.j2
systemLog:
  destination: file
  logAppend: true
  path: /kingdee/mongodb/{{mongodb_instance}}/logs/mongod.log
storage:
  dbPath:  /kingdee/mongodb/{{mongodb_instance}}/data
  journal:
    enabled: true
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /kingdee/mongodb/{{mongodb_instance}}/mongod.pid
  timeZoneInfo: /usr/share/zoneinfo
net:
  port: {{mongodb_port}}
  bindIp: 0.0.0.0
replication:
  replSetName: commanrs
security:
  authorization: enabled
  keyFile: {{mongodb_dir}}/{{mongodb_instance}}/bin/keyfile
  clusterAuthMode: "keyFile"#集群无需认证模板文件
vim cluster_mongodb_unauth.conf.j2
systemLog:
  destination: file
  logAppend: true
  path: /kingdee/mongodb/{{mongodb_instance}}/logs/mongod.log
storage:
  dbPath:  /kingdee/mongodb/{{mongodb_instance}}/data
  journal:
    enabled: true
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /kingdee/mongodb/{{mongodb_instance}}/mongod.pid
  timeZoneInfo: /usr/share/zoneinfo
net:
  port: {{mongodb_port}}
  bindIp: 0.0.0.0
replication:
  replSetName: commanrs
#security:
#  authorization: enabled
#  keyFile: {{mongodb_dir}}/{{mongodb_instance}}/bin/keyfile
#  clusterAuthMode: "keyFile"#集群启停脚本文件
vim cluster_mongodb.start.sh.j2
start(){
{{mongodb_dir}}/{{mongodb_instance}}/bin/mongod -f  {{mongodb_dir}}/{{mongodb_instance}}/bin/{{mongodb_port}}.conf
}
stop(){
{{mongodb_dir}}/{{mongodb_instance}}/bin/mongod -f  {{mongodb_dir}}/{{mongodb_instance}}/bin/{{mongodb_port}}.conf --shutdown
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 10
start
;;
*)
echo "Only param { start|stop|restart } is supported !"
esac3.二进制文件拷贝到files:
cd roles/mongodb_cluster/files
将文件copy到files目录下:
mongod, mongodump,mongoexport, mongofiles,mongoimport,mongorestore,mongos,mongosh,mongostat

4.编写tasks文件
cd roles/mongodb_cluster/tasks
vim installmongodb.yml
---
- name: "gourpadd start user"
  group:
    name:  "{{mongodb_start_user}}"
    gid:   "9999"
    state: "present"
  ignore_errors: yes
- name: "useradd start user"
  user:
    name:  "{{mongodb_start_user}}"
    uid:   "9999"
    group: "{{mongodb_start_user}}"
  ignore_errors: yes
- name: "mkdir {{mongodb_dir}}/{{mongodb_instance}}/bin"
  file:
    path:  "{{mongodb_dir}}/{{mongodb_instance}}/{{item}}"
    state: "directory"
    owner: "{{mongodb_start_user}}"
    group: "{{mongodb_start_user}}"
    mode:  0755
    recurse: yes
  with_items:
    - data
    - logs
    - bin
  ignore_errors: yes
- name: "copy mongodb bin to {{mongodb_dir}}/{{mongodb_instance}}/bin"
  copy:
    src:  "{{item}}"
    dest: "{{mongodb_dir}}/{{mongodb_instance}}/bin/{{item}}"
  with_items:
    - mongod
    - mongodump
    - mongoexport
    - mongofiles
    - mongoimport
    - mongorestore
    - mongos
    - mongosh
    - mongostat
    - mongotop
- name: "chown -R {{mongodb_start_user}}:{{mongodb_start_user}} kingdee/mongodb/27017"
  shell: |
    chown -R {{mongodb_start_user}}:{{mongodb_start_user}} {{mongodb_dir}}/{{mongodb_instance}}
    chmod -R 755 {{mongodb_dir}}
- name: "mongodb keyfile insert"
  shell: |
     echo "Ir3K9pY2bC+JPhGTnp/XscZjbRDTzjHtBCUQ717+soZdSZz1Eq8y3mA6c2H4No+f" >> {{mongodb_dir}}/{{mongodb_instance}}/bin/keyfile
     chmod 400 {{mongodb_dir}}/{{mongodb_instance}}/bin/keyfile
- name: "copy mongodb config to  {{mongodb_dir}}/{{mongodb_instance}}/bin"
  template:
    src:  cluster_mongodb_unauth.conf.j2
    dest: "{{mongodb_dir}}/{{mongodb_instance}}/bin/{{mongodb_port}}_unauth.conf"
    force: yes
- name: "copy mongodb config to  {{mongodb_dir}}/{{mongodb_instance}}/bin"
  template:
    src:  cluster_mongodb_auth.conf.j2
    dest: "{{mongodb_dir}}/{{mongodb_instance}}/bin/{{mongodb_port}}.conf"
    force: yes
- name: "copy mongodb start shell to {{mongodb_dir}}/{{mongodb_instance}}/bin/{{mongodb_port}}.conf"
  template:
    src: cluster_mongodb.start.sh.j2
    dest: "{{mongodb_dir}}/{{mongodb_instance}}/bin/start_mongodb_{{mongodb_port}}.sh"
    force: yes
- name:  "start mongodb"
  shell: "{{mongodb_dir}}/{{mongodb_instance}}/bin/mongod -f {{mongodb_dir}}/{{mongodb_instance}}/bin/{{mongodb_port}}_unauth.conf "vim initiate.yml
- name: "initiate mongodb cluster"
  shell: |
     {{mongodb_dir}}/{{mongodb_instance}}/bin/mongosh --port {{mongodb_port}} --host {{ansible_ssh_host}} admin --eval 'rs.initiate({_id: "commanrs",members: [{ _id: 0,host: "{{mongodb_ip.split(",")[0]}}:27017"},{ _id: 1,host: "{{mongodb_ip.split(",")[1]}}:27017"},{ _id: 2,host: "{{mongodb_ip.split(",")[2]}}:27017","arbiterOnly":true }]})'
  when: ansible_ssh_host == "{{mongodb_ip.split(',')[0]}}"
  ignore_errors: yes
- name: "sleep 20s for wating initate !!"
  shell: sleep 20vim createUser.yml
---
- name: "create mongodbuser for mongodb"
  shell: |
     {{mongodb_dir}}/{{mongodb_instance}}/bin/mongosh --port {{mongodb_port}} --host {{ansible_ssh_host}} admin --eval  'db.createUser({user:"{{mongodbuser}}",pwd:"{{mongodbpass}}",roles:[{role:"root",db:"admin"}]})'
  when: ansible_ssh_host == "{{mongodb_ip.split(',')[0]}}"
  ignore_errors: yes
- name: "sleep 20 s for waiting mongodb cluster initiate"
  shell: sleep 20
- name: "remove unauth.config"
  file:
    path:  "{{mongodb_dir}}/{{mongodb_instance}}/bin/{{mongodb_port}}_unauth.conf "
    state: absent
- name: "stop mongodb seconde"
  shell: |
    sh  {{mongodb_dir}}/{{mongodb_instance}}/bin/start_mongodb_{{mongodb_port}}.sh stop
  when: ansible_ssh_host == "{{mongodb_ip.split(',')[2]}}"
- name: "stop mongodb seconde"
  shell: |
    sh  {{mongodb_dir}}/{{mongodb_instance}}/bin/start_mongodb_{{mongodb_port}}.sh stop
  when: ansible_ssh_host == "{{mongodb_ip.split(',')[1]}}"
- name: "restart mongodb seconde"
  shell: |
    sh  {{mongodb_dir}}/{{mongodb_instance}}/bin/start_mongodb_{{mongodb_port}}.sh restart
  when: ansible_ssh_host == "{{mongodb_ip.split(',')[0]}}"
- name: "start mongodb seconde"
  shell: |
    sh  {{mongodb_dir}}/{{mongodb_instance}}/bin/start_mongodb_{{mongodb_port}}.sh start
  when: ansible_ssh_host != "{{mongodb_ip.split(',')[0]}}"vim main.yml
---
- include_tasks: installmongodb.yml
- include_tasks: initiate.yml
- include_tasks: createUser.ymltasks目录文件如下:

四.编写hosts文件,与roles文件在同级目录:
vim hosts
[mongodb-cluster]
mongodb-master ansible_ssh_host=192.168.126.128
mongodb-node   ansible_ssh_host=192.168.126.129
mongodb-arb    ansible_ssh_host=192.168.126.130五.编写运行yml文件,与roles文件在同级目录:
vim startinstall_cluster_mongodb.yml
---
- hosts: mongodb_cluster
  remote_user: yzj
  #become_method: sudo
  #$become_user: root
  #$become: yes
  gather_facts: no
  vars:
    - mongodb_dir: /kingdee/mongodb
    - mongodb_port: 27017
    - mongodb_start_user: yzj
    - mongodbuser: yzjuser
    - mongodbpass: Mytest@@@@@1203
    - mongodb_ip: 192.168.126.128,192.168.126.129,192.168.126.130
    - mongodb_instance: datacore
  roles:
    - role: mongodb_cluster总体ansible-playbook目录如图所示【忽略rpm目录部分】:

六.ansible执行mongodb安装,最好在roles同级目录执行;
ansible-playbook -i hosts startinstall_cluster_mongodb.yml
七.执行完成后连接mongodb进行相关测试:
/kingdee/mongodb/27017/bin/mongosh --port 27017 admin
admin> db.auth("yzjuser","Mytest@@@@@1203")
admin>rs.status()

至此,ansible-playbook部署mongodb副本集已完成,下面会讲到mongodb分片使用ansible-playbook进行部署










