Ansible 用分离值生成序列

Ansible 用分离值生成序列,ansible,ansible-2.x,Ansible,Ansible 2.x,我正试图通过ansible实现类似cisco系列突击队的目标。就我而言,我尝试了以下方法: - name: test playbook hosts: all connection: local gather_facts: no vars: epg: "{{ lookup('env','EPG').split(',') }}" task: - debug: var:(item|int) with_sequence_

我正试图通过ansible实现类似cisco系列突击队的目标。就我而言,我尝试了以下方法:

- 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)

如果有人能帮助我,我会很高兴的。提前感谢。

通过在
EPG
环境变量中拆分逗号分隔的列表,您正在
EPG
中创建一个数组/列表。所以我们需要反复讨论这个问题

将环境变量视为:

export EPG="10,11,12,13,20"
并重用
epg
变量:

vars:
epg:{{lookup('env','epg').split(',')}
任务:
-调试:
msg:“{{item}}”
循环:“{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"
}

您必须将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(',') }}"

谢谢你的回答@Seshadri_C,但这个问题的重点是,如果用户想输入我上面写的变量,另一个例子是497-512,48,53-->,在这种情况下,所需的输出是:497498499500,…,511512,48,53Wow,这对我来说很有效。谢谢。你能解释一下你在上面写的东西吗?您好,首先创建一个列表变量(list_EPG),然后拆分初始环境变量(它会给您一个列表),然后拆分列表中的每个项目(拆分('-'))然后,使用range函数得到子列表中两个元素之间的每个整数,并将它们添加到列表中。之后,最后的列表被展平以获得单个维度列表,并用逗号分隔元素。