2014-11-06 5 views
5

я использую «оболочки:», чтобы получить какие-то данные, обернув над «with_items:» и зарегистрировать его в качестве другой переменной. Позже с помощью «lineinfile:» я пытаюсь применить содержимое ранее переменной, но не в состоянии использовать «{{}} variable.stdout», как он показывает, как не определено в «with_items:»анзибль с помощью петли и нескольких переменных

есть ли способ сказать анзибль, что для "variable.stdout" не смотрите в "with_items:"

--- 
- include_vars: /root/template.yml 

- name: Getting MAC 
    shell: "cat /sys/class/net/{{item.name}}/address" 
    register: mac 
    with_items: 
    - "{{ interfaces_ipv4 }}" 

- name: Setting MAC 
    lineinfile: 
    state=present 
    dest=/etc/sysconfig/network-scripts/ifcfg-{{item.name}} 
    regexp='^HWADDR=.*' 
    line="HWADDR={{mac.stdout}}" 
    with_items: 
    - "{{ interfaces_ipv4 }}" 
    tags: 
    - set_mac 

Содержание переменной файла

#/root/tempplate.yml 

- name: ens35 
    bootproto: dhcp 
- name: ens34 
    bootproto: none 

При выполнении:

ЗАДАЧА: [макинтош | Настройка MAC] *********************************************** ****** фатальным: [192.168.211.146] =>один или более неопределенные переменные: 'ДИКТ' объект не имеет атрибута 'STDOUT'

FATAL: все хозяева уже не удалось - ABORTING

+0

Пожалуйста, дайте сильное внимание к использованию анзибля в 'template' модуля вместо' lineinfile'. Последний - антипаттерн; он имеет тенденцию к значительной сложности и болью. – tedder42

ответ

8

register работает немного по-разному, когда используется внутри петель (см. here). В этом случае ваша переменная будет содержать элемент results, который представляет собой список с результатами каждой итерации в качестве элементов. Каждый элемент в этом списке также будет иметь элемент item, при этом элемент будет повторяться.

Например:

mac: { 
    msg: "All items completed", 
    results: [ 
     { 
      changed: True, 
      stdout: "some_stdout", 
      item: { 
       name: "some_name1" 
      } 
     }, 
     { 
      changed: True, 
      stdout: "some_stdout2", 
      item: { 
       name: "some_name2" 
      } 
     } 
    ] 
} 

Вы могли бы перебирает, что вместо первоначального списка:

- name: Setting MAC 
    lineinfile: 
    state=present 
    dest=/etc/sysconfig/network-scripts/ifcfg-{{item.item.name}} 
    regexp='^HWADDR=.*' 
    line="HWADDR={{item.stdout}}" 
    with_items: mac.results 
    tags: 
    - set_mac