Возможные экранирующие точки для использования с функцией карты в качестве атрибутов - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть ключ к объектной переменной, которую я не могу экранировать в Ansible playbook, возможно, из-за содержания точек,

Вот структура данных variable:

"results":[
  {
    //snip//

    "changed": false,
    "hostvars[item].commandResult.stdout": "abc",

    //snip//
  },
  {
    //snip//

    "changed": true,
    "hostvars[item].commandResult.stdout": "xyz",

    //snip//
  }
]

Я не могу извлечь "hostvars[item].commandResult.stdout" внутри него с этой пьесой,

  - debug:
       msg: "{{variable.results | map(attribute='hostvars[item].commandResult.stdout') }}"

Хотя я могу получить другое значение просто отлично,

      - debug:
          msg: "{{variable.results | map(attribute='changed') }}"

Я пытался с помощью \, '.' и {{...}} убежать . (точка), но все равно не повезло. Я подозреваю, что это . из-за этого сообщения об ошибке:

  msg: |-
The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'hostvars[item]'

При запуске ansible-playbook -vvv команда

Как я могу отобразить "hostvars[item].commandResult.stdout"?

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Чтобы адресовать ключ точками, используйте обозначение массива одинарными кавычками вместо обозначения точки, т. Е .:

- debug:
    msg: "{{variable.results | map(attribute=['hostvars[item].commandResult.stdout']) }}"

Возвращает значение.

ср .: Ansible FAQ

0 голосов
/ 02 ноября 2018

Оказалось, я обхожу его, оборачивая внутри Ansible set_fact first:

  - set_fact:
    variable: "{{hostvars[item].commandResult.stdout_lines}}"
    with_items: "{{ groups['servers'] }}"
    register: all_result

  - debug:
        msg: "{{all_result.results |  map(attribute='ansible_facts') | list  | to_nice_json }}

Оригинальный вопрос о том, как избежать точек, остается без ответа.

...