I created a Python script to generate a temporary inventory file from csv file used in EC2 provisioning. The inventory file can be used in multiple post build playbooks. The file name is static, however it will not be overwritten,if you set concurrent build limit to 1 in CI/CD server.
Some AWS EC2 instances in my company need static hostname The ip field will be changed automatically with the EC2 private IP return right after provisioning and and there is a playbook to create host record in infoblox. the group are Ansible group vars,multipe groups are separated by semicolon and the order is important,vars in last group will take precedence
The csv file
name,ip,group,zone,env awselk1,,elasticsearch;elasticsearch-master,2a,prod awselk2,,elasticsearch;elasticsearch-data,2a,prod
The script
#!/usr/bin/python # Takes a file CSV file "xxx.csv" and outputs xxx.ini for Ansible host inventory data import csv import sys import os if len(sys.argv) <= 1: print "Usage:" +sys.argv[0]+" input-filename" sys.exit(1) net_dn = {'prod':'prod.example.com', 'preprod':'preprod.example.com', 'test':'test.example.com', 'dev':'dev.example.com'} groups = [] envs = set() hosts_ini = {} csvname = sys.argv[1] scriptpath = os.path.dirname(sys.argv[0]) ansible_ini = os.path.join(scriptpath, 'hosts-aws-tmp.ini') lines = [] hosts_text = '' with open(csvname) as csvfile: reader = csv.DictReader(csvfile) for row in reader: domain = net_dn[row['env'].strip()] line = row['name'].strip()+'.'+domain #lines.append(line) envs.add(row['env']) # support multiple groups separated by ; for g in row['group'].strip().split(';'): g = g.strip() if (not g in groups): groups.append(g) hosts_ini.setdefault(g, []).append(line) #groups=set(groups) if ( len(envs) !=1 ): print "ERROR: only single enviroment is supported!" sys.exit(1) env = list(envs)[0] env_text = "["+env+":children]"+"\n"+"\n".join(groups) vars_text = "\n\n["+env+":vars]" vars_text += """ ansible_user=ansible ansible_ssh_private_key_file=~/.ssh/id_rsa ansible_become=true ansible_become_user=root ansible_become_method=sudo ansible_gather_facts=no """ vars_text+="aws_env=aws-"+env+'\n' #generate groups in order as input for g in groups: hosts_text+='\n['+g+']\n' hosts_text+='\n'.join(hosts_ini[g]) hosts_text+='\n' all_text = env_text+vars_text+hosts_text print all_text with open(ansible_ini,'w') as new_ini_file: new_ini_file.write(all_text) print "INFO:Generated Ansible host inventory file: " + ansible_ini
The Ansible inventory file generated
[prod:children] elasticsearch elasticsearch-master elasticsearch-data [prod:vars] ansible_user=ansible ansible_ssh_private_key_file=~/.ssh/id_rsa ansible_become=true ansible_become_user=root ansible_become_method=sudo ansible_gather_facts=no aws_env=aws-prod [elasticsearch] awselk1.prod.example.com awselk2.prod.example.com [elasticsearch-master] awselk1.prod.example.com [elasticsearch-data] awselk2.prod.example.com