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.
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"
}