loops - Ansible 中的循环任务
问题描述
我在 Ansible 中有以下任务:
- name: Getting Job Info
uri:
url: "https://{{ hostname }}/job/JobService"
method: POST
user: "{{ username }}"
password: "{{ password }}"
body: "{{ lookup( 'template' , 'jobInfo.xml.j2' ) }}"
status_code: 200
validate_certs: false
headers:
soapaction: "getJobInfoVO"
return_content: true
register: job_status_soap
- name: Converting Job Info response to JSON
set_fact:
job_status_json: "{{ job_status_soap.content | xml2json }}"
- name: Setting Job Status
set_fact:
job_status: "{{ job_status_json['soapenv:Envelope']['soapenv:Body']['multiRef'][0]['status']['#text'] }}"
- debug: msg="{{ job_status }}"
如您所见,它进行 Web 服务调用,将 SOAP 响应转换为 JSON,然后提取相关值(整数)并将其设置为事实。我需要重复这段代码,直到前面提到的整数值等于某个整数。
关于我如何处理这项任务的任何想法?
解决方案
如果响应是 JSON 格式,这将很容易使用until
执行 ansible do-until 循环来实现。但这是一个带有 xml 响应的工作示例。
先决条件:(确保您的 ansible 主机上安装了 python 依赖项)
1) 使用自定义xml_to_json过滤器。
2) 使用json_query过滤器
PS 执行后续播放不会触发重试,因为until
已满足条件。如果要测试重试是否有效,请更改until
请求标头中的条件或标记值。
---
- name: Retry url until xml content equals certain value
hosts: 127.0.0.1
connection: local
become_user: root
become: yes
tasks:
- name: Check job status
uri:
url: "https://httpbin.org/anything"
method: GET
timeout: 10
validate_certs: no
headers:
content: "<envelope><body><request><status>2</status></request></body></envelope>"
register: get_search_job_status_response
until: get_search_job_status_response.json.headers.Content|from_xml|json_query('envelope.body.request.status')|int == 2
retries: 2
delay: 2
...
推荐阅读
- python - 设置 jupyter notebook 主题后工具栏不可见
- c# - 如何确定属性列表中的最大值
- javascript - 带有ajax的谷歌地图方向api
- c# - 可以调用 action 方法(来自 action 方法)并让 ASP.Net Core 注入 [FromQuery] 参数吗?
- reactjs - 如何使用 Prismic 和服务器端渲染接收和映射动态 URL
- jquery - 字符串末尾的空格不被视为空格
- java - 处理:弧码只创建圆。如何正确识别开始值和停止值
- unity3d - 如何限制transform.translate在球体内
- jquery-ui - 如何改善取消按钮的行为并使关闭与取消相同?
- model - Yii2:如何将必需的属性添加到复选框列表?