Рейтинг:0

Как настроить кластер etcd для работы с мастером стека соли?

флаг cn

Официальная документация ( https://docs.saltproject.io/en/latest/ref/cache/all/salt.cache.etcd_cache.html#module-salt.cache.etcd_cache ) показывает этот пример конфигурации:

etcd.хост: 127.0.0.1
etcd.порт: 2379
etcd.протокол: http
etcd.allow_reconnect: Истина
etcd.allow_redirect: Ложь
etcd.srv_domain: нет
etcd.read_timeout: 60
etcd.имя пользователя: Нет
etcd.пароль: Нет
etcd.cert: нет
etcd.ca_cert: нет

В моем конкретном случае у меня есть кластер etcd с аутентификацией PKI (на основе сертификата TLS). В документации по соляному модулю ничего конкретного об этом варианте использования не сказано. Это говорит только об этом:

Связанные документы можно найти в документации python-etcd.

«Соответствующая документация» здесь на самом деле очень расплывчата. https://python-etcd.readthedocs.io/en/latest/#create-a-client-object - это не настоящая документация, а лишь список тривиальных примеров:

импорт и т. д.

client = etcd.Client() # это создаст клиент для сервера etcd, работающего на локальном хосте через порт 4001.
клиент = etcd.Client (порт = 4002)
клиент = etcd.Client (хост = '127.0.0.1', порт = 4003)
client = etcd.Client(host='127.0.0.1', port=4003, allow_redirect=False) # не позволит вам запускать конфиденциальные команды на нелидерных машинах, по умолчанию true
клиент = etcd.Клиент(
             хост = '127.0.0.1',
             порт=4003,
             allow_reconnect = Верно,
             протокол='https',)

Конечно, ничего из этого не будет работать с правильным кластером etcd. Однако исходный код показывает, что можно указать список хостов:

https://github.com/jplana/python-etcd/blob/master/src/etcd/client.py#L74

        Инициализируйте клиент.
        Аргументы:
            хозяин (смешанный):
                           Если строка, IP для подключения.
                           Если кортеж ((хост, порт), (хост, порт),...)

Но я понятия не имею, как поместить кортеж кортежей в файл конфигурации мастера соли. Это то, что я пробовал:

кеш: etcd
etcd.host: [('salt1.lacinet', 2739), ('salt2.lacinet', 2739)]
etcd.протокол: https
etcd.allow_reconnect: Истина
etcd.allow_redirect: Ложь
etcd.srv_domain: нет
etcd.read_timeout: 60
etcd.имя пользователя: корень
etcd.пароль: Нет
etcd.cert: ('/etc/salt/etcd/root.key.pem', '/etc/salt/etcd/root.cert.pem')
etcd.ca_cert: '/etc/salt/etcd/ca.cert.pem'

Но это приводит к ошибке:

[ОШИБКА] Не удалось обнаружить хосты etcd из None: ни одно из имен DNS-запросов не существует: _etcd._tcp.None., _etcd._tcp.None.lacinet.
[ОШИБКА] Не удалось получить список машин с https://['salt1.lacinet', 'salt2.lacinet']:2379/v2: LocationParseError("Не удалось разобрать: https://['salt1.lacinet', 'salt2.lacinet']:2379/v2/машины")
[ОШИБКА] Ошибка в функции _pillar:
Traceback (последний последний вызов):
  Файл "/usr/lib/python3/dist-packages/etcd/client.py", строка 296, на машинах
    ответ = self.http.request(
  Файл "/usr/lib/python3/dist-packages/urllib3/request.py", строка 75, в запросе
    вернуть self.request_encode_url(
  Файл "/usr/lib/python3/dist-packages/urllib3/request.py", строка 97, в request_encode_url
    вернуть self.urlopen (метод, URL, **extra_kw)
  Файл "/usr/lib/python3/dist-packages/urllib3/poolmanager.py", строка 318, в urlopen
    u = parse_url(url)
  Файл "/usr/lib/python3/dist-packages/urllib3/util/url.py", строка 392, в parse_url
    вернуть six.raise_from (LocationParseError (source_url), нет)
  Файл "<string>", строка 3, в raise_from
urllib3.exceptions.LocationParseError: не удалось разобрать: https://["('salt1.lacinet'", '2739)', "('salt1.lacinet'", '2739)']:2379/v2/machines

Сама ошибка очень подозрительна:

Не удалось разобрать: https://["('salt1.lacinet'", '2739)', "('salt1.lacinet'", '2739)']:2379/v2/machines

Подозреваю, что список хостов распознается не как список или кортеж, а как строка.

Учитывая эту ошибку, может быть даже возможно, что кеш minion salt-master не поддерживает несколько хостов etcd? Но это было бы очень «интересно», поскольку основная причина установки etcd — обеспечить доступное хранилище ключей и значений для нескольких мастеров соли. Какой в ​​этом смысл, если он может использовать только один сервер etcd?

Вероятно, у меня также возникнут проблемы с аутентификацией на основе сертификата TLS, потому что она также использует кортеж (или должен, как указано в https://github.com/jplana/python-etcd/blob/master/src/etcd/client.py#L90 ):


            сертификат (смешанный): если строка, весь сертификат клиента ssl;
                            если кортеж, сертификат и имена файлов ключей.
            ca_cert (str): сертификат ЦС. Если нажать, он включит
                           Проверка.

Не понятно как указать кортеж имен файлов в конфиге. Также неясно, является ли конфигурация ca_cert путем к файлу сертификата или самой строкой сертификата PEM. Ничего из этого нигде не задокументировано (или просто я не смог найти).

Может ли кто-нибудь сказать мне, как использовать правильный кластер TLS-auth etcd с salt-master в качестве кэша миньонов? Это вообще возможно?

флаг cn
ноль опыта с этим, но для нескольких хостов должно быть ((хост, порт) (хост, порт)) вместо [(хост, порт) (хост, порт)] (https://github.com/jplana/python -etcd/blob/b227f496c038b2b856c4d76c9525b3547e5c8dc4/src/etcd/client.py#L76)

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.