来自 Jira API 的 Ansible "until" 响应

Ansible "until" response from Jira API

我正在尝试安排一个 ansible playbook 来重新索引 Jira,我也希望我们的开发人员能够在需要时临时启动此操作,他们可以通过 AWX 来完成,我可以开始重新索引,但希望在重新索引完成时收到通知。

这是我的 CLI 命令和输出:

[root@devjira02 ~]# curl -u admin:admin123! -X GET https://devjira.comapny.com/rest/api/2/reindex/progress
{"progressUrl":"/secure/admin/jira/IndexProgress.jspa?taskId=12720","currentProgress":35,"currentSubTask":"Currently working on: Issue index","type":"BACKGROUND","submittedTime":"2019-04-01T14:23:50.971+0100","startTime":"2019-04-01T14:23:50.973+0100","success":false}

[root@devjira02 ~]# curl -u admin:admin123! -X GET https://devjira.company.com/rest/api/2/reindex/progress
{"progressUrl":"/secure/admin/jira/IndexProgress.jspa?taskId=12720","currentProgress":100,"type":"BACKGROUND","submittedTime":"2019-04-01T14:23:50.971+0100","startTime":"2019-04-01T14:23:50.973+0100","finishTime":"2019-04-01T14:24:33.922+0100","success":true}

我的剧本:

- name: DEV Jira Re-index
  become: true
  become_method: sudo
  become_user: root

  hosts: DEVJIRA02
  gather_facts: yes

  tasks:

    - name: Jira Re-index
      uri:
       url: https://devjira.company.com/rest/api/2/reindex?type=BACKGROUND_PREFERRED
       method: POST
       user: admin
       password: admin123!
       force_basic_auth: yes
       status_code: [201, 202]

    - name: Wait until re-index completes
      uri:
        url: https://devjira.company.com/rest/api/2/reindex/progress
        method: GET
        user: admin
        password: admin123!
        force_basic_auth: yes
        status_code: [201, 202]
        return_content: yes
        body_format: json
      register: result
      until: result.json.success == true
      retries: 180
      delay: 30

我希望第二部分重试直到成功 == true,此时 AWX 可以发送通知电子邮件。 运行 剧本将手动启动重新索引,但即使重新索引已完成,重试也会重试

在用户评论后编辑:

尽管我的以下建议仍然是很好的做法,并且可以防止将来可能出现的一些麻烦,但在这种情况下证明这不是问题。

一开始我没有注意到您请求 url 调用 return 201 或 202 状态,而 jira documentation specifies you will receive a 200

您应该:

  • 更改预期的 return 代码:status: 200
  • 完全放弃状态选项并更改您的条件:until: response.status == 200 and (result.json.success | bool)

原始命题(未修复但仍然是很好的做法)

在 ansible 中针对文字 truefalse 进行测试通常是一个坏主意,因为 ansible/yaml 对您可以使用的值非常宽容(是的,正确的, Y, 1, 234, no, false, 0, ...) 并且因为这些值有时可以解释为纯字符串而不是布尔值(如果有时间,请尝试使用 vars_prompt 来理解问题) .

Ansible 提供了一个过滤器来测试一个值的布尔表示。我不是 100% 确定这会解决您当前的问题,但我会尝试 until: result.json.success | bool