Как запустить выбранные команды на нескольких серверах из скрипта оболочки?

Как запустить выбранные команды на нескольких серверах из скрипта оболочки?

Как выполнить скрипты из аргументов на нескольких серверах?

Я пытаюсь создать список команд, а затем выполнить команды на каждом сервере. Я не могу сгенерировать список команд таким образом, чтобы он мог быть 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"

решение1

капистрано,мсш, иclustersshвсе это инструменты, которые заявляют, что выдают команды нескольким серверам одновременно. Это достаточно сложная задача, как вы обнаружили, так что, вероятно, лучше не изобретать велосипед.

решение2

Я бы сделал это с Puppet Bolt.. он позволяет с легкостью запускать команды адвокации удаленно. Просто скачайте Puppet Bolt (БЕСПЛАТНО) и используйте его для отправки команды на предоставленный список хостов.

Информация/Скачать Puppet Bolt

Просто установите Bolt и убедитесь, что на всех хостах настроены ключи SSH.

решение3

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

Преимущества.

  • Только «родной» и «встроенный» bash — без какого-либо дополнительного программного обеспечения.
  • На каждом удаленном сервере всегда будет самая последняя версия скрипта.
  • Вы можете написать и отредактировать довольно сложный сценарий на локальной рабочей станции в Вашем любимом редакторе.

Места для эволюции.

  • Большой серверный скрипт удобно разбить на несколько маленьких — одна задача == один скрипт, и загрузить их через rsync.
  • Для более наглядного вывода в консоли можно использовать разные цвета для каждого сервера или задачи:http://misc.flogisoft.com/bash/tip_colors_and_formatting

решение4

Есть несколько вещей, которые вы можете сделать.

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

Если вы предпочитаете работать последовательно, то вы можете сделать что-то вроде:

  1. Составьте список всех серверов, на которых вы хотите запускать команды.
  2. бегать:
for server in $(cat server.list); do "command1 ; command2 ; command3..."; done

Если вы хотите, чтобы команды выполнялись параллельно, вы можете использовать инструмент parallel-ssh, который можно установить в обеих версиях ОС CentOS/Ubuntu.

Если хотите, я написал скрипт оболочки, который оборачивает команду parallel-ssh и позволяет пользователю указать список серверов и команды, а скрипт будет выдавать команды на всех серверах параллельно.

Сценарий можно найтив моем Github.

Последнее, что я могу предложить, — это использование Ansible с инвентарем.

Связанный контент