如何通过 shell 脚本在多个服务器上运行选择命令?

如何通过 shell 脚本在多个服务器上运行选择命令?

如何从多个服务器上的参数执行脚本?

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 – 无需任何附加软件。
  • 每个远程服务器始终都会有最新版本的脚本。
  • 您可以在本地工作站上使用您最喜欢的编辑器编写和编辑相当复杂的脚本。

进化的地方。

答案4

您可以做几件事。

我不知道您是否喜欢命令并行运行还是串行运行。

如果您喜欢串行运行,那么您可以执行以下操作:

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

如果您希望命令并行运行,则可以使用可安装在 CentOS/Ubuntu 版本操作系统中的 parallel-ssh 工具。

如果您愿意,我编写了一个 shell 脚本,它包装了 parallel-ssh 命令并允许用户提供服务器列表和命令,然后脚本将在所有服务器上并行发出命令。

该脚本可以找到在我的 Github 中

我能提供的最后一件事是将 Ansible 与库存一起使用。

相关内容