Search code examples
ansibleansible-inventory

Ansible - How to build dynamic inventory group from inventory host file


Below is sample inventory host file:

cat inventory.hosts

[dev_flipkart_app]
myhost6 ansible_user=fappuser
myhost9 ansible_user=fappuser
[dev_amazon_app]
myhost1 ansible_user=aappuser
[dev_snapdeal_app]
myhost4 ansible_user=sappuser

Below is my playbook main.yml

---
  - name: Playbook
    hosts: "{{ ENV }}_{{ appname }}_app"
    tasks:
      - name: ensure apache is at the latest version
        yum:
          name: httpd
          state: latest

This works fine when single {{ appname }} is passed, but how to i build a dynamic inventory from inventory.hosts using add_host when multiple {{ appname }} is passed?

ansible-playbook -i inventory.hosts main.yml -e ENV=dev -e appname="flipkart,amazon"

Expected dynamic host group should be as below:

myhost6 ansible_user=fappuser
myhost9 ansible_user=fappuser
myhost1 ansible_user=aappuser

Kindly suggest.


Solution

  • You seem to have noticed that hosts: can be a jinja2 expression, but then stopped short of realizing that hosts: can be a jinja2 expression

    - hosts: "{{ appname | split(',') | map('regex_replace', '(.+)', ENV ~ '_\\1_app') }}"
      tasks:
      - debug: var=ansible_user
    

    when run with your cited example command line ansible-playbook -i inventory.hosts main.yml -e ENV=dev -e appname="flipkart,amazon" produces

    ok: [myhost6] => {
        "ansible_user": "fappuser"
    }
    ok: [myhost9] => {
        "ansible_user": "fappuser"
    }
    ok: [myhost1] => {
        "ansible_user": "aappuser"
    }