Специальные переменные в плейбуках

Переменная results

Описание переменной results находится в статье Переменная results.

Переменная previous_result

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

Пример использования переменной previous_result
id: playbook_with_forloop_previous_result
name: Playbook with forloop previous_result
version: 0.0.10
type: playbook
tags: [playbook_special_envs]
body:
  input:
    properties:
      name:
        type: string
        description: ""
        default: ""
  modules:
    - id: test_forloop
      body:
        type: forloop
        modules:
          -   id: forloop_m_0
              body:
                type: all
                branches:
                  - summary: Branch 1
                    id: branch_1
                    modules:
                      - id: dummy_string_branch_1
                        body:
                            type: script
                            id: py_dummy_any_arg
                            input:
                                any_arg:
                                    type: js
                                    expr: playbook_args.name
                    parallel: false
                    skip_failure: true
                parallel: false
          -   id: forloop_m_1
              body:
                  type: script
                  id: py_dummy_any_arg
                  input:
                    any_arg:
                        type: js
                        expr: previous_result.branch_1
        iterator:
          type: js
          expr: "[2, 3]"
        parallel: false
Пример хранимого результата переменной previous_result
dummy_string_branch_1:
We got any_arg: Naame

forloop_m_1_:
We got any_arg: {"dummy_string_branch_1":{"any_arg":"Naame"}}

Переменная relative_results

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

Пример использования переменной relative_results
id: playbook_with_forloop_relative_results
name: Playbook with forloop relative results
version: 0.0.6
type: playbook
tags: [playbook_special_envs]
body:
  input:
    properties:
      name:
        type: string
        description: ""
        default: ""
  modules:
    - id: test_forloop
      body:
        type: forloop
        modules:
          -   id: forloop_m_0
              body:
                  type: script
                  id: py_dummy_string_arg
                  input:
                    string_arg:
                        type: js
                        expr: playbook_args.name
          -   id: forloop_m_1
              body:
                  type: script
                  id: py_dummy_any_arg
                  input:
                      any_arg:
                          type: js
                          expr: relative_results # parent is test_forloop[n]
          - id: for_loop_m_2
            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
                -   id: default_case_module_2
                    body:
                        type: script
                        id: py_dummy_any_arg
                        input:
                            any_arg:
                                type: js
                                expr: relative_results.default_case_module # parent is test_forloop[n].for_loop_m_2.default
              branches:
                -   summary: branch_1
                    id: conditional_case_module
                    condition: playbook_args.name == 'Naame'
                    modules:
                      -   id: cond_case_m_1
                          body:
                              type: script
                              id: py_dummy_string_arg
                              input:
                                  string_arg:
                                      type: js
                                      expr: playbook_args.name
                      -   id: cond_case_m_2
                          body:
                              type: script
                              id: py_dummy_any_arg
                              input:
                                  any_arg:
                                      type: js
                                      expr: relative_results.cond_case_m_1 # parent is test_forloop[n].for_loop_m_2.conditional_case_module
        iterator:
          type: js
          expr: "[2]"
        parallel: false
    -   id: last_module
        body:
            type: script
            id: py_dummy_any_arg
            input:
                any_arg:
                    type: js
                    expr: relative_results # basically the same as results, becase parent is root
    -   id: last_module_2
        body:
            type: script
            id: py_dummy_any_arg
            input:
                any_arg:
                    type: js
                    expr: relative_results.test_forloop[0].forloop_m_0 # basically the same as results, becase parent is root
Пример хранимого результата переменной relative_results
forloop_m_0:

We got string_arg: Naame

forloop_m_1:

We got any_arg: {"iter_idx":0,"iter_value":2,"forloop_m_0":{"string_arg":"Naame"}}

cond_case_m_1:

We got string_arg: Naame

cond_case_m_2:

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

last_module # (находится в корне, поэтому по сути для него relative_results = results):

{"test_forloop":[{"iter_idx":0,"iter_value":2,"forloop_m_0":{"string_arg":"Naame"},"forloop_m_1":{"any_arg":"{\"iter_idx\":0,\"iter_value\":2,\"forloop_m_0\":{\"string_arg\":\"Naame\"}}"},"for_loop_m_2":{"chosen_branch":"conditional_case_module","conditional_case_module":{"cond_case_m_1":{"string_arg":"Naame"},"cond_case_m_2":{"any_arg":"{\"string_arg\":\"Naame\"}"}}}}]}

last_module_2 # (находится в корне, поэтому по сути для него relative_results = results):

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

Переменная iter_ctx

Переменная iter_ctx содержит в себе информацию о текущей и предыдущей итерациях цикла:

