Я пытаюсь добавить строку в список в 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 {"
]

Вы можете использовать фильтр карты для применения функции к каждому элементу в списке. Сочетая его с 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
Как я могу удалить последний последний {" , могу ли я использовать фильтр замены и попробовать? Топология 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 {" ]
Какой последний "{" нужно удалить? Обновите вопрос и сделайте его минимальным, пожалуйста. Это довольно чтение.
Извините, мне нужно, чтобы вывод был до test-pool1, и мне не нужно {. Для вас ссылка «удалить топологию gtm ldns: подсеть 10.10.10.0/24 server: pool /Common/test-pool1 {»
filter_plugins list_method.py может помочь вам сократить список.
Хорошо, позвольте мне попробовать, можем ли мы использовать фильтр замены, чтобы добиться того же. Спасибо !
См. Примеры.
Вы можете использовать фильтр товаров для префикса или суффикса списка элементов:
---
- 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_"]
Эй, большое спасибо, все работает отлично. Моя ошибка заключалась в попытке зациклиться с какой-то другой переменной.