ansible from_json过滤器-无法使用{{ventory_hostname}}

时间:2018-12-13 20:08:16

标签: ansible

我正在使用Ansible 2.6,并且一直试图通过python API将json对象作为--extra-vars传递。尽管我能够成功发送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={})

Playbook配置:

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

现在,如果exam​​ple_list是主机名该怎么办。在这种情况下,我将如何使用{{库存主机名}}。我尝试过:

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

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

  

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

1 个答案:

答案 0 :(得分:0)

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

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

顺便说一句,you can pass raw JSON是Ansible extra-args,因此,假设可以修改调用的应用程序以支持它,则可以简化剧本并避免在任务中进行显式解码。