Skip to content

Instantly share code, notes, and snippets.

@mikeifomin
Created October 8, 2016 10:20
Show Gist options
  • Star 12 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mikeifomin/67e233cd461331de16707ef59a07e372 to your computer and use it in GitHub Desktop.
Save mikeifomin/67e233cd461331de16707ef59a07e372 to your computer and use it in GitHub Desktop.
Ansible wait_for http
- name: wait_for http
command: "curl --silent {{ url }}"
register: result
until: result.stdout.find("200 OK") != -1
retries: 60
delay: 1
changed_when: false
@realjktu
Copy link

As far is this gist is on top of Google search now :) the best solution is to use uri ansible module like below.

  • name: "wait for ABC to come up"
    uri:
    url: "http://127.0.0.1:8080/ABC"
    status_code: 200
    register: result
    until: result.status == 200
    retries: 60
    delay: 1

@vlakas
Copy link

vlakas commented Jun 15, 2018

@realjiktu nice workaround. But... version with curl is more reliable. uri depends on httplib2 python library which must be installed on remote host.

failed: [boomslang] => {"failed": true}
msg: httplib2 is not installed

FATAL: all hosts have already failed -- aborting

@geerlingguy
Copy link

The above comment, formatted a little more nicely:

- name: "wait for ABC to come up"
  uri:
    url: "http://127.0.0.1:8080/ABC"
    status_code: 200
  register: result
  until: result.status == 200
  retries: 60
  delay: 1

This will try the URL every second for up to 60 seconds before failing.

@j-chimienti
Copy link

- name: "wait for {{url}} to come up"
  uri:
    url: "{{url}}"
    method: GET
    status: 200
  register: _result
  until: _result.status == 200
  retries: 30 # retry X times  
  delay: 60 # pause for X sec b/w each call

max calls = retries + 1


TASK [URL CALL : wait for https://xxx to come up] ***
FAILED - RETRYING: wait for https://xxx to come up (30 retries left).
FAILED - RETRYING: wait for https://xxx to come up (29 retries left).
FAILED - RETRYING: wait for https://xxx to come up (28 retries left).

@xr09
Copy link

xr09 commented Oct 8, 2019

@realjiktu nice workaround. But... version with curl is more reliable. uri depends on httplib2 python library which must be installed on remote host.

https://docs.ansible.com/ansible/latest/modules/uri_module.html#notes

The dependency on httplib2 was removed in Ansible 2.1

@RickS-C137
Copy link

The uri module doesn't work for me. I'm deploying a mucroservice on our Kubernetes cluster and have to make additional calls, after the service is reachable. The issue with the uri module is, the dns entry is created when the microservice is deployed. It take up to 2-3 minutes until it is created. The uri module failes, if the dns entry hasn't been created when it's executed. So I'll try the curl/command module thing mentioned above. Does anybody has another idea for this?

@trilom
Copy link

trilom commented Jul 5, 2020

Here is a variation of the above that works. Since this constantly returns a 200 it checks content instead. Similar to the above examples you can add status_code: [200, 403] if the health check returns a 200 or a 403 as passing and check that in the until portion.

- name: wait for consul to come up
  uri:
    url: "http://127.0.0.1:8500/v1/status/leader"
    method: GET
    headers:
      Authorization: Bearer {{ consul_acl_master_token }}
    return_content: yes
  register: _result
  until: _result.content != '\"\"'
  retries: 30 # retry X times
  delay: 3 # pause for X sec b/w each call

@mmarkgraf-tpgroup
Copy link

The dependency on httplib2 was removed in Ansible 2.1

And it can be run as a local action on the ansible-host, instead of the target host.
(Unless your network setup forbids ansible to reach the target url)

- name: Wait for frontend at {{ somewhere }} to come up
  local_action:
    module: uri
    url: "{{ somewhere }}"
    status_code: 200
  register: result
[...]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment