mongodb_ubuntu

MongoDB

Роль Ansible, которая устанавливает, настраивает и управляет MongoDB для Ubuntu 22.04.

MongoDB для RHEL-подобных версий можно найти здесь.

Пожалуйста, внимательно прочитайте этот файл перед развертыванием этой роли Ansible.

Функциональные возможности

  • Применяет рекомендуемые производственные заметки, например, numa и отключает прозрачные большие страницы
  • Инициализация кластера в архитектуре PSA (первичный, вторичный, арбитр)
    • включает проверку кластера
  • Обеспечивает защиту соединения шифрованием трафика через автоматически сгенерированный ключ
  • Установка как Community, так и Enterprise версий
  • Легкая конфигурация, с устойчивым методом настройки
  • Обновление плейбука, поддерживает патчи
  • Добавление пользователей, определяемых пользователем
  • Добавление баз данных, определяемых пользователем
  • Резервное копирование с помощью mongodump
  • Ротация логов, устанавливается из Mongo

Эта роль идемпотентна и проходит проверки ansible-lint.
Можно использовать с версиями Ansible от 2.9 до последней. Возможно, поддерживает более ранние версии.

Требования

  • Ум
  • На управляющем узле убедитесь, что установлена коллекция mongodb
  • Узлы должны иметь возможность подключаться друг к другу, желательно используя имена хостов, и установленный порт, по умолчанию 27017
  • Убедитесь, что на диске достаточно места для данных и резервной копии, если это предусмотрено

Утверждения

Есть несколько утверждений для обеспечения минимальной действительной конфигурации. Конечно, это не охватывает все варианты использования, но большинство из них. Пожалуйста, внимательно следуйте этому readme. В качестве подсказки для действительной конфигурации смотрите файлы переменных в папке молекул.

Версии и редакции

Версия и редакция могут быть заданы. По умолчанию добавляется официальный репозиторий mongodb и gpg ключ.

mongo_repo: true
mongo_version: 6.0
mongo_edition: org  # или enterprise

На данный момент Ubuntu 22.04 поддерживает только MongoDB 6.0 и не ниже.

Без логирования

По умолчанию, по соображениям безопасности, логирование для нескольких задач отключено. Чтобы включить его:

mongo_no_log: true

Рекомендации

Этот раздел относится к официальным производственным заметкам MongoDB.

Эта роль включает несколько рекомендаций по конфигурации, но не все. Например: "Выключите atime для тома хранения, содержащего файлы базы данных." Такие задачи выходят за рамки этой роли.

Есть задачи, которые эта роль применяет, если они указаны, это:

  • Запуск MongoDB с numactl, заданным в файле systemd
  • Отключение зонного восстановления
  • Отключение прозрачных больших страниц
  • Настройка профиля Tuning

Смотрите tasks/thp.yml и tasks/numa.yml для фактических изменений в системе.

Эти рекомендации по конфигурации применяются по умолчанию.

mongo_thp: true
mongo_numa: true

Переменные конфигурации

Сначала смотрите defaults/main.yml.

Файл конфигурации находится по адресу /etc/mongod.conf.

Значения, установленные в конфигурации Ansible, устанавливаются точно в файл конфигурации на узле. Только ключи предопределены. Пример:

# Переменная, установленная в конфигурации Ansible
mongo_operationprofiling:
  my_Value:
    anotherValue: something

Это приведет к содержимому файла конфигурации на диске:

operationProfiling:
  my_Value:
    anotherValue: something

Если ключ установлен в пустую строку, он будет закомментирован в файле конфигурации на диске.

Возможные ключи для установки:

mongo_systemlog
mongo_storage
mongo_processmanagement
mongo_security
mongo_operationprofiling
mongo_replication
mongo_sharding
mongo_auditlog
mongo_snmp

Существуют предопределенные значения, которые являются значениями по умолчанию для Mongo. Если по какой-то причине необходимо установить пользовательские ключи/значения, используйте:

mongo_custom_cnf:
  my_key:
    my_value: true

Автоматизация

По умолчанию создаются 3 пользователя: admin, backup и adminuser. Администратор имеет роль root, пользователь резервного копирования имеет роль backup, а adminuser имеет роль userAdminAnyDatabase.

mongo_admin_pass: 'change_me'
mongo_adminuser_name: adminuser
mongo_adminuser_pass: 'change_me'

Базы данных и пользователи

Следуя документации, определите свой собственный набор пользователей/баз данных.

Смотрите документацию для возможных ролей.

Пользователи и базы данных всегда настраиваются через localhost, через администратора пользователей и администратора базы данных. Когда кластер настроен, конфигурация баз данных и пользователей выполняется с первичного узла.

Настройте с помощью:

mongo_user:
# в самом простом виде
  - database: my_db
    name: my_user

# стандартные значения
  - database: another_db
    name: another_user
    update_password: on_create
    password: "123ABC!PASSWORD_XYZ"
    roles: 'readWrite,dbAdmin,userAdmin'
    state: present

# все возможные переменные
  - database: my_db
    name: someone
    password: my_password
    update_password: on_create             # по умолчанию всегда
    roles: 'readWrite,dbAdmin,userAdmin'   # по умолчанию опущено
    state: absent                          # по умолчанию present
    ssl: true                              # по умолчанию опущено
    ssl_ca_certs: /path/to/ca_certs        # по умолчанию опущено
    ssl_cert_reqs: CERT_REQUIRED           # по умолчанию опущено
    ssl_certfile: /path/to/ssl_certfile    # по умолчанию опущено
    ssl_crlfile: /path/to/ssl_crlfile      # по умолчанию опущено
    ssl_keyfile: /path/to/ssl_keyfile      # по умолчанию опущено
    ssl_pem_passphrase: 'something'        # по умолчанию опущено
    auth_mechanism: PLAIN                  # по умолчанию опущено
    connection_options: my_conn_options    # по умолчанию опущено
    create_for_localhost_exception: value  # по умолчанию опущено

