首页 > 解决方案 > Ansible 转义点与 map 函数一起用作属性

问题描述

我有一个对象变量的键,我无法在 Ansible 剧本中转义,可能是因为包含点,

这是 的数据结构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"

标签: ansibleescapingyamljinja2

解决方案


原来我通过set_fact首先包裹在 Ansible 中来解决它:

  - 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 }}

不过,转义点的原始问题仍未得到解答。


推荐阅读