我需要从我的 PC 管理多个集群节点。问题是集群节点只能从远程 PC 访问。因此,首先我必须 ssh 到远程 PC,然后从远程 PC ssh 到集群节点。
如果我可以直接访问节点,我会使用 clustersh 之类的东西来同时管理所有节点。
有没有类似 clustersh 的工具可以适合我的情况?
答案1
我拼凑了一个“集群屏幕”来做类似的事情。您/etc/clusters
以与 clustersh 相同的方式设置文件
cluster1 host1 host2
cluster2 host3 host4
然后我有一个文件/usr/local/bin/cs
(cssh 名称的轻微抄袭:),看起来像
#!/bin/bash
if [[ $# < 1 ]]
then
echo -e "Usage : $0 cluster [command]";
exit;
fi;
cluster=$(/bin/grep $1 /etc/clusters | sed -e 's/[^\ ]*\ //')
for s in $cluster; do
if [ -n "$2" ]
then
exec screen -t "$s" $s "$2";
else
exec screen -t "$s" $s;
fi
done;
然后你就可以运行
screen
cs clustername "optional command"
它不像 clustersh 那么好,但它可以完成工作
答案2
好吧,不,您不必ssh
先连接到一台机器,然后再连接到另一台机器。即使是老ssh
客户也不必做这样的事情。
我有与您类似的情况,尽管我对在许多远程计算机上输入完全相同的命令不感兴趣。
我在评论中提问是因为您提出问题时没有提供完整的细节。那么让我做一些假设。我将假设你的本地盒子将 Tmux 和ssh
(客户端)安装在相当新的版本中。如果没有,例如因为它是 Windows,请使用虚拟机。我还将假设您的“远程 PC”,我将其称为跳转主机,ssh
也已安装并可到达从您当地的盒子可以抵达这集群节点反过来。我们将node1
通过node5
作为我们的集群节点。然后localbox
还有jumphost
另外两个人。
现在,术语已经不存在了,请打开此链接到 ssh_config(5)并在以下内容变得不清楚时切换到它。
在您的主文件夹中,用您最喜欢的文本编辑器localbox
打开。如果需要,.ssh/config
创建该文件夹。~/.ssh
然后输入以下内容:
Host jumphost
HostName the.name.of.your.jumphost.tld
ForwardAgent yes # YMMV
Host node1 node 2 node3 node4 node5
ProxyCommand ssh -W %h:%p jumphost
这表明ssh
,为了连接到node1
它node5
,必须首先连接到jumphost
并转发/代理到另一台主机:
-W host:port
请求通过安全通道将客户端上的标准输入和输出转发到端口上的主机。意味着-N
、-T
、ExitOnForwardFailure
和ClearAllForwardings
。仅适用于协议版本 2。
如果您有一个特别旧的版本ssh
(jumphost
即不支持-W
),但netcat ( nc
) 已安装,您可以ProxyCommand
根据需要将其替换为:
ProxyCommand ssh user@proxy nc %h %p 2> /dev/null
现在,一旦上述行进入文本文件,请根据需要为每个集群节点添加一行:
Host node1 node1.cluster.domain.tld
HostKeyAlias node1.cluster.domain.tld
HostName 1.2.3.4 # you can give IPs
这假设,该名称node1
不公开或不为您所知localbox
,也无法查找。但IP是已知的。HostKeyAlias
确保稍后您可以切换HostName $IP
到实际的主机名。我还倾向于将别名缩短为node1.cluster
或类似的名称,以防顶级域发生变化。
因此,node2
我们可能有一个公共 DNS 记录:
Host node2 node2.cluster.otherdomain.tld
HostKeyAlias node2.cluster
HostName node2.cluster.otherdomain.tld # ... or hostnames
现在您可以使用其中之一(推荐):
ssh node1
ssh node2
或(不推荐):
ssh node`.cluster.domain.tld
ssh node2.cluster.otherdomain.tld
连接到这些节点通过这jumphost
。它还允许您jumphost
通过简单地键入来连接ssh jumphost
。
这里重要的是要理解,线路上显示的名称Host
完全独立于 DNS 名称或 IP,假如HostName
该线路存在一条线路Host
。 IIRC 缩进是惯例,但不是必需的。
现在 SSH 端唯一需要解决的就是身份验证。您可以User
在每个“块”中明确给出 a 以使用备用用户名进行连接。您需要决定是否jumphost
足够信任来激活代理转发。如果不这样做,您将必须创建一个密钥jumphost
并让您的集群节点知道它(在 中.ssh/authorized_keys
)。其他任何事情都会过于频繁地提示您输入密码。
总结到目前为止的所有内容,但交替考虑哪个用户连接到哪里:
Host jumphost
HostName the.name.of.your.jumphost.tld
User joe
Host node1 node 2 node3 node4 node5
ProxyCommand ssh -W %h:%p jumphost
User joseph
Host node1 node1.cluster.domain.tld
HostKeyAlias node1.cluster.domain.tld
HostName 1.2.3.4 # you can give IPs
User root
Host node2 node2.cluster.otherdomain.tld
HostKeyAlias node2.cluster
HostName node2.cluster.otherdomain.tld # ... or hostnames
...将在 上ssh node1
进行连接以joe@jumphost
转发连接root@node1
。并且,在 上ssh node2
,connect asjoe@jumphost
转发连接joseph@node2
。
因此,您可以覆盖每个主机的一些配置文件节。
完成 SSH 部分后,让我们转向并行运行命令。
clusterssh
在各个 xterm 窗口与集群节点建立 SSH 连接后,您应该能够编排多个 xterm 窗口。然而,我个人认为这很麻烦而且相当不直观。
你有很多选择。我建议的那些都只需要您的localbox
.
您可以使用dsh
(dancer's/distributed shell)或dish(diligence/distributed shell)作为其中之一。
pssh
(parallel ssh
) 是另一种选择,但它是基于 Python 的,因此根据经验,它的解析能力.ssh/config
可能会受到限制。
最后但同样重要的是,我会推荐多路复用器给你。 “终端多路复用器”的缩写,它与 GNU 属于同一类别screen
,但比screen
.
我有一个快捷方式,可以将单个 Tmux 窗口中的窗格与Ctrl+a S(其中Ctrl+a是我的首选前缀)同步。
bind-key S set-window-option synchronize-panes \; display-message 'Toggled synchronize-panes'
这样,您就可以在一个 Tmux 窗口内的每个窗格中打开一个 SSH 连接,并将输入同步到所有窗口。这将允许您在 Tmux 窗口(窗口本质上类似于 Tmux 术语中的选项卡)的所有窗格中键入命令,并使用 立即执行它Enter。
但请记住,这对于少数远程节点来说可能工作得很好,但对于数量较多的节点来说就会变得笨拙。所以毕竟您可能想研究一下我推荐的其他解决方案之一。