Here we will see how to create an ansible format inventory using a bash script. As we know it’s very important to make sure that your inventory file should be up-to-date and should be in a specific format so it’s easier to run multiple playbooks using the same Inventory file.

Let’s say you have a playbook to stop services on web servers and there is another playbook that starts MySQL service on database servers. However, you don’t want to create a separate inventory file for each playbook because it’s difficult to maintain. So what you will do is create an ansible format inventory file as below.
[app] app.server.com app2.server.com [web] web1.server.com web2.server.com [databases] db1.server.com db2.server.com
As shown above, all the servers are separated into different categories. So you can mention in the playbook the name of the server category where the actions need to be performed. In this way, you can use the same inventory file for many playbooks
hosts : app
However, it’s difficult to create an ansible formatted list, especially when you have exported a list from somewhere in the .csv format. In most cases, your list would look like as below.
If you try to manually update this list especially when the list is long, then it would take years. However, you can use the below bash script that will convert the list into an ansible format.
How to convert the list into an ansible format using Bash?
Script Usage.
Create a file named raw_inventory.txt
and put all the servers. As shown below.
app.server.com app2.server.com web1.server.com web2.server.com
Create another file called script.sh
and copy the below script. Make sure that raw_inventory.txt
and script.sh
are in the same directory.
# Script to format list of servers into ansible format. file=raw_inventory.txt last='' while read nameX do label="${nameX%%[.0-9]*}" if [[ "$label" != "$last" ]] then echo "[$label]" # or printf "\n$label\n" for a separator line last="$label" fi echo "$nameX" done < $file > Inventory
As you would do for any bash script, make sure you assign execute permission.
$ chmod +x script.sh
And now finally run it.
$ ./script.sh
In the same directory, you will see there is a file generated called Inventory
which contains the formatted list same as below.
[app] app.server.com app2.server.com [web] web1.server.com web2.server.com
Also, look at How to pass extra variables to the Ansible playbook which will be helpful when you are trying to make your scripts more dynamic.