Rundeck 未为使用不同 ssh 端口的远程执行设置环境变量

Man*_*ani 1 automation rundeck

Rundeck 将传递给作业的所有选项$RD_OPTION_*设置为环境变量,但当在具有不同 ssh 端口的远程节点中执行作业时,它不会设置这些变量。脚本成功登录到远程节点,但没有环境变量。请帮我解决。

示例作业定义:

<joblist>
  <job>
    <context>
      <options preserveOrder='true'>
        <option name='option1' required='true' />
      </options>
    </context>
    <description>job description</description>
    <dispatch>
      <excludePrecedence>true</excludePrecedence>
      <keepgoing>false</keepgoing>
      <rankOrder>ascending</rankOrder>
      <threadcount>1</threadcount>
    </dispatch>
    <executionEnabled>true</executionEnabled>
    <id>id</id>
    <loglevel>DEBUG</loglevel>
    <name>job name</name>
    <nodefilters>
      <filter>name: remote_node</filter>
    </nodefilters>
    <nodesSelectedByDefault>true</nodesSelectedByDefault>
    <notification>
      <onfailure>
        <email attachLog='true' recipients='abcdef@xyz.com' subject='job failure :(' />
      </onfailure>
      <onsuccess>
        <email recipients='abcdef@xyz.com' subject='job succes' />
      </onsuccess>
    </notification>
    <scheduleEnabled>true</scheduleEnabled>
    <sequence keepgoing='false' strategy='step-first'>
      <command>
        <exec>python path/to/script.py $RD_OPTION_OPTION1 > /path/to/logfile_$RD_JOB_EXECID.log 2>&1</exec>
      </command>
      <command>
        <exec>java -jar path/to/jarfile.jar ${option.option1} >> "/path/to/logfile_${job.execid}.log" 2>&1</exec>
      </command>
    </sequence>
    <uuid>job-uuid</uuid>
  </job>
</joblist>

<!-- 
Here
$RD_JOB_EXECID,${job.execid},${option.option1},$RD_OPTION_OPTION1 are not being setup as environment variables when remote node is selected for execution
but the same variables are set up as environment variables when executed locally.
Rundeck logins to the remote node as user successfully.

Log entries are seen in /path/to/logfile_.log file in remote node since $RD_JOB_EXECID has not been set up.

the options @option.option1@ are working fine since they have been replaced by rundeck before executing command.

Rundeck details:
    user: rundeck
    shell: /bin/nologin
    
    rundeck logs into remote server as normal user who has all permissions to execute all these scripts/jars.

-->
Run Code Online (Sandbox Code Playgroud)

笔记:

Rundeck 在具有不同 ssh 端口的远程实例上执行时不会设置环境变量。在这种情况下,端口是 2808,并且在 resources.xml 中已将其更新为 123.456.789.0:2808. Rundeck 登录服务器并成功执行脚本(没有环境变量)。远程实例 sshd_config 已配置为接受 RD_* 变量。使用 port 登录时会设置和访问相同的环境变量22

Yan*_*ang 6

我认为你混淆了Rundeck 命令参数Rundeck 环境变量

这是“命令、脚本参数和作业参考参数”: ${job.execid}

顾名思义,您可以将其用作命令参数。就像您在工作定义中所做的一样。

这是一个“环境变量”: $RD_JOB_EXECID

没有任何设置,如果您在 Rundeck 服务器本身上运行作业,两者都可以正常工作,但是如果您想将作业分派到节点,$RD_JOB_EXECID则无法立即使用。

要通过远程命令调度传递环境变量,需要在远程端正确配置SSH服务器。有关说明,请参阅“sshd_config(5)”手册页中的 AcceptEnv 指令。

使用通配符模式允许 RD_ 前缀变量提供对 Rundeck 生成的环境变量的开放访问。

 Example in sshd_config:

 # pass Rundeck variables 
 AcceptEnv RD_*
Run Code Online (Sandbox Code Playgroud)

Rundeck SSH 插件

在 Rundeck 服务器上

确保您已SendEnv RD_*在 ssh_config 中设置

对于您的用例,${job.execid},${option.option1}将完美无缺地使用 sshd_config


它适用于不同的 SSH 端口。

在此处输入图片说明

XML 中的工作定义

<joblist>
  <job>
    <context>
      <options preserveOrder='true'>
        <option name='nodeFilter' />
      </options>
    </context>
    <description></description>
    <dispatch>
      <excludePrecedence>true</excludePrecedence>
      <keepgoing>false</keepgoing>
      <rankOrder>ascending</rankOrder>
      <threadcount>1</threadcount>
    </dispatch>
    <executionEnabled>true</executionEnabled>
    <group>TEST</group>
    <id>63b6f283-39b2-479d-bba9-b1742bc2ea53</id>
    <loglevel>INFO</loglevel>
    <name>test rundeck job context</name>
    <nodefilters>
      <filter>${option.nodeFilter}</filter>
    </nodefilters>
    <nodesSelectedByDefault>true</nodesSelectedByDefault>
    <scheduleEnabled>true</scheduleEnabled>
    <sequence keepgoing='false' strategy='node-first'>
      <command>
        <script><![CDATA[#!/usr/bin/python
import sys
print "I know ENV_VAR will not work as command line arguments %s " % sys.argv
]]></script>
        <scriptargs> "&gt;${job.execid}&lt; &gt;$RD_JOB_EXECID&lt;"</scriptargs>
      </command>
      <command>
        <script><![CDATA[#!/bin/bash
echo "But it works in Bash"
echo $RD_JOB_ID
echo $RD_JOB_EXECID

echo "Which port does sshd listening on?"
sudo netstat -tulpn | grep 2808]]></script>
        <scriptargs />
      </command>
    </sequence>
    <uuid>63b6f283-39b2-479d-bba9-b1742bc2ea53</uuid>
  </job>
</joblist>
Run Code Online (Sandbox Code Playgroud)