Search code examples
ansibleansible-inventory

How to define group_var for multiple host in same environment


I am writing a Ansible playbook which copy and deploy multiple wars to different servers of same environment.

For example, my preprod environment has 4 different servers and on every release I get 5 war files let's say test1.war, test2.war... test5.war. They should be deployed in this way -

PreProd
   - server1 : test1.war, test2.war
   - server2 : test2.war, test5.war
   - server3 : test3.war, test1.war, test5.war

AND so on.

Now I am using group_vars to define all the variables related to preprod at one place with preprod.yml.

I am trying to understand how my inventory will look like. I am passing the environment as "preprod" from command line and that should copy and deploy the war files as per above.

ansible-playbook -i my_inventory  main.yml --tags=copy,wardeploy -e release_version=<<release_version>> -e target_env=preprod

Solution

  • For example the inventory

    shell> cat hosts
    [preprod]
    server1
    server2
    server3
    

    the group_vars

    shell> cat group_vars/preprod.yml
    preprod_wars:
      server1: [test1.war, test2.war]
      server2: [test2.war, test5.war]
      server3: [test3.war, test1.war, test5.war]
    

    and the playbook

    shell> cat playbook.yml
    - hosts: preprod
      tasks:
        - debug:
            msg: "Deploy {{ item }} on {{ inventory_hostname }}"
          loop: "{{ preprod_wars[inventory_hostname] }}"
    

    gives

    ok: [server2] => (item=test2.war) => {
        "msg": "Deploy test2.war on server2"
    }
    ok: [server2] => (item=test5.war) => {
        "msg": "Deploy test5.war on server2"
    }
    ok: [server1] => (item=test1.war) => {
        "msg": "Deploy test1.war on server1"
    }
    ok: [server1] => (item=test2.war) => {
        "msg": "Deploy test2.war on server1"
    }
    ok: [server3] => (item=test3.war) => {
        "msg": "Deploy test3.war on server3"
    }
    ok: [server3] => (item=test1.war) => {
        "msg": "Deploy test1.war on server3"
    }
    ok: [server3] => (item=test5.war) => {
        "msg": "Deploy test5.war on server3"
    }