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