Rundeck 4.0.0 - 使用 ssh 执行远程节点命令
Rundeck 4.0.0 - Remote node command execution using ssh
我在使用最基本的 Rundeck 功能时遇到问题 - 即,运行在远程节点上通过 ssh 命令执行命令。我已经生成了一个 rsa 密钥并通过 Key Storage
函数添加了它。我还为节点定义创建了一个 yaml 文件:
root@rundeck:/var/lib/rundeck# cat nodes.yml
mynode:
nodename: mynode
hostname: mynode
description: 'Some description'
ssh-authentication: privateKey # added - unsure if really required
ssh-keypath: /var/lib/rundeck/.ssh/id_rsa # added - unsure if really required
username: rundeck
osFamily: linux
节点显示正确,命令行 ssh 工作正常:
root@rundeck:/var/lib/rundeck/.ssh# ssh -i id_rsa rundeck@mynode date
Mon Apr 4 16:19:33 UTC 2022
项目设置如下:
#Mon Apr 04 16:23:36 UTC 2022
#edit below
project.description=someproject
project.disable.executions=false
project.disable.schedule=false
project.execution.history.cleanup.batch=500
project.execution.history.cleanup.enabled=false
project.execution.history.cleanup.retention.days=60
project.execution.history.cleanup.retention.minimum=50
project.execution.history.cleanup.schedule=0 0 0 1/1 * ? *
project.jobs.gui.groupExpandLevel=1
project.label=somelabel
project.name=someproject
project.nodeCache.enabled=true
project.nodeCache.firstLoadSynch=true
project.output.allowUnsanitized=false
project.ssh-authentication=privateKey
project.ssh-command-timeout=0
project.ssh-connect-timeout=0
project.ssh-key-storage-path=keys/project/someproject/rundeck_id_rsa
resources.source.1.config.file=/var/lib/rundeck/nodes.yml
resources.source.1.config.format=resourceyaml
resources.source.1.config.requireFileExists=true
resources.source.1.config.writeable=true
resources.source.1.type=file
service.FileCopier.default.provider=jsch-scp
service.NodeExecutor.default.provider=jsch-ssh
然而,当我尝试 运行 来自 UI 的 Command
时,它失败了:
Failed: SSHProtocolFailure: invalid privatekey: [B@7d7d0b2d
我做错了什么,我如何在远程节点上通过 ssh 成功 运行 命令?
您的节点定义需要 ssh-key-storage-path
属性指向 Rundeck 用户私钥(之前在 Rundeck Key Storage 上创建),此外,osFamily
属性必须设置为 unix
(不是 linux
,Rundeck 只接受两个值:unix
和 windows
)。
要添加 SSH 节点,请执行以下步骤:
如果您使用的是 WAR-based 安装,请执行:ssh-keygen -t rsa -b 4096
。这会在用户 .ssh
目录(启动 Rundeck 的用户)上生成两个密钥(私有密钥和 public)。如果您使用的是 RPM/DEB 安装,这些密钥已经在 /var/lib/rundeck
路径上创建。
转到远程 SSH 节点(您要从 Rundeck 连接的帐户),然后将 Rundeck 服务器用户 public 密钥添加到 authorized_keys
文件。然后您可以使用 Rundeck 服务器用户帐户 ssh user@xxx.xxx.xxx.xxx
测试该连接。
启动 Rundeck,然后将 rundeck
用户私钥添加到 Rundeck 密钥存储中(记得包括第一行和最后一行“-----BEGIN RSA PRIVATE KEY-----
”和“-----END RSA PRIVATE KEY-----
") 在我的例子中我使用这条路径 keys/rundeck
.
创建一个新项目,然后创建包含远程节点信息的 resources.xml
文件。要生成该文件,只需转到项目设置>编辑节点>单击“配置节点”按钮>单击“添加源+”> Select“+文件”选项>在“格式”字段中select resourcexml
并在“文件路径”字段中填写路径(将文件名放在末尾,通常为“resources.xml”,另外,select “生成”、“包括服务器节点”和“可写”复选框,然后单击“保存”按钮。
现在您可以编辑该文件,包括远程节点,在我的例子中是“node00”(一个 Vagrant 测试图像),在 key-storage-path
属性上我使用了创建的相同路径在第 3 步中:
<?xml version="1.0" encoding="UTF-8"?>
<project>
<node name="hyperion" description="Rundeck server node" tags="" hostname="hyperion" osArch="amd64" osFamily="unix" osName="Linux" osVersion="4.15.0-66-generic" username="ruser"/>
<node name="node00" description="Node 00" tags="" hostname="192.168.33.20" osArch="amd64" osFamily="unix" osName="Linux" osVersion="3.10.0-1062.4.1.el7.x86_64" username="vagrant" ssh-key-storage-path="keys/rundeck"/>
</project>
您可以遵循整个指南 here。
或者,您可以使用以下命令 re-generate 密钥对:ssh-keygen -p -f /var/lib/rundeck/.ssh/id_rsa -m pem
.
keystorage
用 crlf
保存 private-key
,这是我在版本 4.2.1
.
中发现的问题
对 ssh-exec.sh
进行修复:
echo "$RD_CONFIG_SSH_KEY_STORAGE_PATH" > "$SSH_KEY_STORAGE_PATH"
插入这些行:
sed -i 's/\r$//' "$SSH_KEY_STORAGE_PATH"
SSHOPTS="$SSHOPTS -i $SSH_KEY_STORAGE_PATH"
我在使用最基本的 Rundeck 功能时遇到问题 - 即,运行在远程节点上通过 ssh 命令执行命令。我已经生成了一个 rsa 密钥并通过 Key Storage
函数添加了它。我还为节点定义创建了一个 yaml 文件:
root@rundeck:/var/lib/rundeck# cat nodes.yml
mynode:
nodename: mynode
hostname: mynode
description: 'Some description'
ssh-authentication: privateKey # added - unsure if really required
ssh-keypath: /var/lib/rundeck/.ssh/id_rsa # added - unsure if really required
username: rundeck
osFamily: linux
节点显示正确,命令行 ssh 工作正常:
root@rundeck:/var/lib/rundeck/.ssh# ssh -i id_rsa rundeck@mynode date
Mon Apr 4 16:19:33 UTC 2022
项目设置如下:
#Mon Apr 04 16:23:36 UTC 2022
#edit below
project.description=someproject
project.disable.executions=false
project.disable.schedule=false
project.execution.history.cleanup.batch=500
project.execution.history.cleanup.enabled=false
project.execution.history.cleanup.retention.days=60
project.execution.history.cleanup.retention.minimum=50
project.execution.history.cleanup.schedule=0 0 0 1/1 * ? *
project.jobs.gui.groupExpandLevel=1
project.label=somelabel
project.name=someproject
project.nodeCache.enabled=true
project.nodeCache.firstLoadSynch=true
project.output.allowUnsanitized=false
project.ssh-authentication=privateKey
project.ssh-command-timeout=0
project.ssh-connect-timeout=0
project.ssh-key-storage-path=keys/project/someproject/rundeck_id_rsa
resources.source.1.config.file=/var/lib/rundeck/nodes.yml
resources.source.1.config.format=resourceyaml
resources.source.1.config.requireFileExists=true
resources.source.1.config.writeable=true
resources.source.1.type=file
service.FileCopier.default.provider=jsch-scp
service.NodeExecutor.default.provider=jsch-ssh
然而,当我尝试 运行 来自 UI 的 Command
时,它失败了:
Failed: SSHProtocolFailure: invalid privatekey: [B@7d7d0b2d
我做错了什么,我如何在远程节点上通过 ssh 成功 运行 命令?
您的节点定义需要 ssh-key-storage-path
属性指向 Rundeck 用户私钥(之前在 Rundeck Key Storage 上创建),此外,osFamily
属性必须设置为 unix
(不是 linux
,Rundeck 只接受两个值:unix
和 windows
)。
要添加 SSH 节点,请执行以下步骤:
如果您使用的是 WAR-based 安装,请执行:
ssh-keygen -t rsa -b 4096
。这会在用户.ssh
目录(启动 Rundeck 的用户)上生成两个密钥(私有密钥和 public)。如果您使用的是 RPM/DEB 安装,这些密钥已经在/var/lib/rundeck
路径上创建。转到远程 SSH 节点(您要从 Rundeck 连接的帐户),然后将 Rundeck 服务器用户 public 密钥添加到
authorized_keys
文件。然后您可以使用 Rundeck 服务器用户帐户ssh user@xxx.xxx.xxx.xxx
测试该连接。启动 Rundeck,然后将
rundeck
用户私钥添加到 Rundeck 密钥存储中(记得包括第一行和最后一行“-----BEGIN RSA PRIVATE KEY-----
”和“-----END RSA PRIVATE KEY-----
") 在我的例子中我使用这条路径keys/rundeck
.创建一个新项目,然后创建包含远程节点信息的
resources.xml
文件。要生成该文件,只需转到项目设置>编辑节点>单击“配置节点”按钮>单击“添加源+”> Select“+文件”选项>在“格式”字段中selectresourcexml
并在“文件路径”字段中填写路径(将文件名放在末尾,通常为“resources.xml”,另外,select “生成”、“包括服务器节点”和“可写”复选框,然后单击“保存”按钮。现在您可以编辑该文件,包括远程节点,在我的例子中是“node00”(一个 Vagrant 测试图像),在
key-storage-path
属性上我使用了创建的相同路径在第 3 步中:
<?xml version="1.0" encoding="UTF-8"?>
<project>
<node name="hyperion" description="Rundeck server node" tags="" hostname="hyperion" osArch="amd64" osFamily="unix" osName="Linux" osVersion="4.15.0-66-generic" username="ruser"/>
<node name="node00" description="Node 00" tags="" hostname="192.168.33.20" osArch="amd64" osFamily="unix" osName="Linux" osVersion="3.10.0-1062.4.1.el7.x86_64" username="vagrant" ssh-key-storage-path="keys/rundeck"/>
</project>
您可以遵循整个指南 here。
或者,您可以使用以下命令 re-generate 密钥对:ssh-keygen -p -f /var/lib/rundeck/.ssh/id_rsa -m pem
.
keystorage
用 crlf
保存 private-key
,这是我在版本 4.2.1
.
对 ssh-exec.sh
进行修复:
echo "$RD_CONFIG_SSH_KEY_STORAGE_PATH" > "$SSH_KEY_STORAGE_PATH"
插入这些行:
sed -i 's/\r$//' "$SSH_KEY_STORAGE_PATH"
SSHOPTS="$SSHOPTS -i $SSH_KEY_STORAGE_PATH"