我正在使用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}}"
现在,如果example_list是主机名该怎么办。在这种情况下,我将如何使用{{库存主机名}}。我尝试过:
xyz: "{{({{ json_var }} | from_json).{{inventory_hostname}} | map(attribute='foo') | list }}"
但是它不起作用并抛出异常:
致命:[主机名]:失败! => {“ msg”:“在模板化字符串时出现模板错误:预期名称或数字。字符串:{{(json_var | from_json)。(inventory_hostname}}”}`**
答案 0 :(得分:0)
经过测试可与您的示例一起使用:
xyz: "{{ ( json_var | from_json )[inventory_hostname] | map( attribute='foo' ) | list }}"
顺便说一句,you can pass raw JSON是Ansible extra-args,因此,假设可以修改调用的应用程序以支持它,则可以简化剧本并避免在任务中进行显式解码。