From d4f673fdc09db901f3b36dafc468523903273bc4 Mon Sep 17 00:00:00 2001
From: nd <git@notandy.de>
Date: Sat, 23 Oct 2021 15:35:18 +0200
Subject: [PATCH] add cluster, user creation and replication setup support

---
 defaults/main.yml        | 18 ++++++++++++++++
 tasks/main.yml           | 35 ++++++++++++++++++++++++++++++++
 templates/mongod.conf.j2 | 44 ++++------------------------------------
 vars/main.yml            |  1 +
 4 files changed, 58 insertions(+), 40 deletions(-)

diff --git a/defaults/main.yml b/defaults/main.yml
index fa84e21..20d087f 100644
--- a/defaults/main.yml
+++ b/defaults/main.yml
@@ -1,5 +1,23 @@
 mongodb:
   version: "4.2"
+  api_user: "{{ omit }}"
+  api_password: "{{ omit }}"
+  config:
+    storage:
+      dbPath: /var/lib/mongodb
+      journal:
+        enabled: true
+    systemLog:
+      destination: file
+      logAppend: true
+      path: /var/log/mongodb/mongod.log
+    net:
+      port: 27017
+      bindIp: 127.0.0.1
+    processManagement:
+      timeZoneInfo: /usr/share/zoneinfo
+    replication:
+      replSetName: rs01
   backup:
     enable: true
     keep_days: 2
diff --git a/tasks/main.yml b/tasks/main.yml
index 8946775..865ce3c 100644
--- a/tasks/main.yml
+++ b/tasks/main.yml
@@ -1,3 +1,8 @@
+- name: install pymongo from pip because the debian version is too old
+  pip:
+    executable: pip3
+    name: pymongo
+
 - name: copy mongodb config
   notify:
   - restart mongodb
@@ -16,6 +21,36 @@
     daemon_reload: yes
     enabled: yes
 
+- name: flush handlers
+  meta: flush_handlers
+
+- name: create replica sets
+  retries: 3
+  delay: 5
+  loop: "{{ mongodb.replicaset|dict2items }}"
+  community.mongodb.mongodb_replicaset:
+    login_host: "{{ mongodb.config.net.bindIp }}"
+    login_port: "{{ mongodb.config.net.port }}"
+    login_user: "{{ mongodb.api_user }}"
+    login_password: "{{ mongodb.api_password }}"
+    replica_set: "{{ item.key|d(mongodb.config.replication.replSetName) }}"
+    members: "{{ item.value.members }}"
+    validate: no
+
+- name: create mongodb user
+  no_log: true
+  loop: "{{ mongodb.user|dict2items }}"
+  community.mongodb.mongodb_user:
+    login_host: "{{ mongodb.config.net.bindIp }}"
+    login_port: "{{ mongodb.config.net.port }}"
+    login_user: "{{ mongodb.api_user }}"
+    login_password: "{{ mongodb.api_password }}"
+    name: "{{ item.key }}"
+    password: "{{ item.value.password }}"
+    roles: "{{ item.value.roles }}"
+    database: "{{ item.value.database|d('admin') }}"
+    replica_set: "{{ item.value.replica_set|d(mongodb.config.replication.replSetName) }}"
+
 - include_tasks: backup.yml
   when:
   - mongodb.backup.enable
diff --git a/templates/mongod.conf.j2 b/templates/mongod.conf.j2
index 64038b0..694832d 100644
--- a/templates/mongod.conf.j2
+++ b/templates/mongod.conf.j2
@@ -2,43 +2,7 @@
 
 # for documentation of all options, see:
 #   http://docs.mongodb.org/manual/reference/configuration-options/
-
-# Where and how to store data.
-storage:
-  dbPath: /var/lib/mongodb
-  journal:
-    enabled: true
-#  engine:
-#  mmapv1:
-#  wiredTiger:
-
-# where to write logging data.
-systemLog:
-  destination: file
-  logAppend: true
-  path: /var/log/mongodb/mongod.log
-
-# network interfaces
-net:
-  port: 27017
-  bindIp: 127.0.0.1
-
-
-# how the process runs
-processManagement:
-  timeZoneInfo: /usr/share/zoneinfo
-
-#security:
-
-#operationProfiling:
-
-replication:
-  replSetName: rs01
-
-#sharding:
-
-## Enterprise-Only Options:
-
-#auditLog:
-
-#snmp:
+#
+# {{ ansible_managed }}
+#
+{{ mongodb.config|to_nice_yaml }}
diff --git a/vars/main.yml b/vars/main.yml
index 96de9b3..b5d38df 100644
--- a/vars/main.yml
+++ b/vars/main.yml
@@ -1,5 +1,6 @@
 packages:
   pkg:
+    "python3-pip": {}
     "mongodb-org": {}
   repos:
     mongodb:
-- 
GitLab