Newbie question on ansible inventory?

Hi there, Im just starting with ansible so I appologise if this is a stupid question.

I have am wanting to try do use ansible to deploy .war web app’s to several QA servers. Each QA server hosts serveral instances of the app’s across multiple instances of tomcat per server (production is 1 per server).

I was wanting to write a play book that would connect to each QA server, copy the war files to each insteance on tomcat in on the server then move onto the next box.

The problem I originally had was I put each app as its own inventory item (with the same host name), I found that this did not work. So I now have just the 4 QA servers in there now.

Is there a good way do declare what app should be on what tomcat under each server in the inventory or should that be in the playbook?

Thank you for reading.

At the moment I have a playbook file that looks like this (though Im sure there is a more eligant way to do this):

  • hosts: QA
    tasks:

  • name: copy war file
    action: copy src=/staging/staging.war dest=/tmp/staging.war

  • hosts: AGGQA
    tasks:

  • name: rename app1 war file
    shell: mv /usr/local/tomcat1/webapps/app1.war /usr/local/tomcat1/webapps/app1.war.{{ ansible_date_time.year }}{{ ansible_date_time.month }}{{ ansible_date_time.day }}
    when: ansible_hostname == “qa01”

  • name: rename app2 war file
    shell: mv /usr/local/tomcat2/webapps/app2.war /usr/local/tomcat2/webapps/app2.war.{{ ansible_date_time.year }}{{ ansible_date_time.month }}{{ ansible_date_time.day }}
    when: ansible_hostname == “qa01”

  • name: rename app3 war file
    shell: mv /usr/local/tomcat1/webapps/app3.war /usr/local/tomcat1/webapps/app3.war.{{ ansible_date_time.year }}{{ ansible_date_time.month }}{{ ansible_date_time.day }}
    when: ansible_hostname == “qa02”

  • name: rename app4 war file
    shell: mv /usr/local/tomcat2/webapps/app4.war /usr/local/tomcat2/webapps/app4.war.{{ ansible_date_time.year }}{{ ansible_date_time.month }}{{ ansible_date_time.day }}
    when: ansible_hostname == “qa02”

  • name: copy new app1 war file
    shell: cp /tmp/staging.war /usr/local/tomcat1/webapps/app1.war
    when: ansible_hostname == “qa01”

  • name: copy new app2 war file
    shell: cp /tmp/staging.war /usr/local/tomcat2/webapps/app2.war
    when: ansible_hostname == “qa01”

  • name: copy new app3 war file
    shell: cp /tmp/staging.war /usr/local/tomcat1/webapps/app3.war
    when: ansible_hostname == “qa02”

  • name: copy new app4 war file
    shell: cp /tmp/staging.war /usr/local/tomcat3/webapps/app4.war
    when: ansible_hostname == “qa02”

  • name: Set permission’s on new app1 war file
    shell: chown tomcat:tomcat /usr/local/tomcat1/webapps/app1.war
    when: ansible_hostname == “qa01”

  • name: Set permission’s on new app2 war file
    shell: chown tomcat:tomcat /usr/local/tomcat2/webapps/app2.war
    when: ansible_hostname == “qa01”

  • name: Set permission’s on new app3 war file
    shell: chown tomcat:tomcat /usr/local/tomcat1/webapps/app3.war
    when: ansible_hostname == “qa02”

  • name: Set permission’s on new app4 war file
    shell: chown tomcat:tomcat /usr/local/tomcat2/webapps/app4.war
    when: ansible_hostname == “qa02”

Hi,

The easiest way imo is to define groups in your inventory. Group the servers that use the same war file togther, and then add a corresponding var file for that group in group_vars. In group vars define a list of the wars on that server.

E.g.: qa01.yml

`
war_files:

  • /something/app1.war
  • /something/app2.war
    `

Then in your playbook you can simply just call:

`
tasks:

  • name: rename war files
    shell: cp /tmp/staging.war /usr/local/tomcat1/webapps/{{ item }}
    with_items: war_files

`

Depending on which server you are on, it will deploy the specific war files defines in your corresponding group vars