2016-10-06 3 views
1

У меня есть список и цикл with_items, где я просматриваю список. Мой вопрос в том, когда я просматриваю список, как я могу зарегистрировать/добавить результат в существующий список? Я использую Ansible версии 2.0.1.0.Зарегистрировать переменную до уже существующего списка

Мой список:

channels: 
    channel1: 
    item1: 'value' 
    item2: 'value' 
    channel2: 
    item1: 'value' 
    item2: 'value' 

Петля:

- name: Do a shell command for each channel 
    shell: some command that returns a number with the help {{ item }} 
    with_items: "{{ channels }}" 
    register: channels.item3.result #?? not sure how to do this 

Что вывод должен быть при выполнении отладки вар = каналы:

channels: 
    channel1: 
    item1: 'value' 
    item2: 'value' 
    item3: 'result from shell command' 
    channel2: 
    item1: 'value' 
    item2: 'value' 
    item3: 'result from shell command' 

ответ

0

Существует множество способов обновления словаря на месте, но все они будут сорваны, потому что Ansible (я считаю) не переносит изменения переменных из задачи в задачу, за исключением случая «set_fact» и, увы, вы не может set_fact в словаре.

Вам необходимо создать фильтр Jinja2, который будет устанавливать элементы в словаре. А затем используйте «register» в задаче для захвата вывода, затем set_fact на «каналы» с измененным словарем. Например:

 
- set_fact: 
    channels: "{{ channels|deep_set(item+'.item3', result) }}" 

В вашем определении для deep_set фильтра, что-то, как это должно работать:

 
@environmentfilter 
do_deep_set(environment, value, attr, val): 
    parent = value 
    parts = [int(x) if x.isdigit(x) else x for x in attr.split('.')] 
    for part in parts: 
     parent=environment.getitem(parent, part) 
    parent[part[-1]] = val 
    return value 

Я использую environment.getitem только в случае, если какая-либо часть детали является атрибутом, а не индекс/ключ. Установка всегда устанавливает элементы.

 Смежные вопросы

  • Нет связанных вопросов^_^