Как я могу выполнять сценарии из аргументов на нескольких серверах?
Я пытаюсь создать список команд, а затем выполнить команды на каждом сервере. Я не могу сгенерировать список команд таким образом, чтобы eval
Сделаю правильно на каждом сервере.
Вот мой пока весь сценарий. По сути, я хотел бы войти на каждый сервер в $server_array
и выполнить либо все команды в $ script_arr, либо только выбранную команду.
#!/bin/bash
# run-commands.sh [optional script name]
# ex. run-commands.sh
# ex. run-commands.sh date_script
# ex. run-commands.sh hostname_script
# declare -a server_arr=("a.local" "b.local")
declare -a server_arr=("localhost")
if [ $# -eq 0 ]
then
# Default Processes
declare -a script_arr=("date_script" "hostname_script")
else
declare -a script_arr=($1)
fi
build_cmds()
{
script_arr=("${@}")
declare -a cmds
for script_name in "${script_arr[@]}"
do
case "$script_name" in
"date_script")
cmds+='printf "executing date command\n; "'
cmds+='date'
cmds+='printf "date command executed\n; "'
;;
"hostname_script")
cmds+='printf "executing date command\n; "'
cmds+='date'
cmds+='printf "date command executed\n; "'
;;
esac
done
}
build_cmds "${script_arr[@]}"
for cmd in "${cmds[@]}"
do
ssh user@$server_name -T 'eval "$cmd"'
done
echo "Completed executing all commands"
капистрано, mssh, и кластерыш все это инструменты, которые претендуют на выдачу команд сразу нескольким серверам. Как вы выяснили, это достаточно сложная задача, и, наверное, лучше не изобретать велосипед.
Я бы сделал это с помощью Puppet Bolt ... он позволяет легко управлять адвокационными командами удаленно. Просто скачайте Puppet Bolt (БЕСПЛАТНО) и используйте его для выполнения команды в указанном списке хостов.
Puppet Bolt Информация / Скачать
Просто установите болт и убедитесь, что у вас настроены ssh-ключи на всех хостах 😃
1). Напишите сценарий на стороне сервера со всеми необходимыми командами и перенаправлением вывода в журнал. Например, server-side.sh, в котором отображается имя сервера и сколько свободного места на нем:
#! /bin/bash
cat /etc/hostname > log.txt
date > log.txt
df -h > log.txt
2). Напишите второй скрипт, который Вы будете запускать на локальной рабочей станции. Например, «run-server-side.sh», который отправляет сценарий на сервер, запускает и возвращает журнал результатов:
#! /bin/bash
SERVERS="server_1 server_2"
for ONE_SERVER in SERVERS
do
scp server-side.sh $ONE_SERVER:path
ssh $ONE_SERVER path/server-side.sh
scp $ONE_SERVER:path/log.txt
mv log.txt "log-$ONE_SERVER.txt"
done
Ноты: Серверы должны быть настроены в .ssh/config
, авторизация по ключу. Например:
Host server_1
HostName address_1
User user_name_1
Host server_2
HostName address_2
User user_name_2
Преимущества.
Места для эволюции.
rsync
.Вы можете сделать несколько вещей.
Я не знаю, предпочитаете ли вы, чтобы команды выполнялись параллельно или последовательно.
Если вы предпочитаете серийный запуск, вы можете сделать что-то вроде:
- Составьте список всех серверов, на которых вы хотите запускать команды.
- бегать:
for server in $(cat server.list); do "command1 ; command2 ; command3..."; done
Если вы хотите, чтобы команды выполнялись параллельно, вы можете использовать инструмент parallel-ssh, который можно установить в обеих ОС CentOS / Ubuntu.
Если хотите, я написал сценарий оболочки, который является оболочкой для команды parallel-ssh и позволяет пользователю предоставлять список серверов и команды, и сценарий будет выдавать команды на всех серверах параллельно.
Скрипт можно найти в моем Github.
И последнее, что я могу предложить, - это использовать Ansible с инвентарем.