Давайте представим сценарий, в котором вы развертываете новую версию приложения и хотите проверить, было ли оно успешно развернуто.

Для этого вы можете проверить статус ответа на запрос на главную страницу, добавив в свой плейбук задачу, подобную этой:

- name: Wait for the app to become healthy
  uri:
    url: "https://example.com"
    method: GET
    status_code: 200
    return_content: no
  register: result
  until: result.status == 200
  retries: 60
  delay: 10

Это достаточно хорошо, но не очень тщательно. Потому что, например, если вы выполняете развертывание в Amazon ECS, новая версия становится активной через некоторое время, а до этого старая версия все еще работает.

Решением может быть конечная точка версии:

GET https://example.com/version

Который может вернуть что-то вроде этого:

{
  "version": "1.0.0",
  "status": "up"
}

Тогда задача, проверяющая работоспособность приложения, может выглядеть так:

- name: Wait for the app to become healthy
  uri:
    url: "https://example.com/version"
    body_format: json
  register: result
  until: result.json.version == app_version
  retries: 60
  delay: 10

где app_version — переменная.

Однако это создает ошибку при развертывании приложения с конечной точкой версии в первый раз, потому что старое приложение, которое все еще работает, не имеет конечной точки версии. Чтобы учесть такой случай, вы можете добавить несколько условий для оператора do-until:

- name: Wait for the app to become healthy
  uri:
    url: "https://example.com/version"
    body_format: json
  register: result
  until:
    - result.status == 200
    - result.json.version == app_version
  retries: 60
  delay: 10

Поделитесь, если вы найдете это полезным.