Официальная документация ( 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 в качестве кэша миньонов? Это вообще возможно?