我正在尝试用模块ansible.netcommon.cli_parse解析半结构化文本(EXOS配置),除了将端口范围带到线性显示之外,一切都进行得很顺利。
下面是一个示例:
"MGMT-vlan": {
"ports": {
"tagged": "2,7-8,13,16-18,30,36,42,57"我想转换为:
"MGMT-vlan": {
"ports": {
"tagged": "2,7,8,13,16,17,18,30,36,42,57"发布于 2021-10-14 08:14:29
下面是一个Python函数的实现,它可以像这样进行范围扩展。
def expand_ranges(s):
for atom in s.split(","):
if "-" in atom:
a, _, b = atom.partition("-")
yield from range(int(a), int(b) + 1)
else:
yield int(atom)
expanded_ports = list(expand_ranges("2,7-8,13,16-18,30,36,42,57"))
print(expanded_ports)这将打印出来
[2, 7, 8, 13, 16, 17, 18, 30, 36, 42, 57]然后,您可以将其包装在例如an Ansible filter function library中。
这可能就足够了(我的Ansible最近相当生疏):
def expand_ports(value):
return ",".join(expand_ranges(value))
class FilterModule:
def filters(self):
return {
'expand_ports': expand_ports,
}发布于 2021-10-14 08:47:38
给定解析后的数据
config:
k1: conf1
MGMT-vlan:
ports:
tagged: "2,7-8,13,16-18,30,36,42,57"
k9: conf9可以创建序列
- set_fact:
seq: "{{ seq|d([]) + [_seq] }}"
loop: "{{ config['MGMT-vlan'].ports.tagged.split(',') }}"
vars:
_arr: "{{ item.split('-') }}"
_seq: "{{ range(_arr.0|int, _arr.1|d(_arr.0)|int + 1)|join(',') }}"
- debug:
var: seq|join(',')给出
seq|join(','): 2,7,8,13,16,17,18,30,36,42,57现在,组合数据
- set_fact:
config: "{{ config|combine({'MGMT-vlan':
{'ports':
{'tagged': seq|join(',')}}}) }}"给出
config:
MGMT-vlan:
ports:
tagged: 2,7,8,13,16,17,18,30,36,42,57
k1: conf1
k9: conf9https://stackoverflow.com/questions/69567177
复制相似问题