带有sshpass的BASH根据服务器列表将同一命令发送到多个服务器吗?

问题描述

嗨,我下面的“脚本”可以正常工作。

#!/bin/bash
TARGET="vm-windows-server01.local"
TARGET_USER="administrator"
TARGET_PASSWORD="Qwerty"

TARGET2="vm-linux-server01.local"
TARGET_USER2="root"
TARGET_PASSWORD2="Qwerty123"

#Windows server shutdown
sshpass -p $TARGET_PASSWORD ssh -o stricthostkeychecking=no $TARGET_USER@$TARGET 'shutdown /s /c "Shutting down"'

#Linux server shutdown
sshpass -p $TARGET_PASSWORD2 ssh -o stricthostkeychecking=no $TARGET_USER2@$TARGET2 'shutdown 3 "Shutting down"'

现在,而不是复制50台以上服务器的TARGET变量以及sshpass的50多行 可以做下面这样的事情吗?请告知其伪代码只是为了给我我想要的主意。我是bash的新手,所以要小心:-)

#!/bin/bash
WINDOWS_SERVERS="
     vm-windows-server01.local,vm-windows-server02.local,vm-windows-server03.local"

WINDOWS_USER="administrator"
WINDOWS_PASSWORD="Qwerty"

LINUX_SERVERS="
     vm-linux-server01.local,vm-linux-server02.local,vm-linux-server03.local"

LINUX_USER="root"
LINUX_PASSWORD="Qwerty123"

#Windows server shutdown
sshpass -p $WINDOWS_PASSWORD ssh -o stricthostkeychecking=no $WINDOWS_USER@$WINDOWS_SERVERS 'shutdown /s /c "Shutting down"'
    
#Linux server shutdown
sshpass -p $LINUX_PASSWORD ssh -o stricthostkeychecking=no $LINUX_USER@$LINUX_SERVERS 'shutdown 3 "Shutting down"'

基本上为列表中的所有主机运行sshpass。

解决方法

如果不确定Bash或其他了解数组的shell的可用性,请参见您可以使用POSIX可用语法(无数组)修改代码以遍历服务器列表:

#!/usr/bin/env bash

WINDOWS_SERVERS=(
  'vm-windows-server01.local'
  'vm-windows-server02.local'
  'vm-windows-server03.local'
)

WINDOWS_USER='administrator'
WINDOWS_PASSWORD='Qwerty'

LINUX_SERVERS=(
  'vm-linux-server01.local'
  'vm-linux-server02.local'
  'vm-linux-server03.local'
)

LINUX_USER='root'
LINUX_PASSWORD='Qwerty123'

for windows_host in "${WINDOWS_SERVERS[@]}"
do
  sshpass -p "$WINDOWS_PASSWORD" ssh -o stricthostkeychecking=no "$WINDOWS_USER@$windows_host" 'shutdown /s /c "Shutting down"'
done

for linux_host in "${LINUX_SERVERS[@]}"
do
  sshpass -p "$LINUX_PASSWORD" ssh -o stricthostkeychecking=no "$LINUX_USER@$linux_host" 'shutdown 3 "Shutting down"'
done

但是,如果您有支持数组的bash,zsh或ksh 93+,则您的脚本语法更简单,更易于维护:

root@KubernetesMiniKube:/usr/local/bin# kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.10 --port=8080
pod/hello-minikube created

root@KubernetesMiniKube:/usr/local/bin# kubectl get pod

NAME             READY   STATUS    RESTARTS   AGE
hello-minikube   1/1     Running   0          16s

root@KubernetesMiniKube:/usr/local/bin# kubectl get deployments

No resources found in default namespace.