我正在尝试将一个字符串附加到 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 {"
]
Run Code Online (Sandbox Code Playgroud)
topology_payload 的预期输出应该是这样的:-
基本上我需要在每个输出前面附加一个字符串“删除”。
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"
Run Code Online (Sandbox Code Playgroud)
Vla*_*tka 11
问: “在每个项目前面添加一个字符串。”'delete'
A:这就是你要找的东西吗?
- hosts: localhost
vars:
info: ['a', 'b', 'c']
tasks:
- set_fact:
payload: "{{ payload|default([]) + ['delete ' ~ item] }}"
loop: "{{ info }}"
- debug:
var: payload
Run Code Online (Sandbox Code Playgroud)
给出(删节)
payload:
- delete a
- delete b
- delete c
Run Code Online (Sandbox Code Playgroud)
无需迭代即可实现相同的结果(信用@Romain DEQUIDT)
- hosts: localhost
vars:
info: ['a', 'b', 'c']
payload: "{{ ['delete']|product(info)|map('join', ' ')|list }}"
tasks:
- debug:
var: payload
Run Code Online (Sandbox Code Playgroud)
问:“在每个以 开头的输出前面添加一个字符串‘delete’ 'gtm topology'。”
A:使用测试搜索
- hosts: localhost
gather_facts: false
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
Run Code Online (Sandbox Code Playgroud)
给出(删节)
payload:
- delete gtm topology
Run Code Online (Sandbox Code Playgroud)
无需迭代即可达到相同的结果
- hosts: localhost
vars:
info: ['a', 'gtm topology', 'c']
info_gtm_topology: "{{ info|select('search', '^gtm topology') }}"
payload: "{{ ['delete']|product(info_gtm_topology)|map('join', ' ')|list }}"
tasks:
- debug:
var: payload
Run Code Online (Sandbox Code Playgroud)
问:“除了上述条件外,处理列表,直到'test-pool1'找到为止。”
A:还可以使用测试搜索来查找最后一项的索引
hosts: localhost
vars:
info: ['a', 'gtm topology 1', 'c', 'test-pool1', 'gtm topology 2', 'd']
stop_regex: '.*pool1.*'
stop_items: "{{ info|select('search', stop_regex) }}"
stop_index: "{{ info.index(stop_items.0) }}"
tasks:
- set_fact:
payload: "{{ payload|default([]) + ['delete ' ~ item] }}"
loop: "{{ info[:stop_index|int] }}"
when: item is search('^gtm topology')
- debug:
var: payload
Run Code Online (Sandbox Code Playgroud)
给出(删节)
payload:
- delete gtm topology 1
Run Code Online (Sandbox Code Playgroud)
无需迭代即可达到相同的结果
- hosts: localhost
vars:
info: ['a', 'gtm topology 1', 'c', 'test-pool1', 'gtm topology 2', 'd']
stop_regex: '.*pool1.*'
stop_items: "{{ info|select('search', stop_regex) }}"
stop_index: "{{ info.index(stop_items.0) }}"
info_gtm_topology: "{{ info[:stop_index|int]|select('search', '^gtm topology') }}"
payload: "{{ ['delete']|product(info_gtm_topology)|map('join', ' ')|list }}"
tasks:
- debug:
var: payload
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您可以创建自定义过滤器。请参阅过滤器插件
shell> cat filter_plugins/list_search.py
import re
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
class FilterModule(object):
''' Ansible filters for operating on lists '''
def filters(self):
return {
'list_index': list_index,
'list_search': list_search,
}
Run Code Online (Sandbox Code Playgroud)
下面的剧
- hosts: localhost
vars:
info: ['a', 'gtm topology 1', 'c', 'test-pool1', 'gtm topology 2', 'd']
stop_regex: '.*pool1.*'
stop_items: "{{ info|list_search(stop_regex) }}"
stop_index: "{{ info|list_index(stop_items.0) }}"
info_gtm_topology: "{{ info[:stop_index|int]|select('search', '^gtm topology') }}"
payload: "{{ ['delete']|product(info_gtm_topology)|map('join', ' ')|list }}"
tasks:
- debug:
var: payload
Run Code Online (Sandbox Code Playgroud)
给出相同的结果
payload:
- delete gtm topology 1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25846 次 |
| 最近记录: |