Добавить строку в список в Ansible

Я пытаюсь добавить строку в список в ansible, поэтому в основном я буду создавать полезную нагрузку для удаления нескольких записей топологии в сетевом механизме F5 GTM.

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


- name: Lookup Topology Records  
  bigip_command:
    user: admin
    password: password
    server: gtm.abc.com
    commands: "list gtm topology | grep -i '{{ item }}'"
    warn: no
    validate_certs: no
  register: topology_info
  delegate_to: localhost
  loop: "{{ gtm_pool }}"

- debug: var=topology_info

- name: Sanitize the Topology records of the Pool
  set_fact:
    clean_topology_info: "{{ clean_topology_info | default ([]) + item.stdout_lines  }}"
  loop: "{{ topology_info.results }}"

- debug: var=clean_topology_info


- name: Sanitized Topology Info
  vars:
    topology_item: "{{ item }}"
   set_fact:
     sanitized_topology_info: "{{ sanitized_topology_info | default ([]) + topology_item }}"
  loop: "{{ clean_topology_info }}"

- name: Build payload to delete the Topology Record
  set_fact:
    topology_payload: "{{ topology_payload | default([]) + ['delete'] + item }}"
  loop: "{{ clean_topology_info }}"

- debug: var=topology_payload

------------------------------------------------------------
Debug outputs(stdout_lines) as below :-

"gtm_pool": [
        "test-poo1", 
        "test-pool2"
    ]

debug of "topology_info" :-

"stdout_lines": [
                    [
                        "gtm topology ldns: subnet 10.10.10.0/24 server: pool /Common/test-pool1 {", 
                        "gtm topology ldns: subnet 10.8.22.0/24 server: pool /Common/test-pool1 {"
                    ]
                ]

