Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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