Как я могу получить результаты скрипта в списке узлов, расположенных в DMZ, но работать с этими данными на сервере Rundeck?

#rundeck

#rundeck

Вопрос:

У нас есть требование запускать некоторые скрипты на целевых узлах, расположенных в DMZ (читай: брандмауэр заблокирован, за исключением доступа по SSH из нашей интрасети), а затем фиксировать правильно сформированные результаты скрипта и записывать эти данные в базу данных. Из-за ограничений DMZ мы можем получить доступ к этим узлам только через SSH / Rundeck из нашей интрасети. В настоящее время никакое другое общение невозможно.

Вопрос здесь в том, как я могу поднять эти данные за пределы контекста узла и соответствующим образом итеративно обработать эти данные? (т. Е. Запустить скрипт на 10 целевых узлах и, как результат, выполнить шаг задания за пределами этого узла (т. Е. Сервера Rundeck) 10 раз, чтобы записать данные «где-то еще».

Фильтры журналов позволят мне получать результаты на целевом узле и создавать полезные данные ключа / значения, но я в тупике, что делать дальше с этими данными для достижения нашей цели.

Ответ №1:

Я привел пример, который работает на основе двух заданий: первое извлекает файл из 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>
  

И теперь используйте valueonanotherserver, который «получает» значение данных из задания 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>
  

Здесь вы можете увидеть результат.