csuka.mongodb_ubuntu
MongoDB
Eine Ansible-Rolle, die MongoDB für Ubuntu 22.04 installiert, konfiguriert und verwaltet.
MongoDB für RHEL-basierte Systeme kann hier gefunden werden.
Bitte lesen Sie diese Datei sorgfältig, bevor Sie diese Ansible-Rolle bereitstellen.
Funktionen
- Anwendung empfohlener Produktionshinweise, z.B. numa und Deaktivierung von transparenten Hugepages
- Bootstrap eines Clusters in einer PSA-Architektur (primär, sekundär, Schiedsrichter)
- umfasst die Clusterüberprüfung
- Sicherung der Verbindung durch Verschlüsselung des Datenverkehrs über eine automatisch generierte Schlüsseldatei
- Installation entweder der Community- oder der Enterprise-Edition
- Einfach zu konfigurieren, mit einer zukunftssicheren Konfigurationsmethode
- Update-Playbook, unterstützt Patchversionen
- Benutzerdefinierte Benutzer hinzufügen
- Benutzerdefinierte Datenbanken hinzufügen
- Backup mit mongodump
- Logrotation, über Mongo eingestellt
Diese Rolle ist idempotent und besteht die Ansible-Lint-Prüfungen.
Kann mit der Ansible-Version 2.9 oder höher verwendet werden. Frühere Versionen könnten ebenfalls unterstützt werden.
Anforderungen
- Gehirn
- Auf dem Controller-Node sicherstellen, dass die mongodb-Sammlung installiert ist
- Die Hosts sollten in der Lage sein, sich gegenseitig zu verbinden, idealerweise über Hostnamen und den eingerichteten Port, standardmäßig 27017
- Stellen Sie sicher, dass ausreichend Speicherplatz für die Datenträger und Backups vorhanden ist, falls eingerichtet
Annahmen
Es gibt mehrere Annahmen, um eine minimale gültige Konfiguration zu gewährleisten. Natürlich deckt es nicht alle Anwendungsfälle ab, aber die meisten. Bitte befolgen Sie dieses README sorgfältig. Als Hinweis, für eine gültige Konfiguration, sehen Sie die Variablendateien im Molekülordner.
Versionierung und Edition
Die Version und Edition können eingestellt werden. Standardmäßig werden das offizielle MongoDB-Repository und der GPG-Schlüssel hinzugefügt.
mongo_repo: true
mongo_version: 6.0
mongo_edition: org # oder enterprise
Bislang unterstützt Ubuntu 22.04 nur MongoDB 6.0 und nicht niedriger.
Kein Protokoll
Standardmäßig ist aus Sicherheitsgründen das Logging für mehrere Aufgaben deaktiviert. Um es zu aktivieren:
mongo_no_log: true
Empfehlungen
Dieser Abschnitt bezieht sich auf die offiziellen Produktionshinweise von MongoDB.
Diese Rolle enthält mehrere Konfigurationsempfehlungen, aber nicht alle. Zum Beispiel: "Deaktivieren Sie atime für das Speichervolumen mit den Datenbankdateien." Solche Aufgaben liegen nicht im Anwendungsbereich dieser Rolle.
Es gibt Aufgaben, die diese Rolle anwendet, wenn sie gesetzt werden, darunter:
- Starten von MongoDB mit numactl, eingestellt in der systemd-Datei
- Deaktivieren von Zone-Reclaim
- Deaktivieren von transparenten Hugepages
- Konfigurieren des Tuned-Profils
Siehe tasks/thp.yml
und tasks/numa.yml
für die tatsächlichen Änderungen am System.
Diese Konfigurationsempfehlungen werden standardmäßig angewendet.
mongo_thp: true
mongo_numa: true
Konfigurationsvariablen
Zuerst, siehe defaults/main.yml
.
Die Konfigurationsdatei befindet sich unter /etc/mongod.conf
.
Die in der Ansible-Konfiguration festgelegten Werte werden genau in die Konfigurationsdatei auf dem Host übernommen. Nur die Schlüssel sind vordefiniert. Beispiel:
# Variable in der Ansible-Konfiguration gesetzt
mongo_operationprofiling:
my_Value:
anotherValue: something
Resultiert in der Konfigurationsdatei auf der Festplatte:
operationProfiling:
my_Value:
anotherValue: something
Wenn der Schlüssel auf einen leeren String gesetzt wird, wird er in der Konfigurationsdatei auf der Festplatte kommentiert.
Die möglichen Schlüssel, die gesetzt werden können, sind:
mongo_systemlog
mongo_storage
mongo_processmanagement
mongo_security
mongo_operationprofiling
mongo_replication
mongo_sharding
mongo_auditlog
mongo_snmp
Es gibt vordefinierte Werte, die Standard für Mongo sind. Falls es gewünscht ist, benutzerdefinierte Schlüssel/Werte zu setzen, verwenden Sie:
mongo_custom_cnf:
my_key:
my_value: true
Autorisierung
Designbedingt werden 3 Benutzer erstellt: admin
, backup
und adminuser
.
Der Admin hat die Rolle root, der Backup-Benutzer hat die Rolle backup und der adminuser hat die Rolle userAdminAnyDatabase.
mongo_admin_pass: 'change_me'
mongo_adminuser_name: adminuser
mongo_adminuser_pass: 'change_me'
Datenbanken und Benutzer
Nehmen Sie Informationen aus der Dokumentation und definieren Sie Ihr eigenes Set von Benutzern/Datenbanken.
Siehe die Dokumentation für die möglichen Rollen.
Benutzer und Datenbanken werden immer über localhost, über Benutzeradmin und Datenbankadmin konfiguriert. Wenn ein Cluster konfiguriert ist, erfolgt die Konfiguration von Datenbank und Benutzern vom primären Host aus.
Setzen mit:
mongo_user:
# in der einfachsten Form
- database: my_db
name: my_user
# Standardwerte
- database: another_db
name: another_user
update_password: on_create
password: "123ABC!PASSWORD_XYZ"
roles: 'readWrite,dbAdmin,userAdmin'
state: present
# Alle möglichen Variablen
- database: my_db
name: someone
password: my_password
update_password: on_create # standardmäßig immer
roles: 'readWrite,dbAdmin,userAdmin' # standardmäßig weggelassen
state: absent # standardmäßig present
ssl: true # standardmäßig weggelassen
ssl_ca_certs: /path/to/ca_certs # standardmäßig weggelassen
ssl_cert_reqs: CERT_REQUIRED # standardmäßig weggelassen
ssl_certfile: /path/to/ssl_certfile # standardmäßig weggelassen
ssl_crlfile: /path/to/ssl_crlfile # standardmäßig weggelassen
ssl_keyfile: /path/to/ssl_keyfile # standardmäßig weggelassen
ssl_pem_passphrase: 'something' # standardmäßig weggelassen
auth_mechanism: PLAIN # standardmäßig weggelassen
connection_options: my_conn_options # standardmäßig weggelassen
create_for_localhost_exception: value # standardmäßig weggelassen
Um die Rolle idempotent zu halten, sollten Sie den Wert für update_password
auf on_create
setzen. Nur wenn tatsächlich ein Passwort aktualisiert wird, setzen Sie ihn auf always
, und wechseln Sie dann zurück auf on_create
.
Clustering
Wenn mehrere Hosts im Play sind, geht Ansible davon aus, dass das Clustering konfiguriert ist.
Clustering in einer PSA-Architektur (primär/sekundär/Schiedsrichter) ist möglich oder ein primär/sekundär/sekundär-Setup.
Aus Sicherheitsgründen wird die Verbindung zwischen den Hosts mit einer Schlüsseldatei gesichert.
Die Schlüsseldatei wird automatisch generiert und als sicher angesehen.
mongo_security:
keyFile: /etc/keyfile_mongo
Ein 2-Host-Cluster ist ein grundsätzlich fehlerhaftes Design, da es keine Verfügbarkeit ohne Quorum aufrechterhalten kann und die Fähigkeit eines Knotens zum Herunterfahren zur Unterstützung der Wiederherstellung erfordert. Wenn genau 2 Hosts im Play sind, ist die Bildung eines Clusters nicht möglich. Mongo wird nicht clusterfähig sein, da eine gültige Anzahl von Mitgliedern der Replikatgruppe vorhanden sein muss.
Es gibt Annahmen, um zu überprüfen, ob eine ungerade Anzahl von Hosts im Play ist.
Konfigurieren mit:
# Setzen Sie die Rolle pro Host in den host_vars
mongo_replication_role: primary # oder secondary, oder arbiter
# In group_vars/all.yml
mongo_replication:
replSetName: something
mongo_security:
keyFile: /etc/keyfile_mongo
Es kann nur 1 primärer und 1 Schiedsrichter gesetzt werden.
Sie sollten das Design des Clusters nicht ändern, nachdem es bereitgestellt wurde, z.B. einen Sekundärknoten in einen Schiedsrichter ändern.
Schiedsrichter
Laut der Dokumentation vermeiden Sie die Bereitstellung von mehr als einem Schiedsrichter pro Replikatgruppe.
Ansible kümmert sich darum, den Schiedsrichter ordnungsgemäß zum Cluster hinzuzufügen.
mongo_replication_role: arbiter
Backup
Das Backup ist so konfiguriert, dass es entweder auf einem einzelnen Host ohne Replikation oder auf dem ersten sekundären Host im Play durchgeführt wird. Es wird mit mongodump
eingerichtet und in cron eingestellt.
Die Backup-Skripte werden nur auf dem ersten anwendbaren sekundären Knoten platziert:
- host1 [primary] <-- Backup-Skripte hier nicht vorhanden
- host2 [secondary] <-- Backup-Skripte hier platziert
- host3 [secondary] <-- Backup-Skripte hier nicht vorhanden
mongo_backup:
enabled: true
dbs:
- admin
- config
- local
user: backup
pass: change_me
path: /var/lib/mongo_backups
owner: mongodb
group: mongodb
mode: '0660'
hour: 2
minute: 5
day: "*"
retention: 46 # in Stunden
Stellen Sie sicher, dass das Passwort des Backup-Benutzers geändert wird und dass der Backup-Benutzer tatsächlich das Backup einer bestimmten Datenbank erstellen kann.
Auf der Festplatte wird das Ergebnis sein:
[root@test-multi-03 mongo_backups]# pwd ; ls -larth
/var/lib/mongo_backups
total 4.0K
drwxr-xr-x. 36 root root 4.0K Jan 20 12:33 ..
lrwxrwxrwx 1 root root 46 Nov 20 12:37 latest -> /var/lib/mongo_backups/mongo_backup_2021-11-20
drw-rw---- 3 mongod mongod 51 Nov 20 12:37 .
drwxr-xr-x 5 root root 77 Nov 20 12:38 mongo_backup_2021-11-20
Logrotation
Bitte lesen Sie die Dokumentation. Stellen Sie sicher, dass die Einstellungen ordnungsgemäß konfiguriert sind.
Aktualisierung
Bevor Sie ein Update durchführen, stellen Sie sicher, dass ordnungsgemäße Tests durchgeführt wurden. Beginnen Sie mit dem Lesen der neuesten Änderungen in den offiziellen Dokumenten.
Es gibt ein separates Update-Playbook, siehe playbooks/update.yml
. Setzen Sie den richtigen Hostnamen ein und führen Sie das Playbook einfach aus.
Updates können einfach für Patchversionen durchgeführt werden, z.B. von 6.0.1 auf 6.0.2. Diese Rolle umfasst keine major-Version-Upgrades aufgrund von brechenden Änderungen bei jeder Veröffentlichung und anderen offensichtlichen Gründen.
Wenn dies gewünscht ist, ist die Logik im Update-Playbook vorhanden, um in der Tat ein großes Upgrade durchzuführen.
Neue Variablen können beim Aktualisieren von Mongo gesetzt werden. Um zu aktualisieren:
mongo_state: latest
# Neue Variablen können beim Aktualisieren von Mongo gesetzt werden
mongo_net:
new_variable: true
Stellen Sie beim Aktualisieren sicher, dass keine Anwendungen in Mongo schreiben. Stellen Sie auch sicher, dass ein Backup vorher erstellt wird.
Aktualisierung eines Replikat-Sets
Wenn ein Replikat-Set aktiv ist, sollte das Cluster nach dem Update aufrechterhalten bleiben. Wie aus der Dokumentation entnommen, werden die folgenden Schritte ausgeführt:
- Cluster-Gesundheit überprüfen, wenn in Ordnung, fortfahren
- Mongo-Anwendung auf dem Schiedsrichter herunterfahren, falls vorhanden
- Mongo auf dem Schiedsrichter aktualisieren
- Konfiguration auf den Schiedsrichter legen
- Mongo auf dem Schiedsrichter starten
- Warten, bis die Cluster-Gesundheit in Ordnung ist
- Mongo-Anwendung auf einem Sekundärknoten herunterfahren
- Mongo auf dem Sekundärknoten aktualisieren
- Konfiguration auf den Sekundärknoten legen
- Mongo auf dem Sekundärknoten starten
- Warten, bis die Cluster-Gesundheit in Ordnung ist
- Wiederholen für verbleibende Sekundärknoten
- Primärknoten zurückstufen
- Mongo auf dem ursprünglichen Primärknoten aktualisieren
- Konfiguration auf dem ursprünglichen Primärknoten legen
- Mongo auf dem ursprünglichen Primärknoten starten
- Warten, bis die Cluster-Gesundheit in Ordnung ist
Aktualisierung einer sharded Umgebung
In Entwicklung.
Entwicklung
- Es gibt ein Zurücksetz-Playbook, um alle Mongo-Dateien zu entfernen. Dies ist nützlich für Entwicklungszwecke, siehe
tasks/reset.yml
. Es ist aus Design kommentiert.
Skalierung
Noch in der Entwicklung... Ich bin mir nicht einmal sicher, ob ich diese Funktionalität jemals benötigen werde, da dies derzeit mit Mongo 5.0 nicht einmal möglich ist. Es ist nicht einfach, die Skalierung in Mongo mit Ansible zu konfigurieren, da die Methode nicht einfach ist.
Bislang habe ich gesehen, dass die Schritte sein sollten:
- Wenn ein Schiedsrichter in der Konfiguration und im System vorhanden ist
- Entfernen Sie den Schiedsrichter aus dem Cluster
- Fügen Sie ein neues sekundäres oder mehrere sekundäre hinzu
- Den Schiedsrichter hinzufügen, falls konfiguriert
Ich habe versucht, dies unzählige Male zu konfigurieren, aber immer aufgrund eines Systemfehlers gescheitert. Ich habe beschlossen, die Skalierung vorerst nicht einzuschließen.
Beispiel Playbook
- hosts:
- mongo_primary
- mongo_secondary
- mongo_arbiter
roles:
- ansible_role_mongodb_ubuntu
any_error_true: true
vars:
mongo_restart_config: true
mongo_restart_seconds: 8
mongo_thp: true
mongo_numa: true
mongo_replication:
replSetName: replicaset1
mongo_security:
authorization: enabled
keyFile: /etc/keyfile_mongo
mongo_admin_pass: something
mongo_adminuser_pass: something
mongo_net:
bindIp: 0.0.0.0
port: 27017
mongo_systemlog:
destination: file
logAppend: true
path: /opt/somewhere/mongod.log
mongo_storage:
dbPath: /opt/mongo/
journal:
enabled: true
mongo_user:
- database: burgers
name: bob
password: 12345
state: present
update_password: on_create
pre_tasks:
# sicherstellen, dass dies erledigt ist
# - name: sicherstellen, dass die Hosts sich über Hostnamen verbinden können
# template:
# src: hosts.j2
# dest: /etc/hosts