iter_ctx: {"previous_iter":{"index":0,"value":2},"current_iter":{"index":1,"value":4}}
Пример использования переменной iter_ctx
id: playbook_with_forloop_iter_ctx
name: Playbook with forloop iter ctx
version: 0.0.13
type: playbook
body:
  input:
    properties: {}
  modules:
    - id: test_forloop
      body:
        type: forloop
        modules:
          -   id: forloop_m_1
              body:
                  type: script
                  id: py_dummy_any_arg
                  input:
                      any_arg:
                          type: js
                          expr: iter_ctx
          -   id: forloop_m_2
              body:
                  type: script
                  id: py_dummy_any_arg
                  input:
                      any_arg:
                          type: js
                          expr: iter_ctx.current_iter.index
          -   id: forloop_m_3
              body:
                  type: script
                  id: py_dummy_any_arg
                  input:
                      any_arg:
                          type: js
                          expr: iter_ctx.previous_iter.value
        iterator:
          type: js
          expr: "[2, 4]"
        parallel: false

Использование переменной iter_ctx во вложенных итерациях

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

  • current_iter (index, value) — информация о текущей итерации.

  • previous_iter (index,value) — информация о предыдущей итерации, если эта итерация существует.

  • parent_iter — информация о родительской итерации, если эта итерация существует. Имеет такую же структуру, как и iter_ctx.

Если имеется дополнительное вложение, внутри parent_iter может храниться parent_iter. Количество вложений не ограничено.
Структура переменной iter_ctx
iter_ctx: {
    "current_iter": {
        "index": 1,
        "value": 4
    },
    "previous_iter": {
        "index": 0,
        "value": 2
    },
    "parent_iter": {
        "previous_iter": {
            ...
        },
        "current_iter": {
            ...
        },
        "parent_iter": {
            ...
        }
    }
}
id: playbook_with_nested_iter_ctx
name: Playbook with nester iter ctx
version: 0.0.6
type: playbook
tags: [playbook_special_envs]
body:
  input:
    properties: {}
  modules:
    - id: root_forloop
      body:
        type: forloop
        modules:
          -   id: root_forloop_script
              body:
                  type: script
                  id: py_dummy_any_arg
                  input:
                      any_arg:
                          type: js
                          # Get whole iter_ctx.
                          expr: iter_ctx
          - id: root_forloop_nested_forloop
            body:
              type: forloop
              modules:
                -   id: root_forloop_nested_forloop_script
                    body:
                        type: script
                        id: py_dummy_any_arg
                        input:
                            any_arg:
                                type: js
                                # Get current iter of parent iter (root_forloop).
                                expr: iter_ctx.parent_iter.current_iter
                - id: root_forloop_nested_forloop_branch_all
                  body:
                    type: all
                    parallel: false
                    branches:
                      - summary: Branch 1
                        id: root_forloop_nested_forloop_branch_all_branch1
                        modules:
                          - id: root_forloop_nested_forloop_branch_all_branch1_script1
                            body:
                                type: script
                                id: py_dummy_any_arg
                                input:
                                    any_arg:
                                        type: js
                                        # Get current iter of parent iter (root_forloop).
                                        expr: iter_ctx.parent_iter.current_iter
                          - id: root_forloop_nested_forloop_branch_all_branch1_script2
                            body:
                                type: script
                                id: py_dummy_any_arg
                                input:
                                    any_arg:
                                        type: js
                                        # Get whole iter ctx.
                                        expr: iter_ctx
                          - id: root_forloop_nested_forloop_branch_all_branch1_nnforloop
                            body:
                              type: forloop
                              modules:
                                - id: root_forloop_nested_forloop_branch_all_branch1_nnforloop_script1
                                  body:
                                      type: script
                                      id: py_dummy_any_arg
                                      input:
                                          any_arg:
                                              type: js
                                              # Get index of self current iter (root_forloop_nested_forloop_branch_all_branch1_nnforloop).
                                              expr: iter_ctx.current_iter.index
                                - id: root_forloop_nested_forloop_branch_all_branch1_nnforloop_script2
                                  body:
                                      type: script
                                      id: py_dummy_any_arg
                                      input:
                                          any_arg:
                                              type: js
                                              # Get current iter of parent of parent (root_forloop).
                                              expr: iter_ctx.parent_iter.parent_iter.current_iter
                              iterator:
                                type: js
                                expr: "[2]"
                              parallel: false
                              skip_failures: true
              iterator:
                type: js
                expr: "[2]"
              parallel: false
        iterator:
          type: js
          expr: "[2]"
        parallel: false

Переменная playbook_args

Переменная playbook_args представляет собой аргументы плейбука. Ознакомиться с ее использованием можно в вышеприведенных примерах.