Переменная results

Переменная results содержит результаты выполнения корневого плейбука в иерархическом виде. Если плейбук не является корневым, то есть он был запущен другим плейбуком, внутренний плейбук хранит только свои внутренние результаты.

Передача значения переменной во входные аргументы

Переменную results можно передавать во входные аргументы модулей.

Пример

В этом примере передаются результаты модуля forloop_m_1 первой итерации модуля test_forloop.

input:
    any_arg:
        type: js
        expr: results.test_forloop[0].forloop_m_1

При необходимости отладки можно передавать результаты в полном виде: expr: results.

Таблица ниже описывает, какой результат хранит переменная results в определенных модулях.

Модуль Результат Пример

Скрипт или плейбук

Результат выполнения конкретного запуска

forloop

Массив объектов, где каждый объект содержит информацию о номере итерации, итерируемом значении и результатах выполнения внутренних модулей.

[
  {
    "iter_idx": 0,
    "iter_value": 2,
    "inner_for_loop_module": {
      "num_arg": 3
    },
    "inner_for_loop_module_2":{
      "num_arg": 3
    }
  ...
  },
...
]

whileloop

Массив объектов, где каждый объект содержит информацию о номере итерации и результатах выполнения внутренних модулей

[
  {
    "iter_idx": 0,
    "inner_while_loop_module": {
      "num_arg": 3
    },
    "inner_while_loop_module_2": {
      "num_arg": 3
    }
  ...
  },
...
]

case

Объект, содержащий информацию о выбранной ветке и результатах выполнения внутренних модулей

{
  "chosen_branch": "conditional_case_module",
  "conditional_case_module": {
    "Dummy module with 1 arg": {
      "string_arg": "Naame"
    }
  }
}

all

Иерархические результаты вида branch_id.branch_module_id

{
  "branch_1": {
    "branch_1_module_1": {
      "string_arg": "Naame"
    }
  }
}
Если модуль цикла (whileloop или forloop) состоит из одного внутреннего модуля, результатом модуля цикла будет считаться результат внутреннего модуля.

Сценарии использования переменной

Пример 1

В системе запущена обработка 10 инцидентов. В рамках обработки для каждого инцидента выполняется последовательность действий:

  1. регистрация инцидента в системе;

  2. отправка инцидента по email;

  3. удаление инцидента из системы.

Затем нужно проверить результат отправки каждого инцидента по email. Для этого используется значение results.for_loop_id[0..N].email_send_step_id.

Пример 2

В системе для итерации внутри модуля forloop имеется неоднородный список сущностей. Известно, что каждый третий элемент является файлом с определенным атрибутом. Для каждого такого элемента необходимо узнать результат выполнения всей цепочки. Эту информацию можно получить с помощью переменной results.

Примеры скриптов и плейбуков

Скрипты

Скрипт, принимающий и выводящий в консоль any
id: py_dummy_any_arg
name: Py dummy any arg
version: 0.0.1
status: "experimental"
date: ""
author: R-Vision
type: script
source: !py |
  def main(any_arg):
      print(f"We got any_arg: {any_arg}")

      return {"any_arg": any_arg}
Скрипт, принимающий и возвращающий num аргумент
id: py_dummy_num_arg
name: Py dummy num arg
version: 0.0.1
status: "experimental"
date: ""
author: R-Vision
type: script
source: !py |
  def main(num_arg: int):
      print(f"We got num_arg: {num_arg}")

      return {"num_arg": num_arg}

Плейбук

Плейбук в примере содержит модули:

  • модуль test_forloop (циклический модуль, делающий одну итерацию). Он состоит из следующих модулей:

    • while_loop;

    • скрипт;

    • all;

    • case.

  • модуль last_module — скрипт, принимающий и выводящий переменную results полностью.

  • модуль last_module_2 — скрипт, принимающий и выводящий результаты модуля forloop_m_1 первой итерации модуля test_forloop.

Плейбук
id: playbook_with_forloop_dbg
name: Playbook with forloop dbg
version: 0.0.25
type: playbook
body:
  input:
    properties:
      name:
        type: string
        description: ""
        default: ""
  modules:
    - id: test_forloop
      body:
        type: forloop
        modules:
          -   id: forloop_m_0
              body:
                type: whileloop
                skip_failures: false
                modules:
                  -   id: forloop_m_0_m
                      body:
                          type: script
                          id: py_dummy_num_arg
                          input:
                              num_arg:
                                type: js
                                expr: '3'
                  -   id: forloop_m_1_m
                      body:
                          type: script
                          id: py_dummy_num_arg
                          input:
                              num_arg:
                                type: js
                                expr: '3'
              stop_after_if:
                expr: 3 == 3
                skip_if_stopped: false
          -   id: forloop_m_1
              body:
                  type: script
                  id: py_dummy_string_arg
                  input:
                      string_arg:
                          type: js
                          expr: playbook_args.name
          -   id: forloop_m_2
              body:
                type: all
                branches:
                  - summary: Branch 1
                    id: branch_1
                    modules:
                      - id: dummy_string_branch_1_module
                        body:
                            type: script
                            id: py_dummy_string_arg
                            input:
                                string_arg:
                                    type: js
                                    expr: playbook_args.name
                parallel: false
                skip_failure: true
          - id: for_loop_m_3
            body:
              type: case
              default:
                -   id: default_case_module
                    body:
                        type: script
                        id: py_dummy_string_arg
                        input:
                            string_arg:
                                type: js
                                expr: playbook_args.name
              branches:
                -   summary: branch_1
                    id: conditional_case_module
                    condition: playbook_args.name == 'Naame'
                    modules:
                      -   id: Dummy module with 1 arg
                          body:
                              type: script
                              id: py_dummy_string_arg
                              input:
                                  string_arg:
                                      type: js
                                      expr: playbook_args.name
        iterator:
          type: js
          expr: "[2]"
        parallel: false
    -   id: last_module
        body:
            type: script
            id: py_dummy_any_arg
            input:
                any_arg:
                    type: js
                    expr: results
    -   id: last_module_2
        body:
            type: script
            id: py_dummy_any_arg
            input:
                any_arg:
                    type: js
                    expr: results.test_forloop[0].forloop_m_1
Вывод модуля last_module
job 862b090a-f513-400f-a52d-04b4151fae0a on worker default_worker_name (tag: all)


--- PYTHON CODE EXECUTION ---

We got any_arg: {"test_forloop":[{"iter_idx":0,"iter_value":2,"forloop_m_0":[{"iter_idx":0,"forloop_m_0_m":{"num_arg":3},"forloop_m_1_m":{"num_arg":3}}],"forloop_m_1":{"string_arg":"Naame"},"forloop_m_2":{"branch_1":{"dummy_string_branch_1_module":{"string_arg":"Naame"}}},"for_loop_m_3":{"chosen_branch":"conditional_case_module","conditional_case_module":{"Dummy module with 1 arg":{"string_arg":"Naame"}}}}]}
Вывод модуля last_module_2
job c6ae64ed-3f36-4151-b16c-dd4e14efe447 on worker default_worker_name (tag: all)


--- PYTHON CODE EXECUTION ---

We got any_arg: {"string_arg":"Name"}