Настройка Unifi Controller для использования внешней базы данных MongoDB - Возможна ли проблема с ролью? - PullRequest
0 голосов
/ 10 февраля 2019

Пожалуйста, см. Редактирование ниже для дополнительной информации.

Короче говоря, я пытаюсь запустить контроллер Unifi на моем домашнем кластере Kubernetes.При этом мне нужно было децентрализовать базу данных MongoDB, поскольку наличие экземпляра MongoDB, связанного с каждой репликой в ​​Kubernetes, приводит к сбою базы данных.Вот мой проект на данный момент: https://github.com/zimmertr/Kubernetes-Manifests/tree/unifi_mongodb_separation/Unifi_Controller

При этом я написал следующий скрипт, который выполняется во время подготовки для MongoDB контейнера :

mongo \
    --username ubnt \
    --password "{{ mongodb_password }}" \
    --authenticationDatabase admin \
    --eval 'db.getSiblingDB("unifi").createUser({user: "ubnt", pwd: "{{ mongodb_password }}", roles: [{role: "readWrite", db: "unifi"}]})'

mongo \
    --username ubnt \
    --password "{{ mongodb_password }}" \
    --authenticationDatabase admin \
    --eval 'db.getSiblingDB("unifi_stat").createUser({user: "ubnt", pwd: "{{ mongodb_password }}", roles: [{role: "readWrite", db: "unifi_stat"}]})'

А затем я настроил Unifi Controller для связи с базой данных через смонтированный том system.properties файл, настроенный так:

# Inform IP Address
system_ip={{ load_balancer_ip }}

# Autobackup directory
autobackup.dir=/backups

# External MongoDB information
db.mongo.local=false
db.mongo.uri=mongodb://ubnt:{{ mongodb_password }}@unifi-controller-mongodb:27017/unifi
statdb.mongo.uri=mongodb://ubnt:{{ mongodb_password }}@unifi-controller-mongodb:27017/unifi_stat
unifi.db.name=unifi

Это настроено как по указанию Ubiquiti.

Это все работает, и когда запускается развертывание Kubernetes, я вижу, что Unifi Controller подключается к экземпляру MongoDB в журналах.Кроме того, если я вручную подключаюсь к базам данных MongoDB и запускаю show collections, я вижу, что было создано много новых коллекций.Однако контроллер Unifi перестает создавать журналы здесь.

Если я вручную остановлю файл jar, на котором работает контроллер Unifi в фоновом режиме на контейнере, а затем перезапущу его, будет получена следующая трассировка стека:

$> s6-setuidgid abc java -Xmx1024M -jar /usr/lib/unifi/lib/ace.jar start
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter INFO: destroy called
Exception in thread "launcher" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'Ò00000' defined in class com.ubnt.service.AppContext: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [com.ubnt.service.P.D com.ubnt.service.AppContext.Ò00000()] threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dbService' defined in class com.ubnt.service.AppContext: Invocation of init method failed; nested exception is com.mongodb.CommandFailureException: { "serverUsed" : "unifi-controller-mongodb:27017" , "ok" : 0.0 , "errmsg" : "not authorized on unifi to execute command { dropDatabase: 1 }" , "code" : 13 , "codeName" : "Unauthorized"}

Ключевой элемент здесь

не авторизован в Unifi для выполнения команды {dropDatabase: 1} "

И это где мойпонимание MongoDB подходит к концу. И мой вопрос подходит к началу. Я считаю, что причина, по которой Unifi Controller не продолжает запускать или регистрировать какие-либо дополнительные сообщения после подключения к базе данных и создания коллекций, заключается в том, что он молчавыполнить действие с базой данных MongoDB, для которой у него нет необходимых разрешений.

Когда я инициализирую контейнер MongoDB Docker, я указываю переменные среды MONGO_INITDB_ROOT_USERNAME & MONGO_INITDB_ROOT_PASSWORD.Поверьте, включает режим auth. Это убеждение подтверждается тем фактом, что я могу подключиться к Madmin аутентификационная база данных ongoDB через имя пользователя и пароль, которые я предоставляю этим переменным.

Однако, на основании сценария, который я разместил выше, который создает мои базы данных и назначает роль readWrite пользователю ubnt,Мне любопытно, как мне дать пользователю ubnt необходимые разрешения, необходимые для удаления базы данных.Если я поменяю readWrite на другие роли, такие как root и dbAdminAnyDatabase, команды не пройдут.

Что мне нужно сделать, чтобы мой пользователь ubnt мог сбросить unifi и unifi_stat базы данных?Или что мне нужно изменить в строках подключения, чтобы этого не случилось?Я немного админ базы данных.

Продолжение редактирования:

Я обновил роль, которая приписывается ubnt пользователь на unifi и unifi_stat будет dbAdmin вместо readWrite.И немного дальше.

#!/bin/bash
mongo \
    --username ubnt \
    --password "{{ mongodb_password }}" \
    --authenticationDatabase admin \
    --eval 'db.createUser({user: "ubnt", pwd: "{{ mongodb_password }}", roles: [{role: "dbAdmin", db: "unifi"}]})'

