ANSIBLE - как объединить строку со списком - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь объединить строку, на которую ссылаются как на переменную, с вложенным списком

Я изучил варианты использования set_fact и join, но безрезультатно.

#config.yml
- name: concatenate 
  module_name:Test
     state: present
     port: {{ env_dc }}{{item.ports}}
  with_items:
      - "{{ my_list }}"

#group_vars\all.yml
env_dc: uk

my_list:
  - {name: switch1, ports: [p1, p2, p3, p4]}

Я ожидаю следующий вывод:
ukp1
ukp2
ukp3
ukp4

Но я получаю;

"item": {    
    "ports": [     
       "p1",    
       "p2",    
       "p3",    
       "p4"   
     ]

Фактическая книга воспроизведения:

enter image description here

Сообщение об ошибке: enter image description here

1 Ответ

2 голосов
/ 23 мая 2019

Если вы напишите это:

     port: {{ env_dc }}{{item.ports}}

Вы не создаете новый форматированный список, объединяя значение в env_dc с каждым элементом в item.ports; вы просто создаете новую строку с содержимым env_dc, за которым следует строковое представление item.ports. То есть, в вашем примере это оценило бы что-то вроде:

uk['p1', 'p2', 'p3', 'p4']

Вы можете решить эту проблему, используя фильтр map (который может применить фильтр ко всем элементам в списке) и фильтр regex_replace, например:

---
- hosts: localhost
  gather_facts: false
  vars:
    env_dc: uk
    my_list:
      - name: switch1
        ports:
          - p1
          - p2
          - p3
          - p4
  tasks:
    - debug:
        msg: "ports: {{ item.ports|map('regex_replace', '^', env_dc)|list }}"
      with_items: "{{ my_list }}"

Что с учетом данных вашего примера будет оцениваться в:

TASK [debug] **********************************************************************************
ok: [localhost] => (item={u'name': u'switch1', u'ports': [u'p1', u'p2', u'p3', u'p4']}) => {
    "msg": "ports: [u'ukp1', u'ukp2', u'ukp3', u'ukp4']"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...