Классическая ситуация: на одном сервере все работает. На другом - нет. При этом версии одинаковые, ОС одинаковая, но потом спустя время выясняется: конфиг отличается на одну строку.
😁Задача
Сравнить конфигурации одного сервиса между серверами:
nginx.conf
sshd_config
app.conf
Быстро. Чисто. Без копипасты глазами.
1️⃣ Самый простой способ - diff через SSH
ssh server1 "cat /etc/nginx/nginx.conf" > s1.conf
ssh server2 "cat /etc/nginx/nginx.conf" > s2.conf
diff -u s1.conf s2.conf
Но это неудобно и мусорно.
Лучше сразу:
diff -u \
<(ssh server1 "cat /etc/nginx/nginx.conf") \
<(ssh server2 "cat /etc/nginx/nginx.conf")
Чисто. Без временных файлов.
2️⃣ Игнорировать комментарии и пустые строки. Очень часто различия только в комментариях.
diff -u \
<(ssh s1 "grep -vE '^\s*#|^\s*$' /etc/ssh/sshd_config") \
<(ssh s2 "grep -vE '^\s*#|^\s*$' /etc/ssh/sshd_config")
Теперь сравнивается только реальная логика.
3️⃣ Если это nginx - сравнивать весь effective config. У nginx часто include-файлы.
Правильнее:
ssh s1 "nginx -T" > s1.nginx
ssh s2 "nginx -T" > s2.nginx
diff -u s1.nginx s2.nginx
Так мы сравниваем итоговую конфигурацию.
4️⃣ Проверка sshd. У ssh есть удобная команда:
sshd -T
Она выводит итоговую конфигурацию с учетом defaults. Сравниваем так же через process substitution.
5️⃣ Если серверов много. Массовая проверка:
for host in s1 s2 s3; do
ssh "$host" "sshd -T" | sort > "$host.conf"
done
diff -u s1.conf s2.conf
Сортировка помогает убрать разницу порядка строк.
BashTex 📱 #bash #utils