GNU parallel - 运行 通过多个 ssh jumphosts 命令

GNU parallel - running command through multiple ssh jumphosts

我需要 运行 在可通过多个跳转主机访问的多个主机上执行命令。

我有一个slf文件

ssh -i /root/.ssh/id_rsa -nJ jumphost1,user@jumphost2 user@worker1
ssh -i /root/.ssh/id_rsa -nJ jumphost1,user@jumphost2 user@worker2
ssh -i /root/.ssh/id_rsa -nJ jumphost1,user@jumphost2 user@worker3
...

运行并行我得到

$ parallel --slf workers-ssh "ls -la"
parallel: Warning: Input is read from the terminal. You either know what you
parallel: Warning: are doing (in which case: YOU ARE AWESOME!) or you forgot
parallel: Warning: ::: or :::: or to pipe data into parallel. If so
parallel: Warning: consider going through the tutorial: man parallel_tutorial
parallel: Warning: Press CTRL-D to exit.
parallel: Warning: Could not figure out number of cpus on worker1 (). Using 1.

Jumphost 和 worker IP 是在以前的脚本中动态生成的,所以我不希望 ~/.ssh/config 编辑。

用 gnu parallel 解决这个问题的正确方法是什么?

我认为你的 slf 文件没有大问题,但你指定命令的方式。

当你 运行 parallel 时,你应该指定“变量”部分,否则 parallel 会像你的情况一样要求你在标准输入中输入该部分。

在你的情况下,你必须以这种方式填写命令:

parallel --slf workers-ssh ::: "ls -la"

相当于

parallel --slf workers-ssh {} ::: "ls -la"

到目前为止,您应该能够在远程机器上发出命令,但由于只给出了一个参数 ("ls -la"),因此只会连接一台机器。如果您想在所有机器上发布 ls -la,您可以应用以下编辑:

commands.txt

ssh -i /root/.ssh/id_rsa -nJ jumphost1,user@jumphost2 user@worker1 "ls -la"
ssh -i /root/.ssh/id_rsa -nJ jumphost1,user@jumphost2 user@worker2 "ls -la"
ssh -i /root/.ssh/id_rsa -nJ jumphost1,user@jumphost2 user@worker3 "ls -la"

然后 运行

parallel :::: commands.txt

或者换一种方式

parallel ssh -i /root/.ssh/id_rsa -nJ jumphost1,user@jumphost2 user@worker{} ls -a ::: {1..3}

用真实IP代替。

parallel ssh -i /root/.ssh/id_rsa -nJ jumphost1,user@jumphost2 user@{} ls -a ::: ip1 ip2 ip3

您或许可以使用 --ssh:

parallel --ssh 'ssh -i /root/.ssh/id_rsa -nJ jumphost1,user@jumphost2' -S user@worker1 ::: "ls -la"

在 GNU parallel 中有两个可用选项为此 use-case 设计。

没有参数:

parallel --slf sshloginfile.txt --nonall "hostname"

并带有参数:

parallel --slf sshloginfile.txt --onall ::: hostname