管理集群的终端,可以从远程 PC 访问节点?

管理集群的终端,可以从远程 PC 访问节点?

我需要从我的 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,为了连接到node1node5,必须首先连接到jumphost并转发/代理到另一台主机:

-W host:port 请求通过安全通道将客户端上的标准输入和输出转发到端口上的主机。意味着-N-TExitOnForwardFailureClearAllForwardings。仅适用于协议版本 2。

如果您有一个特别旧的版本sshjumphost即不支持-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

但请记住,这对于少数远程节点来说可能工作得很好,但对于数量较多的节点来说就会变得笨拙。所以毕竟您可能想研究一下我推荐的其他解决方案之一。

相关内容