Генерация последовательностей с разделенными комой значениями

#ansible #ansible-2.x

#ansible #ansible-2.x

Вопрос:

Я пытаюсь достичь чего-то подобного, например, cisco range commandos с ansible. в моем случае я попробовал следующее:

 - 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, если кто-нибудь сможет мне помочь, я буду рад. Заранее благодарю вас.

Ответ №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(',') }}"
  

Комментарии:

1. Вау, у меня это сработало. Большое спасибо. Можете ли вы немного объяснить, что вы там пишете? Заранее спасибо.

2. здравствуйте, вы начинаете с создания list var (LIST_EPG), затем вы разбиваете свой начальный env var (который дает вам список), после чего вы разбиваете каждый элемент своего списка (split (‘-‘) и который дает вам подсписок всех элементов. И затем вы используете функцию 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"
}
  

Комментарии:

1. Спасибо за ваш ответ @Seshadri_C, но суть этого вопроса заключалась в том, что если пользователи хотят ввести переменную, как я написал выше, в качестве другого примера 497-512,48, 53 ->, в этом случае желаемый результат будет: 497,498,499,500,..,511,512,48,53