如何從多個伺服器上的參數執行腳本?
我正在嘗試建立一個命令列表,然後在每個伺服器上執行命令。我無法以可以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
答案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 - 無需任何附加軟體。
- 每個遠端伺服器始終都會有最新版本的腳本。
- 您可以在本機工作站上使用您最喜歡的編輯器編寫和編輯相當複雜的腳本。
進化的地方。
- 大型伺服器端腳本很容易分解為幾個小任務 - 一個任務==一個腳本,並通過
rsync
. - 為了在控制台中獲得漂亮的輸出,可以為每個伺服器或任務使用不同的顏色:http://misc.flogisoft.com/bash/tip_colors_and_formatting
答案4
您可以做一些事情。
我不知道您是否更喜歡命令並行運行還是串行運行。
如果您喜歡串行運行,那麼您可以執行以下操作:
- 列出您想要執行命令的所有伺服器。
- 跑步:
for server in $(cat server.list); do "command1 ; command2 ; command3..."; done
如果您希望並行運行命令,可以使用並行 ssh 工具,該工具可以安裝在 CentOS/Ubuntu 風格作業系統中。
如果需要,我編寫了一個 shell 腳本,它包裝了並行 ssh 命令,並允許使用者提供伺服器清單和命令,並且腳本將在所有伺服器上並行發出命令。
腳本可以找到在我的 Github 中。
我可以提供的最後一件事是將 Ansible 與庫存結合使用。