Чтобы сохранить роль идемпотентной, вы должны установить значение для update_password в on_create. Только когда вы фактически обновляете пароль, установите его в always, а затем переключитесь обратно на on_create.

Кластеризация

Когда в плей включено несколько узлов, Ansible предполагает, что кластер уже настроен.

Кластеризация в архитектуре PSA (первичный/вторичный/арбитр) возможна, или настройка первичный/вторичный/вторичный.

По соображениям безопасности соединение между узлами защищено с помощью ключа.

Ключ автоматически генерируется и считается безопасным.

mongo_security:
  keyFile: /etc/keyfile_mongo

Кластер из 2 узлов является fundamentally broken design, так как он не может поддерживать работоспособность без кворума и возможности узла выйти из строя, чтобы помочь восстановлению. Когда в плей есть ровно 2 узла, формирование кластера невозможно. Mongo не создаст кластер, потому что должно быть валидное число членов репликационного набора.

Есть утверждения, чтобы проверить, есть ли нечетное количество узлов в плей.

Настройка:

# установите роль для каждого узла в host_vars
mongo_replication_role: primary # или secondary, или arbiter

# в group_vars/all.yml
mongo_replication:
  replSetName: something
mongo_security:
  keyFile: /etc/keyfile_mongo

Может быть установлен только 1 первичный и 1 арбитр.

Не следует изменять конструкцию кластера после его развертывания, например, изменять вторичный на арбитр.

Арбитр

Согласно документации, избегайте развертывания более чем одного арбитра на репликационный набор.

Ansible позаботится о правильном добавлении арбитра в кластер.

mongo_replication_role: arbiter

Резервное копирование

Резервное копирование настраивается либо на одном узле без репликации, либо на первом вторичном узле в плей. Выполняется с помощью mongodump, установленного в cron.

Скрипты резервного копирования только размещены на первом применимом вторичном узле:

- host1 [primary]   <-- скрипты резервного копирования отсутствуют здесь
- host2 [secondary] <-- скрипты резервного копирования размещены здесь
- host3 [secondary] <-- скрипты резервного копирования отсутствуют здесь
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  # в часах

Не забудьте изменить пароль пользователя резервного копирования и разрешить ему фактически выполнять резервное копирование заданной базы данных.

На диске результат будет:

[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

Ротация логов

Пожалуйста, прочитайте документацию. Убедитесь, что настройки настроены правильно.

Обновление

Перед обновлением убедитесь, что тестирование проведено должным образом. Начните с чтения последних изменений в официальной документации.

Существует отдельный плейбук обновления, смотрите playbooks/update.yml. Установите правильное имя хоста и просто выполните плейбук.

Обновление может быть выполнено легко для патч-версий, например, с 6.0.1 на 6.0.2. Эта роль не включает обновления основных версий из-за возможных критических изменений на каждом релизе и других очевидных причин.

Если это необходимо, в плейбуке обновления есть логика, чтобы фактически выполнить существенное обновление.

Новые переменные могут быть установлены при обновлении Mongo. Для обновления:

mongo_state: latest

# установку новых переменных можно сделать при обновлении mongo
mongo_net:
  new_variable: true

При обновлении убедитесь, что приложения не записывают данные в Mongo. Также убедитесь, что резервная копия создана заранее.

Обновление репликационного набора

Если активен репликационный набор, кластер должен поддерживаться после обновления. Как указано в документации, выполняются следующие шаги:

 - проверьте состояние кластера, если все в порядке, продолжайте

 - отключите приложение mongo на арбитре, если он есть
 - обновите mongo на арбитре
 - разместите конфигурацию на арбитре
 - запустите mongo на арбитре

 - дождитесь, пока состояние кластера будет в порядке

 - отключите приложение mongo на вторичном узле
 - обновите mongo на вторичном узле
 - разместите конфигурацию на вторичном узле
 - запустите mongo на вторичном узле

 - дождитесь, пока состояние кластера будет в порядке

 - повторите для оставшихся вторичных узлов

 - снимите первичный узел с поста
 - обновите mongo на первоначальном первичном узле
 - разместите конфигурацию на первоначальном первичном узле
 - запустите mongo на первоначальном первичном узле

 - дождитесь, пока состояние кластера будет в порядке

Обновление шардированной среды

На этапе разработки.

Разработка

  • Есть плейбук сброса для удаления всех файлов mongo. Это полезно для целей разработки, смотрите tasks/reset.yml. Он закомментирован по умолчанию.

Масштабирование

Все еще в разработке... Я даже не уверен, что мне нужна эта функциональность, поскольку в текущей версии mongo 5.0 это вообще невозможно. Настроить масштабирование в Mongo с помощью Ansible не просто, так как метод не прост.

Пока я видел, что шаги должны быть:

  • Если арбитр присутствует в конфигурации и на системе
    • удалить арбитра из кластера
  • Добавить новый вторичный узел или вторичные узлы
  • Добавить арбитра, если он настроен

Я пробовал настраивать это множество раз, но всегда терпел неудачу из-за ошибки системы. Я решил не включать масштабирование пока.

Пример плейбука

- 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:
    # убедитесь, что это сделано
    # - name: убедитесь, что узлы могут подключаться друг к другу через имена хостов
    #   template:
    #     src: hosts.j2
    #     dest: /etc/hosts
О проекте

Ansible role to setup and configure MongoDB

Установить
ansible-galaxy install csuka/ansible_role_mongodb_ubuntu
Лицензия
apache-2.0
Загрузки
196
Владелец
Oui oui