我是不熟悉ansible的新人,但是正在尝试进步和学习。
我正在运行许多API调用来配置Web代理工具。
该流程本质上是发出GET请求以查看对象是否存在,如果不存在,则继续执行POST请求以创建对象。非常标准。
此过程会重复多次,因为产品可以具有许多相同类型的配置实例。因此,我想通过关联一个ID使GET / POST例程尽可能通用。
剧本是:
set_fact:
'vh_task_id': 01
- name: check virtual host exists
uri:
method: GET
url: "{{ admin_api_url }}/hosts?vHost={{ public_virtual_host|urlencode() }}"
return_content: yes
headers:
X-XSRF-Header: "Access"
user: "{{ admin_user }}"
password: "{{ admin_password }}"
status_code: 200
validate_certs: no
register: response
- name: set fact virtual host task id response '{{ public_virtual_host }}'
set_fact:
'response_{{ vh_task_id }}': "{{ response }}"
到目前为止,一切正常,并且response_{{ vh_task_id }}
正确包含上述set_fact的响应正文,如果我将其输出,则可以看到。
现在,当我想查询response_{{ vh_task_id }}
中的JSON作为要获取ID值的查询变量时,问题就变得了。
set_fact,正在将文字值设置为response_01
,而不是将串联视为已注册变量。
以下是我尝试执行此操作的示例:
set_fact:
'vh_id': "{{ hostvars[inventory_hostname].response_{{ vh_task_id }} | json_query('json.items[0].id') }}"
非常感谢您的帮助。
尝试一下:
set_fact:
'vh_id': "{{ hostvars[inventory_hostname].hostvar | json_query('json.items[0].id') }}"
vars:
hostvar: response_{{ vh_task_id }}
此外,对于纯字符串作为变量名,您不需要显式引号'
。就像,如果没有其他原因将名称保留在引号中,则可以将'vh_id':
更改为vh_id:
。