如何從 shell 腳本在多個伺服器上執行 select 命令?

如何從 shell 腳本在多個伺服器上執行 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"

答案1

卡皮斯特拉諾,簡訊, 和集群sh這些工具都聲稱可以同時向多個伺服器發出命令。正如您所發現的,這是一項足夠複雜的任務,最好不要重新發明輪子。

答案2

我會用 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 - 無需任何附加軟體。
  • 每個遠端伺服器始終都會有最新版本的腳本。
  • 您可以在本機工作站上使用您最喜歡的編輯器編寫和編輯相當複雜的腳本。

進化的地方。

答案4

您可以做一些事情。

我不知道您是否更喜歡命令並行運行還是串行運行。

如果您喜歡串行運行,那麼您可以執行以下操作:

  1. 列出您想要執行命令的所有伺服器。
  2. 跑步:
for server in $(cat server.list); do "command1 ; command2 ; command3..."; done

如果您希望並行運行命令,可以使用並行 ssh 工具,該工具可以安裝在 CentOS/Ubuntu 風格作業系統中。

如果需要,我編寫了一個 shell 腳本,它包裝了並行 ssh 命令,並允許使用者提供伺服器清單和命令,並且腳本將在所有伺服器上並行發出命令。

腳本可以找到在我的 Github 中

我可以提供的最後一件事是將 Ansible 與庫存結合使用。

相關內容