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
我需要 运行 在可通过多个跳转主机访问的多个主机上执行命令。
我有一个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