【问题标题】:Generating sequences with coma seperated values使用逗号分隔值生成序列
【发布时间】:2020-09-03 10:12:07
【问题描述】:

我正在尝试使用 ansible 实现类似 cisco range commandos 的功能。就我而言,我尝试了以下方法:

- name: test playbook
  hosts: all 
  connection: local
  gather_facts: no
  vars:
       epg: "{{ lookup('env','EPG').split(',') }}"

  task:
  - debug:
      var:(item|int)
    with_sequence_ "{{ epg }}"

输入将由用户进行,可以是:10-13,20 在这种情况下,我想要像 cisco IOS 控制台一样:10,11,12,13,20 相反,我得到以下输出:

TASK [debug] *******************************************************************
task path: /opt2/jenkins/TEST/TEST interface.yaml:42
ok: [tst] => (item=10) => {
    "(item|int)": "10", 
    "ansible_loop_var": "item", 
    "item": "10"
}
ok: [tst] => (item=11) => {
    "(item|int)": "11", 
    "ansible_loop_var": "item", 
    "item": "11"
}
ok: [tst] => (item=12) => {
    "(item|int)": "12", 
    "ansible_loop_var": "item", 
    "item": "12"
}
ok: [tst] => (item=13) => {
    "(item|int)": "13", 
    "ansible_loop_var": "item", 
    "item": "13"
}
ok: [tst] => (item=1) => {
    "(item|int)": "1", 
    "ansible_loop_var": "item", 
    "item": "1"
}
ok: [tst] => (item=2) => {
    "(item|int)": "2", 
    "ansible_loop_var": "item", 
    "item": "2"
}
ok: [tst] => (item=3) => {
    "(item|int)": "3", 
    "ansible_loop_var": "item", 
    "item": "3"
... (so on up to 20)

如果有人可以帮助我,我怎么能只得到 10、11、12、13 和 20,我会很高兴。提前谢谢你。

【问题讨论】:

    标签: ansible ansible-2.x


    【解决方案1】:

    您必须组合 jinja2 和 Ansible 过滤器列表。这并不容易,但试试这个:

    - name: test playbook
      hosts: all 
      vars:
           epg: "{{ lookup('env','EPG')}}"
    
      task:
      - debug:
          msg: "{% set LIST_EPG=[] %}{% for it in (epg.split(',')) %}{% set int1=it.split('-')[0] | int() %}{% if it.split('-') |length > 1 %}{% set int2=it.split('-')[1] | int() %}{% for i in range(int1, int2+1) %}{{ LIST_EPG.append(i|int) }}{% endfor %}{% endif %}{{ LIST_EPG.append(int1| int) }}{% endfor %}{{LIST_EPG|flatten|unique|join(',') }}"
    

    【讨论】:

    • 哇,这对我有用。非常感谢。你能解释一下你在那里写的东西吗?提前致谢。
    • 您好,您首先创建一个列表变量 (LIST_EPG),然后拆分初始 env 变量(给您一个列表),然后拆分列表中的每个项目(拆分 ('- ') 并为您提供每个项目的子列表。然后,您使用 range 函数获取子列表的两个元素之间的每个整数,然后将它们添加到列表中。之后,最终列表被展平为获取单个维度列表,然后用逗号分隔元素。
    【解决方案2】:

    通过在EPG 环境变量中拆分逗号分隔列表,您将在epg 中创建一个数组/列表。所以我们需要对其进行迭代。

    考虑环境变量为:

    export EPG="10,11,12,13,20"
    

    并重用您的 epg 变量:

      vars:
        epg: "{{ lookup('env', 'EPG').split(',') }}"
    
      tasks:      
      - debug:
          msg: "{{ item }}"
        loop: "{{ epg }}"
    

    我们可以得到这个结果:

    ok: [localhost] => (item=10) => {
        "msg": "10"
    }
    ok: [localhost] => (item=11) => {
        "msg": "11"
    }
    ok: [localhost] => (item=12) => {
        "msg": "12"
    }
    ok: [localhost] => (item=13) => {
        "msg": "13"
    }
    ok: [localhost] => (item=20) => {
        "msg": "20"
    }
    

    【讨论】:

    • 感谢您的回答@Seshadri_C,但这个问题的重点是,如果用户想要输入我上面写的变量,作为另一个例子 497-512,48,53 --> ,在这种情况下,所需的输出是:497,498,499,500,..,511,512,48,53
    猜你喜欢
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2015-08-24
    • 2016-07-29
    • 2013-07-03
    相关资源
    最近更新 更多