итерация с использованием with_items и регистрация

Ищу помощь с проблемой, с которой я боролся несколько часов. Я хочу выполнить итерацию по списку, запустить команду, зарегистрировать вывод для каждой команды, а затем выполнить итерацию с отладкой по каждому уникальному регистру {{someregister}}. Stdout

Например, следующий код выдаст «msg»: «1» и «msg»: «2».

---

- hosts: localhost
  gather_facts: false

  vars:
    numbers:
      - name: "first"
        int: "1"
      - name: "second"
        int: "2"

  tasks:

    - name: Register output
      command: "/bin/echo {{ item.int }}"
      register: result
      with_items: "{{ numbers }}"

    - debug: msg={{ item.stdout }}
      with_items: "{{ result.results }}"

Однако если я попытаюсь записать вывод команды в регистровую переменную с именем with_list, у меня возникнут проблемы с доступом к списку или элементам в нем. Например, немного изменив код, чтобы:

---

- hosts: localhost
  gather_facts: false

  vars:
    numbers:
      - name: "first"
        int: "1"
      - name: "second"
        int: "2"

  tasks:

    - name: Register output
      command: "/bin/echo {{ item.int }}"
      register: "{{ item.name }}"
      with_items: "{{ numbers }}"

    - debug: var={{ item.name.stdout }}
      with_items: "{{ numbers }}"

Дает мне:

TASK [debug] 

> ******************************************************************* fatal: [localhost]: FAILED! => {"failed": true, "msg": "'unicode
> object' has no attribute 'stdout'"}

Разве невозможно динамически назвать регистр выходом команды, который затем может быть вызван позже в игре? Я хотел бы, чтобы каждая итерация команды и ее последующее имя register были доступны уникальным образом, например, учитывая последний пример, я ожидаю, что будут зарегистрированы переменные с именем "first" и «второй», но их нет.

Удаление with_items из раздела отладки и простое явное определение переменной или сообщения с помощью first.stdout возвращает значение «undefined».

Версия Ansible - 2.0.2.0 на Centos 7_2.

Заранее спасибо.


person cachonfinga    schedule 20.06.2016    source источник


Ответы (2)


Хорошо, поэтому я нашел сообщение в stackoverflow, которое помогло мне лучше понять, что здесь и как получить доступ к элементам в result.results.

В результате я получил следующий код:

---

- hosts: localhost
  gather_facts: false

  vars:
    numbers:
      - name: "first"
        int: "1"
      - name: "second"
        int: "2"

  tasks:

    - name: Register output
      command: "/bin/echo {{ item.int }}"
      register: echo_out
      with_items: "{{ numbers }}"

    - debug: msg="item.item={{item.item.name}}, item.stdout={{item.stdout}}"
      with_items: "{{ echo_out.results }}"

Что дало мне желаемый результат:

"msg": "item.item=first, item.stdout=1"
"msg": "item.item=second, item.stdout=2"
person cachonfinga    schedule 21.06.2016

Я не уверен, правильно ли я понял вопрос, но, возможно, это может помочь:

    - debug: msg="{{ item.stdout }}"
      with_items: echo_out.results

Обратите внимание, что Ansible распечатает каждый элемент и сообщение, поэтому вам нужно внимательно искать строку, которая выглядит как "msg": "2".

person Amit    schedule 20.06.2016