ansible - добавить строку к каждому элементу списка, хранящемуся в переменной - PullRequest
1 голос
/ 21 марта 2020

Hello Developer Community!

В настоящее время я работаю над созданием некоторых Ansible playbook для управления конфигурацией Citrix NetScaler и хотел бы получить некоторую помощь по следующим вопросам. У меня есть следующая структура данных, определенная в файле YAML:

prefix_header:                         "foo"
prefix_trailer:                        "bar"

nsapp_cs_vserver:
  - name:                              "testwebvserver-4_SSL_443"
    policybindings:
      - policyname:                    "TO_testwebservice-3"
        priority:                      "100"
      - policyname:                    "To-be-deleted"
        priority:                      "110"

Я пытаюсь найти простой способ динамического преобразования содержимого переменной списка «policybindings» в следующий формат: (Я хотел бы чтобы добавить префиксы заголовка и трейлера к фактическому значению «policyname»)

    policybindings:
      - policyname:                    "foo_TO_testwebservice-3_bar"
        priority:                      "100"
      - policyname:                    "foo_To-be-deleted_bar"
        priority:                      "110"

Я хотел бы использовать имена политик с префиксами заголовка и трейлера для вызова netscaler_cs_vserver Ansible module настроить переключение контента.

- name: "Bind CS policy(ies) to CS vServer(s) on ACTIVE node"
  netscaler_cs_vserver:
    name: "{{ prefix_header }}{{ item.name }}{{ prefix_trailer}}"
    policybindings: "{{ item.policybindings }}"
  register: bind_nsapp_cs_policy_result
  loop: "{{ nsapp_cs_vserver }}"

Может кто-нибудь сообщить, какой правильный и эффективный способ добиться этого?

Большое спасибо заранее!

1 Ответ

1 голос
/ 21 марта 2020

Возможно l oop include_tasks для обработки вложенных списков. Например, файл

shell> cat convert-list.yml
- set_fact:
    policybindings: []
- set_fact:
    policybindings: "{{ policybindings +
                        [item|combine({'policyname':
                              item.policyname|
                              regex_replace( myregex, myreplace)})] }}"
  loop: "{{ outer_item.policybindings }}"
  vars:
    myregex: '^(.*)$'
    myreplace: "{{ prefix_header ~ '_\\1_' ~ prefix_trailer }}"

- set_fact:
    nsapp_cs_vserver2: "{{ nsapp_cs_vserver2|default([]) +
                           [outer_item|combine({'policybindings': policybindings})] }}"

, включенный в задачу "external l oop"

    - include_tasks: convert-list.yml
      loop: "{{ nsapp_cs_vserver }}"
      loop_control:
        loop_var: outer_item
    - debug:
        var: nsapp_cs_vserver2

, дает

    "nsapp_cs_vserver2": [
        {
            "name": "testwebvserver-4_SSL_443", 
            "policybindings": [
                {
                    "policyname": "foo_TO_testwebservice-3_bar", 
                    "priority": "100"
                }, 
                {
                    "policyname": "foo_To-be-deleted_bar", 
                    "priority": "110"
                }
            ]
        }
    ]
...