对多个主机具有不同参数的 PSSH 命令

Posted

技术标签:

【中文标题】对多个主机具有不同参数的 PSSH 命令【英文标题】:PSSH command with different arguments to multiple hosts 【发布时间】:2019-06-29 14:09:48 【问题描述】:

我正在尝试使用 PSSH 编写一个 bash 脚本,它根据主机发送相同的命令但不同的参数。主机名和参数将从不同的文件“list.txt”中提取。

“list.txt”文件的示例如下所示:

10.0.0.1;'hello';'world'
10.0.0.2;'goodbye';'everyone'
10.0.0.3;'thank';'you!'

我目前拥有的一个示例(但不幸的是不工作)如下所示:

#!/bin/bash

# grab the list items and make them into a variable to be able to parse
actionList=$(</root/scripts/list.txt)

# parse out host name for pssh
host_name="$( cut -d ';' -sf 1 <<< "$actionList" )";

# parse out the first argument 
argument1="$( cut -d ';' -sf 2 <<< "$actionList" )";

# parse out the second argument
argument2="$( cut -d ';' -sf 3 <<< "$actionList" )";

# pssh command that creates a new file on each server with their respective argument1 and argument2 
pssh -i -AH $host_name -t 300 -O StrictHostKeyChecking=no "$(argument1) ' and ' $(argument2) >> arg1_and_arg2.txt" 

我很确定削减 $actionList 变量并没有给我想要的东西,但我真正坚持的是,在我完成之后,pssh 命令是否会为 'list.txt' 中的每个项目正确运行从 $actionList 中解析出正确的字符串。

有没有办法让相同的命令,改变文件中的参数与 PSSH 一起工作?有没有更好的程序可以做到这一点?如果有怎么办?任何帮助表示赞赏。

谢谢!

附:如果我对这篇文章进行了格式化或做错了什么,我深表歉意。 *** 通常是我最后的手段,所以我不经常使用它。再次感谢您的帮助/建议!

【问题讨论】:

我不认为pssh 可以为所欲为;它旨在在不同的主机上运行 same 命令(包括参数)。 请注意,扩展变量会创建 literal 引号(即数据),而不是 syntactic 引号(被 bash 解析为语法的引号) .因此,您几乎肯定希望将's 从您的文件中删除。 @chepner 我害怕这个答案.. 碰巧知道可以帮助完成此任务的任何其他实用程序/程序吗? @CharlesDuffy 感谢您提供的信息!从现在开始将改变它! 【参考方案1】:

我认为你最好只使用一个循环,为输入文件的每一行运行ssh

while IFS=";" read host arg1 arg2; do
    echo "$arg1 and $arg2" | ssh "$host" "cat > arg1_and_arg2.txt" &
done < list.txt

【讨论】:

我已经有办法按顺序执行此操作,但希望能够并行运行此命令以节省时间。 @FranciscoTapia,查看&amp; 导致运行ssh 的管道在后台启动。因此,这确实并行运行代码。 (这里最明显的风险是它可能并行,如果您的主机列表比您能够启动并发进程的时间长,但这是xargs -P 的一些重组将修复)。 @CharlesDuffy 哇,完全错过了'&'!是的,我可能需要在 400 多个主机上运行此命令,因此我需要限制并发进程的数量。我肯定会更多地研究这个解决方案,并用我的解决方案更新这个问题。再次感谢您的帮助! 老实说,400 个进程并不是那么多,尤其是因为每个进程在本地完成的工作量很少。每个进程几乎将所有时间都花在睡眠上,直到远程进程完成。 @chepner 这可以满足我的需要!再次感谢您的帮助!将不得不研究查尔斯指出的“xargs”选项。现在一切都很好!

以上是关于对多个主机具有不同参数的 PSSH 命令的主要内容,如果未能解决你的问题,请参考以下文章

对具有不同参数的多个方法使用一个委托

如何在单行 pssh 中运行多个命令?

tree老师:PSSH自动化运维实战

PSSH 直接到目录

针对具有不同构建参数的多个项目运行构建

ansible自动化运维