首页 > 解决方案 > 如何在位于 DMZ 的节点列表上捕获脚本的结果,但在 Rundeck 服务器上使用该数据?

问题描述

我们需要在位于 DMZ 中的目标节点上运行一些脚本(阅读:防火墙被锁定,除了来自我们的 Intranet 的 SSH 访问),然后捕获脚本的格式良好的结果并将该数据写入数据库。由于 DMZ 限制,我们只能从我们的 Intranet 通过 SSH/Rundeck 访问这些节点。目前无法进行其他通信。

这里的问题是,如何将数据提升到节点上下文之外并相应地迭代处理该数据?(即在 10 个目标节点上运行脚本,结果,在该节点(即 Rundeck 服务器)之外执行作业步骤 10 次以将数据写入“其他地方”。

日志过滤器将允许我在目标节点上捕获结果并创建可用的键/值数据,但我在下一步如何处理这些数据以实现我们的目标方面陷入僵局。

标签: rundeck

解决方案


我做了一个基于两个作业的示例,第一个从 node00 提取文件并将数据存储在数据值上,并使用作业引用步骤将该数据作为参数传递给另一个指向另一个节点 (node01) 的作业。

这样,您可以在指向不同节点(远程或只是 rundeck 本地服务器)的作业之间传递数据。

ExtractFileContent 作业(从 node00 中提取文件内容)。

<joblist>
  <job>
    <defaultTab>nodes</defaultTab>
    <description></description>
    <dispatch>
      <excludePrecedence>true</excludePrecedence>
      <keepgoing>false</keepgoing>
      <rankOrder>ascending</rankOrder>
      <successOnEmptyNodeFilter>false</successOnEmptyNodeFilter>
      <threadcount>1</threadcount>
    </dispatch>
    <executionEnabled>true</executionEnabled>
    <id>81ff0a9b-381c-4631-ab32-fbe82b649cc3</id>
    <loglevel>INFO</loglevel>
    <name>ExtractFileContent</name>
    <nodeFilterEditable>false</nodeFilterEditable>
    <nodefilters>
      <filter>node00</filter>
    </nodefilters>
    <nodesSelectedByDefault>true</nodesSelectedByDefault>
    <plugins />
    <scheduleEnabled>true</scheduleEnabled>
    <sequence keepgoing='false' strategy='node-first'>
      <command>
        <exec>cat myfile.txt</exec>
        <plugins>
          <LogFilter type='key-value-data'>
            <config>
              <invalidKeyPattern>\s|\$|\{|\}|\\</invalidKeyPattern>
              <logData>true</logData>
              <name>mystring</name>
              <regex>\s*([^\s]+?)\s*</regex>
            </config>
          </LogFilter>
        </plugins>
      </command>
      <command>
        <description>print the value, only for debug</description>
        <exec>echo "the string value is ${data.mystring}</exec>
      </command>
      <command>
        <jobref name='UseValueOnAnotherServer' nodeStep='true'>
          <arg line='-opt ${data.mystring}' />
          <uuid>ff5ddef9-66b9-4cb3-a5d0-8756e00e0ca4</uuid>
        </jobref>
      </command>
    </sequence>
    <uuid>81ff0a9b-381c-4631-ab32-fbe82b649cc3</uuid>
  </job>
</joblist>

现在,UseValueOnAnotherServer 根据他们的选项“接收”来自 ExtractFileContent 作业的数据值。

<joblist>
  <job>
    <context>
      <options preserveOrder='true'>
        <option name='opt' />
      </options>
    </context>
    <defaultTab>nodes</defaultTab>
    <description></description>
    <dispatch>
      <excludePrecedence>true</excludePrecedence>
      <keepgoing>false</keepgoing>
      <rankOrder>ascending</rankOrder>
      <successOnEmptyNodeFilter>false</successOnEmptyNodeFilter>
      <threadcount>1</threadcount>
    </dispatch>
    <executionEnabled>true</executionEnabled>
    <id>ff5ddef9-66b9-4cb3-a5d0-8756e00e0ca4</id>
    <loglevel>INFO</loglevel>
    <name>UseValueOnAnotherServer</name>
    <nodeFilterEditable>false</nodeFilterEditable>
    <nodefilters>
      <filter>node01</filter>
    </nodefilters>
    <nodesSelectedByDefault>true</nodesSelectedByDefault>
    <plugins />
    <scheduleEnabled>true</scheduleEnabled>
    <sequence keepgoing='false' strategy='node-first'>
      <command>
        <exec>echo "we are at ${node.name} and the node00 value is ${option.opt}</exec>
      </command>
    </sequence>
    <uuid>ff5ddef9-66b9-4cb3-a5d0-8756e00e0ca4</uuid>
  </job>
</joblist>

在这里你可以看到结果。


推荐阅读