Multiple tomcats and wait for app to start

Friends:

Thank you in advance for your time and attention.

I am writing a playbook do the following on 6 tomcat servers.

a. start tomcat
b. wait for the app to come up on http://localhost:8080/tellMyVersion/version.jsp
c. complete the play run after the above steps.

I can start tomcat which is not a problem. I use the service module.

I currently (without ansible) use the following script to test curl -sk -m 600 -w “\n” ‘http://localhost:8080/tellMyVersion/version.jsp

It works fairly well since I am giving 10 min for curl to time out and that url I have put responds in about 7 or 8 mins. (worst case timings)

The output of the curl command is something like (gives out the version of the app installed)

3.9.21

With Ansible I want to be able to do this

On batch tomcat the curl comes back in 4 mins
On webtier tomcat the curl comes back in 6 mins
On backend tomcat the curl takes the longest at 8 mins.

I want to be able to loop thru each of them run the curl command get the output and if no response wait. If I get response I want to go to the next server and check that.

I am not sure how to be in a loop going from one tomcat to another based on the output.

Please help.

-N

Here’s how we wait for some of our tomcat apps to start up:

`

  • name: check every 3 seconds for 40 attempts if tomcat is up and ready to serve the healthcheck page
    uri:
    url: ‘http://{{ inventory_hostname }}/app/healthcheck.jsp’
    return_content: yes
    timeout: 2
    delegate_to: localhost
    register: tomcat_result
    until: tomcat_result[‘status’]|default(0) == 200
    retries: 40
    delay: 3
    `

You would need to experiment with the number of retries. If I recall tomcat locks the port long before it starts responding on it, so its good to check that the app has completed coming up and can actually server some kind of content.

We started out with configured wait periods for each environment but prefer the above as the playbook can proceed as soon as the application is ready to serve requests.

I guess you could have 3 plays in your playbook and in each one check the relevant group of tomcats

`

  • hosts: batch
    tasks:

  • name: check batch tomcats are up
    uri:
    url: ‘http://{{ inventory_hostname }}/app/healthcheck.jsp’
    return_content: yes
    timeout: 2
    delegate_to: localhost
    register: tomcat_result
    until: tomcat_result[‘status’]|default(0) == 200
    retries: 40
    delay: 3

  • hosts: webtier
    tasks:

  • name: check webtier tomcats are up
    uri:
    url: ‘http://{{ inventory_hostname }}/app/healthcheck.jsp’
    return_content: yes
    timeout: 2
    delegate_to: localhost
    register: tomcat_result
    until: tomcat_result[‘status’]|default(0) == 200
    retries: 40
    delay: 3

  • hosts: backend
    tasks:

  • name: check backend tomcats are up

uri:
url: ‘http://{{ inventory_hostname }}/app/healthcheck.jsp’
return_content: yes
timeout: 2
delegate_to: localhost
register: tomcat_result
until: tomcat_result[‘status’]|default(0) == 200
retries: 40
delay: 3
`

Hope this helps,

Jon