"stdout_lines": [
                    [
                        "gtm topology ldns: subnet 0.0.0.0/0 server: pool /Common/test-pool2 {"
                    ]


debug of "clean_topology_info":-

"clean_topology_info": [
        [
                        "gtm topology ldns: subnet 10.10.10.0/24 server: pool /Common/test-pool1 {", 
                        "gtm topology ldns: subnet 10.8.22.0/24 server: pool /Common/test-pool1 {", 
        ], 
        [
            "gtm topology ldns: subnet 0.0.0.0/0 server: pool /Common/test-pool2 {",
        ]
    ]

debug of "sanitized_topology_info":-

"sanitized_topology_info": [
             "gtm topology ldns: subnet 10.10.10.0/24 server: pool /Common/test-pool1 {", 
                        "gtm topology ldns: subnet 10.8.22.0/24 server: pool /Common/test-pool1 {", 
           "gtm topology ldns: subnet 0.0.0.0/0 server: pool /Common/test-pool2 {"
        ]



debug of "topology_payload":-

"topology_payload": [
        "delete", 
        "gtm topology ldns: subnet 10.10.10.0/24 server: pool /Common/test-pool1 {", 
                        "gtm topology ldns: subnet 10.8.22.0/24 server: pool /Common/test-pool1 {",  
        "delete", 
       "gtm topology ldns: subnet 0.0.0.0/0 server: pool /Common/test-pool2 {"
    ]


Expected output of topology_payload should be like :-

Basically i need to append a string 'delete' infront of the each output.

"topology_payload": [ 
        "delete gtm topology ldns: subnet 10.10.10.0/24 server: pool /Common/test-pool1 {", 
                        "delete gtm topology ldns: subnet 10.8.22.0/24 server: pool /Common/test-pool1 {",  
       "delete gtm topology ldns: subnet 0.0.0.0/0 server: pool /Common/test-pool2 {"
    ]

Ожидаемый вывод topology_payload должен быть таким: -

В основном мне нужно добавить строку «удалить» перед каждым выходом.

"топология_полезной нагрузки": [ "удалить топологию gtm ldns: подсеть 10.10.10.0/24 server: pool /Common/test-pool1 {", "удалить топологию gtm ldns: подсеть 10.8.22.0/24 server: pool /Common/test-pool1 {",
"удалить топологию gtm ldns: подсеть 0.0.0.0/0 server: pool /Common/test-pool2 {" ]

Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
3
0
10 590
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать фильтр карты для применения функции к каждому элементу в списке. Сочетая его с regex_replace, вы можете добиться желаемого результата:

---
- hosts: localhost
  gather_facts: false
  vars:
      string: "prepend "
      list: ["value1", "value2", "value3"]
  tasks:
    - name: "append string to each element in a list"
      set_fact:
          list: "{{ list | map('regex_replace', '(.*)', '{{ string }}\\1') | list }}"
    - debug:
          msg: "{{ list }}"
Ответ принят как подходящий

Это ты находясь в поиске?

      vars:
        info: [ 'a', 'b', 'c' ]
      tasks:
        - set_fact:
            payload: "{{ payload|default([]) + [ 'delete ' ~ item ] }}"
          loop: "{{ info }}"
        - debug:
            var: payload

дает:

    "payload": [
        "delete a", 
        "delete b", 
        "delete c"
    ]

To append delete each thing that is staring with gtm topology

      vars:
        info: [ 'a', 'gtm topology', 'c' ]
      tasks:
        - set_fact:
            payload: "{{ payload|default([]) + [ 'delete ' ~ item ] }}"
          loop: "{{ info }}"
          when: item is search('^gtm topology')
        - debug:
            var: payload

дает:

      payload:
      - delete gtm topology

В дополнение к условиям, указанным выше и

To have the output till test-pool1

используйте filter_plugins

    def list_search(l, x):
        r = re.compile(x)
        return list(filter(r.match, l))
    def list_index(l, x, *i):
        if len(i) == 0:
            return l.index(x) if x in l else -1
        elif len(i) == 1:
            return l.index(x, i[0]) if x in l[i[0]:] else -1
        else:
            return l.index(x, i[0], i[1]) if x in l[i[0]:i[1]] else -1

Игра ниже

      vars:
        info: [ 'a', 'gtm topology 1', 'c', 'test-pool1', 'gtm topology 2', 'd' ]
        stop_regex: '.*pool1.*'
      tasks:
        - set_fact: # Find elements that match stop_regex
            stop_elements: "{{ info|list_search(stop_regex) }}"
        - set_fact: # Find index of the fist element that match stop_regex
            stop_index: "{{ info|list_index(stop_elements.0) }}"
        - set_fact: # Select and transform elements of the list
            payload: "{{ payload|default([]) + [ 'delete ' ~ item ] }}"
          loop: "{{ info[0:stop_index|int] }}"
          when: item is search('^gtm topology')
        - debug:
            var: payload

дает:

      payload:
      - delete gtm topology 1

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

Nalore 14.06.2019 11:30

Как я могу удалить последний последний {" , могу ли я использовать фильтр замены и попробовать? Топология gtm ldns: подсеть 10.8.22.0/24 server: pool /Common/test-pool1 {", "удалить топологию gtm ldns: subnet 0.0.0.0/0 server: pool /Common/test-pool2 {" ]

Nalore 14.06.2019 11:33

Какой последний "{" нужно удалить? Обновите вопрос и сделайте его минимальным, пожалуйста. Это довольно чтение.

Vladimir Botka 14.06.2019 11:37

Извините, мне нужно, чтобы вывод был до test-pool1, и мне не нужно {. Для вас ссылка «удалить топологию gtm ldns: подсеть 10.10.10.0/24 server: pool /Common/test-pool1 {»

Nalore 14.06.2019 11:51

filter_plugins list_method.py может помочь вам сократить список.

Vladimir Botka 14.06.2019 11:58

Хорошо, позвольте мне попробовать, можем ли мы использовать фильтр замены, чтобы добиться того же. Спасибо !

Nalore 14.06.2019 12:01

См. Примеры.

Vladimir Botka 14.06.2019 12:21

Вы можете использовать фильтр товаров для префикса или суффикса списка элементов:

---
- hosts: localhost
  gather_facts: false
  vars:
      string: "prepend "
      list: ["value1", "value2", "value3"]
  tasks:
    - name: "prefix"
      set_fact:
          prefix_list: "{{ ["prefix_"] | product(list) | map('join') }}"
    - debug:
          msg: "{{ prefix_list }}"
    - name: "suffix"
      set_fact:
          suffix_list: "{{ list | product(["_suffix"]) | map('join') }}"
    - debug:
          msg: "{{ suffix_list }}"

Это гораздо более элегантное решение, но для его работы необходимо поместить строку в список, т.е. ["prefix_"]

rags 21.06.2021 16:39

Другие вопросы по теме