mongo \
    --username ubnt \
    --password "{{ mongodb_password }}" \
    --authenticationDatabase admin \
    --eval 'db.createUser({user: "ubnt", pwd: "{{ mongodb_password }}", roles: [{role: "dbAdmin", db: "unifi_stat"}]})'

Тем не менее, контроллер Unifi все еще ведет себя странно.Теперь это просто повторяется в файлах журнала:

2019-02-10 22:33:45,449] <launcher> INFO  system - ======================================================================
[2019-02-10 22:33:45,450] <launcher> INFO  system - UniFi 5.6.40 (build atag_5.6.40_10370 - release) is started
[2019-02-10 22:33:45,450] <launcher> INFO  system - ======================================================================
[2019-02-10 22:33:45,457] <launcher> INFO  system - BASE dir:/usr/lib/unifi
[2019-02-10 22:33:45,464] <launcher> INFO  system - Current System IP: 192.168.0.1
[2019-02-10 22:33:45,465] <launcher> INFO  system - Hostname: unifi-controller-5bb95c7688-bzp4z
[2019-02-10 22:33:48,635] <launcher> INFO  db     - waiting for db connection...
[2019-02-10 22:33:49,173] <launcher> INFO  db     - Connecting to mongodb://ubnt:PASSWORD@unifi-controller-mongodb:27017/unifi
[2019-02-10 22:33:49,526] <launcher> DEBUG db     - db connected (3.4.19@unifi-controller-mongodb:27017)
[2019-02-10 22:33:49,534] <launcher> INFO  db     - *** Factory Default *** Database exists. Drop it
[2019-02-10 22:33:52,391] <launcher> INFO  db     - waiting for db connection...
[2019-02-10 22:33:52,896] <launcher> DEBUG db     - db connected (3.4.19@unifi-controller-mongodb:27017)
[2019-02-10 22:34:13,292] <launcher> INFO  system - ======================================================================
[2019-02-10 22:34:13,295] <launcher> INFO  system - UniFi 5.6.40 (build atag_5.6.40_10370 - release) is started
[2019-02-10 22:34:13,295] <launcher> INFO  system - ======================================================================
[2019-02-10 22:34:13,303] <launcher> INFO  system - BASE dir:/usr/lib/unifi
[2019-02-10 22:34:13,312] <launcher> INFO  system - Current System IP: 192.168.0.1
[2019-02-10 22:34:13,313] <launcher> INFO  system - Hostname: unifi-controller-5bb95c7688-bzp4z
[2019-02-10 22:34:16,781] <launcher> INFO  db     - waiting for db connection...
[2019-02-10 22:34:17,300] <launcher> INFO  db     - Connecting to mongodb://ubnt:PASSWORD@unifi-controller-mongodb:27017/unifi
[2019-02-10 22:34:17,640] <launcher> DEBUG db     - db connected (3.4.19@unifi-controller-mongodb:27017)
[2019-02-10 22:34:17,656] <launcher> INFO  db     - *** Factory Default *** Database exists. Drop it
[2019-02-10 22:34:20,463] <launcher> INFO  db     - waiting for db connection...
[2019-02-10 22:34:20,969] <launcher> DEBUG db     - db connected (3.4.19@unifi-controller-mongodb:27017)

Так что я в растерянности.Не уверен, почему он пытается сбросить базу данных?Unifi пытается создать базы данных с нуля на экземпляре MongoDB?

  1. Если я не создаю базы данных unifi и unifi_stat во время предоставления MongoDB, то UnifiКонтроллеру не удается подключиться к ним, и журналы там останавливаются.

  2. Если я действительно создаю базы данных и даю ubnt user dbAdmin поверх них, тогда Unifi просто падаетих снова и снова.Показанный выше.

  3. Если я действительно создаю базы данных и даю над ними ubnt пользователя readWrite, то Unifi просто подключается к базам данных, создает коллекции и молча останавливается длянет явной причины.И если я попытаюсь вручную выполнить файл jar, упомянутый выше, то он оставит след от стека, описывающий отсутствие необходимых разрешений для удаления базы данных.

Если бы кто-то мог предоставить некоторую документацию о том, как должна быть подготовлена ​​внешняя база данных MongoDB для использования контроллером Unifi, это было бы очень полезно для меня.Мне удалось отследить только сообщение на форуме, в котором сотрудник обсуждал, как настроить system.properties контроллера для указания на внешний экземпляр.

1 Ответ

0 голосов
/ 11 февраля 2019

Оказывается, это была ошибка в MetalLB, сервисе, с которым я предоставляю свои голые металлические сервисы kubernetes моей сети.

https://github.com/google/metallb/issues/399

Все работает сейчас.Но, к сожалению, децентрализация MongoDB мало что сделала для решения проблем, связанных с несколькими репликами.

Однако я все еще думаю, что что-то не так в контейнере, так как он сообщает, что service unifi status - это unifi is not running.Несмотря на то, что он на самом деле работает.

...