【问题标题】:ansible from_json filter - unable to use {{ inventory_hostname }}ansible from_json 过滤器 - 无法使用 {{ inventory_hostname }}
【发布时间】:2019-05-15 02:41:12
【问题描述】:

我正在使用 Ansible 2.6,我一直在尝试将 json 对象作为 --extra-vars 从 python API 传递。虽然我能够成功发送 json 对象,但是在解析字典时我无法在过滤器中使用{{ inventory_hostname }}

下面的剧本配置非常适合这个 json 对象:

Python API 部分:

    extra_vars = {"example_list":[{"name":"first","foo":"bar","item":"thud"},{"name":"second","foo":"grunt","item":"baz"}]}
    extra_vars_json = json.dumps(extra_vars)
    self.variable_manager.extra_vars = {'json_var' : extra_vars_json} 

executor = PlaybookExecutor(
                        playbooks=[self.playbook], inventory=self.inventory, variable_manager=self.variable_manager, loader=self.loader, options=self.options, passwords={})

剧本配置:

- name: Get the json string
  set_fact:
    xyz: "{{({{ json_var }} | from_json).example_list | map(attribute='foo') | list }}"
- debug:
    msg: "{{inventory_hostname}}"

现在,如果 example_list 是主机名怎么办。在这种情况下,我将如何使用 {{ inventory_hostname }} 。我试过这个:

xyz: "{{({{ json_var }} | from_json).{{inventory_hostname}} | map(attribute='foo') | list }}"

但它不起作用并抛出异常:

致命:[主机名]:失败! => {"msg": "模板化字符串时出现模板错误:预期的名称或数字。字符串:{{ (json_var | from_json).(inventory_hostname }}"}`**

【问题讨论】:

    标签: ansible


    【解决方案1】:

    经测试可与您的示例一起使用:

    xyz: "{{ ( json_var | from_json )[inventory_hostname] | map( attribute='foo' ) | list }}"
    

    顺便说一句,you can pass raw JSON Ansible 额外参数,因此您可以简化您的剧本并避免在任务中显式解码的需要,假设您的调用应用程序可以修改为支持。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      相关资源
      最近更新 更多