【问题标题】:Retry Ansible URI PUT API Call with a POST API Call使用 POST API 调用重试 Ansible URI PUT API 调用
【发布时间】:2021-06-03 09:39:33
【问题描述】:

您好,我正在尝试通过 Ansible URI 模块为我的应用程序中的特定 API 端点运行 PUT API 调用,使用包含 json 文件并定义为的字典:

example: { 'example1' : 'v1', 'example2': 'v2''} 
- name: Update existing
  block:
    - name: update existing 
      uri:
        url: "{{url}}/api/{{item.key}}/"
        method: PUT
        body: "{{ lookup('file', 'example/{{item.key}}/{{item.value}}.json') }}"
        status_code: 200
        body_format: json
        headers:
          Content-Type: "application/json"
          Authorization: "Token {{ token.json.token }}"
      with_dict: "{{ example }}"
      register: result

对于 PUT api 调用,如果 {{item.key}} 不存在,此 api 端点将失败,例如if
"{{url}}/api/{{item.key}}/" 端点不存在,因此会报 4xx 错误。

鉴于任务失败并且当项目的 api 端点不存在时我收到 4xx 错误,我想为同一个 json 文件运行 POST 命令。

  1. 如何在 ansible 中执行此操作,以重试失败但仅针对字典中的 {{item.key}}{{item.value}} 的任务?

  1. 有没有更好的方法来使用 POST 命令重试失败的 PUT

我想使用 ansible URI 模块

谢谢!

【问题讨论】:

  • 首先,您需要通过在预期状态代码中添加 4xx 或在任务中添加 ignore_errors: true 来允许 ansible 继续出错。然后,您可以添加 POST 任务,通过过滤(通过 Jinja 过滤器或 when)在失败的任务(错误状态代码或错误,调试 result 的内容到找到方法)
  • 嗨 zigma- 你能给我一个示例语法吗?我还会使用字典来指向正确的 json 文件吗?我如何从结果中找到失败的 url,例如结果.url?

标签: api ansible uri


【解决方案1】:

您可以忽略错误情况,然后通过过滤循环通过result.results 以仅保留错误。您可以通过item.item 访问原始项目:

    - name: update existing with PUT
      uri:
        url: "{{url}}/api/{{item.key}}/"
        method: PUT
        body: "{{ lookup('file', 'example/{{item.key}}/{{item.value}}.json') }}"
        status_code:
          - 200
          - 404  # supposing it's the "normal" error case
        body_format: json
        headers:
          Content-Type: "application/json"
          Authorization: "Token {{ token.json.token }}"
      loop: "{{ example | items2dict }}"
      register: result

    - name: update existing with POST
      uri:
        url: "{{url}}/api/{{item.item.key}}/"
        method: POSTT
        body: "{{ lookup('file', 'example/{{item.item.key}}/{{item.item.value}}.json') }}"
        status_code: 200
        body_format: json
        headers:
          Content-Type: "application/json"
          Authorization: "Token {{ token.json.token }}"
      loop: "{{ result.results | rejectattr('status', '200') }}"  # filter out 200 status from previous task

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 2018-05-10
    相关资源
    最近更新 更多