如何从多个服务器上的参数执行脚本?
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(免费)并使用它向提供的主机列表发出命令即可。
只需安装 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
如果您希望命令并行运行,则可以使用可安装在 CentOS/Ubuntu 版本操作系统中的 parallel-ssh 工具。
如果您愿意,我编写了一个 shell 脚本,它包装了 parallel-ssh 命令并允许用户提供服务器列表和命令,然后脚本将在所有服务器上并行发出命令。
该脚本可以找到在我的 Github 中。
我能提供的最后一件事是将 Ansible 与库存一起使用。