Мы используем соль (masterless, fwiw), чтобы поддерживать флот из 10 хостов. Это, вероятно, вырастет до 15-20 к концу года. У меня есть файл столба с именем credentials/init.sls
, в котором есть один огромный кусок yaml, который выглядит примерно так:
host_credentials:
host1.example.com:
role: staging
mysql:
superdatabase:
role1:
username: role1_username
password: someSecretSHA1
from_hosts:
- host2.example.com
grants: select, insert, update, delete
role2:
username: role2_username
password: anotherSecretSHA1
from_hosts:
- host3.example.com
grants: select
host2.example.com:
role: staging
superthing:
mysql:
database: superdatabase
host: host1.example.com
role: role1
Дело в том, что код, который настраивает host1, может извлечь все свои соответствующие данные из host_credentials['host1.example.com']
, а код, который устанавливает host2, может извлечь свои данные из host_credentials['host2.example.com']
с некоторыми поисками, например, в информации host1 в Для того, чтобы узнать пользователя и пароль для супер базы данных на хосте host1 с ролью 1.
Это работает, но это громоздко. На самом деле, достаточно громоздко, что правила брандмауэра, которые, на первый взгляд, могли также быть в этой структуре yaml, теперь находятся в другом файле столба. Более того, ничто не контролирует, чтобы yaml каждого хоста соответствовал желаемому шаблону, поэтому мы должны выполнить небольшую проверку ошибок в солт-коде.
Кроме того, когда мы когда-нибудь будем использовать мастер соли, это приведет к тому, что нам придется делиться всей информацией о хосте со всеми миньонами, что вряд ли идеально.
Цель состоит в том, чтобы каждый бит информации записывался один раз. Например, если я изменяю пароль для пользователя базы данных mysql, мне не нужно менять его дважды, один раз на сервере, снова на каждом клиенте, который использует эту базу данных. Кроме того, я хотел бы получать полудумные сообщения об ошибках, когда я поступаю неправильно. Если я скажу host4 подключиться к mysql на host2, я должен получить сообщение об ошибке, в котором будет указано что-то вроде «host4 запросил подключение к mysql на host2, но host2 не запускает сервер mysql».
На данный момент единственное лучшее решение, которое я нашел, - это написать некоторый код на Python (с использованием рендерера salt py), который генерирует пустой объект, но выполняет большую проверку в середине.
salt/codequal/init.sls
#!py
def run():
# Do lots of error checking here.
return {}
Любые отзывы приветствуются. Поскольку я не видел такого записанного, я подозреваю, что упустил более естественный способ делать то, что я хочу.