在多个远程服务器上并行运行本地 shell 脚本并获取状态

在多个远程服务器上并行运行本地 shell 脚本并获取状态

我需要在远程服务器上运行本地脚本。运行脚本以并行运行很重要。

[ec2-user@ip-172-31-43-140 ~]$ cat hosts.txt
             [email protected]
             [email protected]
             [email protected]
             [email protected]
             [email protected]
[ec2-user@ip-172-31-43-140 ~]$ cat hosts.txt  | xargs -I {} ssh {} -T 'bash -s' < ./file.sh
ssh: Could not resolve hostname #!/bin/sh: Name or service not known
xargs: ssh: exited with status 255; aborting
[ec2-user@ip-172-31-43-140 ~]$

答案1

这样做时我喜欢这种形式:

$ cat hosts.txt | xargs -n1 -P8 sh -c 'ssh -T "$1" bash -s < ./hello.bash' sh

或者{}如果您需要它们:

$ cat hosts.txt | xargs -n1 -P8 -I{} sh -c 'ssh -T "$1" bash -s < ./hello.bash' sh {}

例子

你好.bash
$ cat hello.bash
#!/bin/bash

echo "hi from server: $(hostname)"
ssh xargs
$ cat hosts.txt | xargs -n1 -P8 sh -c 'ssh -T "$1" bash -s < ./hello.bash' sh
hi from server: mulder.mydom.com
hi from server: skinner.mydom.com
hi from server: manny.mydom.com

细节:

  • -n1 -P8- 告诉xargs以 1 个参数作为输入并运行 8 个实例ssh
  • sh -c 'ssh -T "$1"
    • 这会调用 shell,然后运行命令-c "..."
    • 请注意,我们$1在这里传递,这是为了避免注入攻击。
    • -T禁用伪终端。是正在编辑的$1文件的内容。cat
  • bash -s < ./hello.bash'- 将传递给的命令ssh
  • sh- 尾部是作为要调用的 shell 传递sh的内容,参数 #0 ( )。xargs$0

参考

答案2

hello.bash:

doit() {
  echo Define
  echo what you want done in a
  echo function
}
export -f doit

然后做:

. hello.bash
parallel --env doit --slf hosts.txt --tag --nonall doit

答案3

是的,您可以使用 AWS Systems Manager 来执行此操作。 AWS Systems Manager Run Command 允许您在 EC2 以及本地服务器上远程安全地运行命令集。以下是实现这一目标的高级步骤。

附加实例 IAM 角色:ec2 实例必须具有策略为 AmazonSSMFullAccess 的 IAM 角色。此角色使实例能够与 Systems Manager API 进行通信。

安装 SSM 代理:EC2 实例上必须安装 SSM 代理。 SSM 代理处理运行命令请求并根据命令配置实例。

执行命令:通过 AWS CLI 的用法示例:--instance-ids给出 ec2 实例 ID 列表。执行以下命令以检索实例上运行的服务。将 Instance-ID 替换为 ec2 实例 ID。

aws ssm send-command --document-name "AWS-RunShellScript" --comment "listing services" --instance-ids "Instance-ID" --parameters commands="service --status-all" --region us-west-2 --output text

更多信息这里

相关内容