Недавно мы заставили Jump Host взаимодействовать со всеми нашими устройствами. Он красный, у него 6.x, и у нас нет прав root. Мы можем писать скрипты только на Autoexpect и bash — модули невозможны.
Источник: У меня есть 5000 устройств (по одному в строке, по 3 аргумента каждое — Местоположение, Имя хоста, IP — и они разделены табуляцией).
Задача: Поиск всех устройств в каждом местоположении (ARGV1) (например, out 5000, 40 будет для одного местоположения), перенаправление вывода во временный файл (без вывода, echo выключен) и запуск команды для каждого устройства во временном каталоге. Вывод должен быть для HostName ARGV2, а не IP.
Например, выполните команду ping для каждого устройства в файле tmp и верните успешный результат для каждого хоста или войдите в каждое устройство, выполните команду, выведите результат для хоста и перейдите к следующему устройству в файле tmp.
Пример структуры входного файла:
AA Torp1 1.1.1.1
AA Torp2 2.2.2.2
BB Torp97 9.9.9.9
Скажем, вы хотите пинговать каждое устройство из локации AA. Как мне написать скрипт cat hosts.txt | grep AA
для tmp, а затем пинговать каждый IP, например, 1.1.1.1
и 2.2.2.2
вывод:
Torp1 OK, если пинг успешен Torp2 NOK, если пинг не удался
Это простой пример... или, скажем, для каждого IP-адреса, выбранного на основе местоположения, выполните команду ssh, выведите вывод, а затем удалите файл tmp.
решение1
Самый простой способ сделать это — использовать while read
цикл. Общий формат:
while read var1 var2 ... varN; do something; done < inputFile
По умолчанию каждая строка ввода разделена пробелами, так что это, по сути, то, что вам нужно:
while read location hostname ip; do
printf "Ping of $hostname ($ip): "
ping -c1 "$ip" &>/dev/null && echo "OK" || echo "FAILED"
done < ips.txt
Или, чтобы ограничиться определенным местоположением:
grep location ips.txt | while read location hostname ip; do
printf "Ping of $hostname ($ip): "
ping -c1 "$ip" &>/dev/null && echo "OK" || echo "FAILED"
done
Если мы проверим это с помощью этого файла:
location1 example.com 93.184.216.34
location2 google.com 8.8.8.8
location1 bad.com 123.456.7.8
Мы получаем:
$ grep -w "^$location" ips.txt |
while read location hostname ip; do
printf "Ping of $hostname ($ip): ";
ping -c1 "$ip" &>/dev/null && echo "OK" || echo "FAILED";
done
Ping of example.com (93.184.216.34): OK
Ping of bad.com (123.456.7.8): FAILED