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
Über das Projekt

Ansible role to setup and configure MongoDB

Installieren
ansible-galaxy install csuka.mongodb_ubuntu
Lizenz
apache-2.0
Downloads
288
Besitzer
Oui oui