首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过使用Asnible将数字列在行中来替换数字范围

通过使用Asnible将数字列在行中来替换数字范围
EN

Stack Overflow用户
提问于 2021-10-14 08:07:47
回答 2查看 22关注 0票数 0

我正在尝试用模块ansible.netcommon.cli_parse解析半结构化文本(EXOS配置),除了将端口范围带到线性显示之外,一切都进行得很顺利。

下面是一个示例:

代码语言:javascript
复制
        "MGMT-vlan": {
            "ports": {
                "tagged": "2,7-8,13,16-18,30,36,42,57"

我想转换为:

代码语言:javascript
复制
        "MGMT-vlan": {
            "ports": {
                "tagged": "2,7,8,13,16,17,18,30,36,42,57"
EN

回答 2

Stack Overflow用户

发布于 2021-10-14 08:14:29

下面是一个Python函数的实现,它可以像这样进行范围扩展。

代码语言:javascript
复制
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)

这将打印出来

代码语言:javascript
复制
[2, 7, 8, 13, 16, 17, 18, 30, 36, 42, 57]

然后,您可以将其包装在例如an Ansible filter function library中。

这可能就足够了(我的Ansible最近相当生疏):

代码语言:javascript
复制
def expand_ports(value):
    return ",".join(expand_ranges(value))


class FilterModule:
    def filters(self):
        return {
            'expand_ports': expand_ports,
        }
票数 0
EN

Stack Overflow用户

发布于 2021-10-14 08:47:38

给定解析后的数据

代码语言:javascript
复制
    config:
      k1: conf1
      MGMT-vlan:
        ports:
          tagged: "2,7-8,13,16-18,30,36,42,57"
      k9: conf9

可以创建序列

代码语言:javascript
复制
    - 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(',')

给出

代码语言:javascript
复制
  seq|join(','): 2,7,8,13,16,17,18,30,36,42,57

现在,组合数据

代码语言:javascript
复制
    - set_fact:
        config: "{{ config|combine({'MGMT-vlan':
                                   {'ports':
                                   {'tagged': seq|join(',')}}}) }}"

给出

代码语言:javascript
复制
  config:
    MGMT-vlan:
      ports:
        tagged: 2,7,8,13,16,17,18,30,36,42,57
    k1: conf1
    k9: conf9
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69567177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档