Управление зарубежными saltstack minions в условиях ограничений

2025 год выдался богатым на дальнейшее ухудшение связности между РФ и зарубежом (в частности, один небезызвестный хостер в Германии), различные попытки пускать трафик через haproxy через разные ДЦ в других странах не увенчались успехом. Saltstack сервер в РФ не может периодически достучаться до зарубежных минионов, salt-call с них тоже не всегда работает (стейты падают с ошибками File client timed out after 180 seconds и Pillar timed out after 180 seconds). В прошлые года конечно же задумывались о настройке второго солт мастера, который будет близко к удаленным относительно РФ минионам, но т.к. нам нужен обязательно  кеш минионов, который хранится на солт мастере (получение информации о другом минионе с миниона через mine.get), то для реализации обязательно этот кеш держать расшаренными  между солт мастерами. В солте объявлен для этого функционал - https://docs.saltproject.io/en/latest/topics/cache/index.html, есть нужные модули https://docs.saltproject.io/en/latest/ref/cache/all/index.html#all-salt-cache. В 2025 году они опять были опробованы и все также не работает: был настроен кеш на базе mysql, salt master создал нужную таблицу, наполнил ее данными, но вызов mine.get при этом перестал работать: 

salt-call mine.get G@groups:backup groups compound
salt-call mine.get 'groups:salt_master' network.interfaces grain

 https://github.com/saltstack/salt/issues/67250 - тут очень похожие симптомы, только у них хранилище на базе редиса.

Как только включаю cache: "localfs", то mine.get начинает работать.

Сейчас пробуем такую схему, которая позволит решить/уменьшить проблему связности:

 

Есть главный salt master в РФ, есть salt master + syndic зарубежом. Ко второму мастеру будут подключены минионы, которые также находятся зарубежом. На обоих солт мастерах стоит cache: "localfs" , чтобы кеш и все нужные файлы синхронизированы, была произведена следующая настройка:

На главном солт мастере:

# systemctl cat sync_files
# /etc/systemd/system/sync_files.service
[Install]
WantedBy=multi-user.target

[Service]
Environment="HOME=/root"
ExecStart=/bin/bash -c 'unison /cache/master/minions ssh://second-master//cache/master/minions -prefer newer && unison /etc/salt/pki/master ssh://second-master//etc/salt/pki/master && unison /code/salt ssh://second-master//code/salt -ignore "Path .git'
Type=oneshot

[Unit]
Description=Executes unison command when a saltstack files has changed

Настройки для unison:

cat /root/.unison/default.prf 
# Unison preferences file
auto=true
batch=true

 

Выше написан systemd сервис, вызывая который будет синхронизировать все нужные файлы -  кеш, ключи минионов, код солта (стейты, пиллары и тп). Чтобы не заниматься ручным запуском данного systemd сервиса, можно добавить другой сервис:

systemctl cat salt_monitor.service
[Install]
WantedBy=multi-user.target

[Service]
Environment="HOME=/root"
ExecStart=/bin/bash -c 'inotifywait -q -r -m -e delete,close_write,moved_to,moved_from --exclude /code/salt/.git /code/salt | while read file_changed; do echo "$file_changed changed, running sync_files" && systemctl start sync_files; done'
Restart=always
StandardError=journal
StandardOutput=journal
Type=simple

[Unit]
Description=inotifywait file monitor service

 Через inotifywait мониторим изменение файлов в директории с кодом saltstack, если там что-то поменялось, то вызываем сервис синхронизации файлов.

journalctl -f -u salt_monitor.service
journalctl -f -u sync_files

 Теперь можно вызывать стейт локально с зарубежного миниона, тогда он подключится ко второму мастеру, работать всё будет быстро. Также можно управлять такими минионами с главного солт мастера через syndic. Решение довольно примитивное и топорное, но если нет ресурсов самостоятельно поправить работу удаленного кеша, то оно вполне может подойти. 

Please publish modules in offcanvas position.