Верстакфорум практиков
рекламаiprazon: приватные серверные адреса IPv4 и SOCKS5, безлимитный трафик, бесплатный тест до 2 часов
ФорумНастройка и подключение

Один конфиг на несколько машин без ручной правки

Наиль Габдуллин
Наиль Габдуллин
Знаток
сообщений 1885
с мар
1 сентября, 08:32первое сообщение

Разрослось хозяйство: шесть машин, на каждой один и тот же прогон, различий по пальцам одной руки. Имя узла, каталог под выгрузку, число потоков. Всё остальное совпадает слово в слово.

Пока правлю руками, и это уже больно: поменял таймаут, обошёл шесть машин, на пятой опечатался, ловил потом полдня.

Хочу собрать так, чтобы конфиг лежал в одном месте, а машины забирали его сами. Ставить полноценную систему управления ради шести узлов кажется перебором. Что берут в таком размере?

[run]
threads = 40
timeout = 30
retries = 3
out_dir = /data/vygruzka
разбираю чужие конфиги за печенье
Костя Фомин
Костя Фомин
Знаток
сообщений 1600
с апр
8 февраля, 11:49#2

В таком размере хватает шаблона и подстановки. Общее лежит в файле под системой контроля версий, различия в маленьком файле на каждой машине.

/opt/conf/run.tpl        общий, один на всех
/etc/uzel.env            свой на каждой машине, три строки

Сборка одной командой:

envsubst < /opt/conf/run.tpl > /opt/sbor/run.conf

В шаблоне пишете ${THREADS}, в машинном файле задаёте значение. Больше ничего изобретать не нужно, envsubst лежит в системе изначально.

Наиль Габдуллин
Наиль Габдуллин
Знаток
сообщений 1885
с мар
15 июля, 14:06#3
Костя Фомин: различия в маленьком файле на каждой машине

А как эти шесть машин узнают, что общий шаблон поменялся? Ходить и дёргать вручную это то же самое, от чего я убегаю.

разбираю чужие конфиги за печенье
batchrunner
batchrunner
Участник
сообщений 470
с окт
22 декабря, 17:23#4

Крон плюс git. Каждая машина раз в пять минут делает git pull, и если файл поменялся, пересобирает конфиг и перезапускает службу.

#!/bin/bash
set -e
cd /opt/conf
staroe=$(git rev-parse HEAD)
git pull -q --ff-only
novoe=$(git rev-parse HEAD)
[ "$staroe" = "$novoe" ] && exit 0

set -a; . /etc/uzel.env; set +a envsubst < run.tpl > /opt/sbor/run.conf.new mv /opt/sbor/run.conf.new /opt/sbor/run.conf systemctl restart sbor.service logger -t conf "konfig obnovlen do ${novoe:0:8}" ```

set -a перед подключением машинного файла важен: без него переменные останутся локальными для скрипта и до envsubst не доедут. Запись через временный файл с последующим переносом тоже не для красоты, иначе служба однажды прочитает половину конфига.

Алина Т.
Алина Т.
Новичок
сообщений 190
с апр, второй сезон
1 мая, 08:40#5

а если на одной машине пул сломается, как понять что она отстала?

batchrunner
batchrunner
Участник
сообщений 470
с окт
8 октября, 11:57#6

Отпечаток файла в лог, и раз в час свести их со всех машин.

сверка отпечатков по узлам
сверка отпечатков по узлам

Одна строка сразу показывает отставших. Дальше идёте на четвёртую и смотрите журнал.

zavarka
zavarka
Участник
сообщений 435
с ноя
15 марта, 14:14#7

Я бы к этому добавил вторую половину задачи, про которую в теме пока молчат.

Конфиг у вас разъезжается не только по настройкам прогона. Список адресов тоже общий, и он живёт своей жизнью: пул обновляется, выгрузка меняется. Если каждая машина держит копию списка, положенную руками месяц назад, вы получите шесть разных списков и очень весёлый разбор потом.

У меня это устроено тем же кроном. Список тянется по ссылке на выгрузку, она отдаёт актуальное состояние в реальном времени:

curl -sf --retry 3 -o /opt/sbor/spisok.new "https://<vasha-ssylka-vygruzki>"
test -s /opt/sbor/spisok.new && mv /opt/sbor/spisok.new /opt/sbor/spisok.txt

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

Формат я беру IP:PORT:LOGIN:PASS, он разбирается в одну строку кода на любой машине, и никакой ручной правки под конкретный узел не требует.

чайник кипит, скрипт бежит
Наиль Габдуллин
Наиль Габдуллин
Знаток
сообщений 1885
с мар
22 августа, 17:31#8

Про список мысль хорошая, у меня он и правда лежит копиями. А по паре входа: она у всех шести машин одна и та же?

разбираю чужие конфиги за печенье
zavarka
zavarka
Участник
сообщений 435
с ноя
1 января, 08:48#9

Одна. Машины различает привязка, пара входа тут ни при чём. В пакете привязок две, так что шесть узлов на один пакет вы не растянете, и делить лимит потоков между двумя адресами тоже надо помнить: при двух привязках тысяча делится пополам.

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

чайник кипит, скрипт бежит
Наиль Габдуллин
Наиль Габдуллин
Знаток
сообщений 1885
с мар
15 ноября, 14:22#11

Собрал у себя за вечер. Схема получилась такая:

путь конфига до узла
путь конфига до узла

Крон дёргает скрипт каждые пять минут, отпечатки свожу раз в час, отставшие видны сразу.

разбираю чужие конфиги за печенье
Борис Лапин
Борис Лапин
Знаток
сообщений 1960
с мар
22 апреля, 17:39#12

Одно замечание к крону: поставьте на каждой машине свой сдвиг по минутам, иначе шесть узлов пойдут в git одновременно. На шести это ещё терпимо, на двадцати уже заметно.

*/5 * * * * sleep $((RANDOM \% 45)); /opt/conf/obnovit.sh
Костя Фомин
Костя Фомин
Знаток
сообщений 1600
с апр
1 сентября, 08:56#13

И держите шаблон под проверкой перед выкладкой. Достаточно собрать его с тестовым машинным файлом и прогнать разбор конфига той же программой, что его читает. Опечатка в шаблоне разъедется по всем узлам за пять минут, откатывать потом дороже, чем проверить один раз.

Наиль Габдуллин
Наиль Габдуллин
Знаток
сообщений 1885
с мар
8 февраля, 11:13#14

Проверку перед выкладкой прикрутил хуком, спасибо. Неделю живу без ручных обходов, руками не тронул ни одну машину. Тема закрыта, всё работает.

разбираю чужие конфиги за печенье