Sometimes we need to audit our VMWare environment and it is nice to have ansible gather this information in seconds into a format that is easy to import. This can take an hours long job down to seconds. I initially had an ansible script that would list all vm’s including powered templates, powered down or paused vms. That was nice, but I only really needed the powered on vms.
This grew from running the ansible script and manually scraping the output for what I needed which still took some time. The second iteration had me run the ansible script and “tee” the output to a file which I would then run a series of 12 sed statements against the file to gather the information I needed. That was great and it took less time, but I wanted to get it down to a one liner.
My third iteration is where I am at today. This is a one liner that isn’t pretty. I was able to join several sed statements into one, but the last 4 sed statements I still had to run separately due to the fact if they were joined to the first, the output wasn’t what I was expecting.
This is what I am using now (I will break it down after):
ansible-playbook VMWARE_list_all_powered-on_vms.yml --ask-vault-pass | sed -e '/"msg"/,$!d; /"msg"/d; / ____________/,$d; s/ {//g; s/ },//g; s/ "guest_name": "//g; s/ "ip_address": "//g; s/"//g' > list.csv && sed -i '1d' list.csv && sed -i '/ }/,$d' list.csv && sed -i 'N;s/\n//' list.csv && sed -i '/^[[:space:]]*$/d' list.csv && cat list.csv
I know the above code is not too appealing to the eye (Feel free to message me if you have any suggestions). The first statement is running the ansible playbook “VMWARE_list_all_powered-on_vms.yml” Since I don’t want to store passwords in plain text, in this example I’m using ansible vault (there are better options out there). I am piping the output of ansible into 5 sed statements. The first sed statement is where I take the ansible output (which contains Ansible cowsay… which makes Ansible output fun) and do the following:
- Strip the first several lines of Ansible output down to the “msg”: [ line
- Remove the msg line
- Remove the trailing Ansible output (PLAY RECAP)
- Remove all lines starting with “{“
- Remove all lines starting with “},”
- Remove everything before and including “guest_name”: “
- Remove everything before and including “ip_address”: “
- remove all quotes and output to list.csv (I’m not finished yet)
Now I start separate sed statements because if I included them into one statement, the format wasn’t what I expected:
- Remove the first line of output
- Remove everything after and including “}”
- Join the VM name and IP address lines together
- Remove all lines with blank spaces
Below is an example of my output (Some vm’s did not include their ip. This has to do with VMware tools not being installed or running on the vm. I will follow that with the actual Ansible playbook):
COUNT DOOKU, 192.168.77.4 COUNT CHOCULA, 192.168.192. COUNT VON COUNT - 123 AHHH HA HA, 192.168.3.192 COUNT DRACULA, 192.168.1.81 GREEDO, 192.168.3.3 POE, 192.168.3.8 TARKIN, 192.168.4.4 GENERAL GRIEVOUS, 192.168.3.7 GROGU - ITS BABY YODA FOOL, 192.168.3.159 DEATH STAR, 192.168.144.14 DEATH STAR 2, 192.168.192.15 BB-8, 192.168.1.199 JABBA, 192.168.192.86 FINN, 192.168.144.3. MANDO, TRAWN, 192.168.3.8 KIRK, 192.168.3.3 SPOCK, 192.168.3.176 DATA, 192.168.1.86 WORF, 192.168.5.7 PICARD, 192.168.1.178 RIKER, 192.168.19.84 McCOY, 192.168.9.81 La FORGE, SCOTTY, 192.168.3.55 ARCHER, 192.168.19.99 RON BURGANDY, 192.168.144.3 SULU, PIKE, 192.168.1.78 T'POL, 192.168.192.24 T-PAIN -LOL, 192.168.1.192 ENTERPRISE, 192.168.1.194 INTREPID, 192.168.3.49 USS VIRGINIA CGN-38, 192.168.8.38 USS LaSALLE AGF-3, 192.168.8.3 MISS PIGGY, KERMIT THE FROG, 192.168.1.174 GONZO, 192.168.192.5 FOZZIE, 192.168.7.21 ANIMAL, 192.168.3.92 BEAKER, 192.168.192.26 ROWLF, 192.168.3.80 SCOOTER, 192.168.3.36 SAM EAGLE, 192.168.192.1 DR BUNSEN HONEYDEW, STALER, 192.168.1.155 WALDORF, 192.168.3.58 SWEDISH CHEF - BORK BORK BORK, 192.168.1.3 PIGS IN SPACE, 192.168.1.48 RIZZO THE RAT, 192.168.144.16 FRANK RIZZO - LOL, OSCAR, 192.168.4.9 BIG BIRD, 192.168.3.30 BERT, 192.168.5.45 ERNIE, 192.168.1.118 GROVER, 192.168.3.55 SNAKE EYES, COBRA COMANDER, 192.168.3.3. STORM SHADOW, 192.168.3.36 LADY JAYE, 192.168.3.5 BARONESS, 192.168.3.8 DUKE, 192.168.1.177 DESTRO, 192.168.3.1 SCARLETT, 192.25.160.1 FLINT, 192.168.3.17 HAWK, 192.168.192.1 BIG CHUCK, LITTLE JOHN, 192.168.144.13 COOL GHOUL, 192.168.3.6 ZARTAN, 192.168.192.7 MEGATRON, 192.168.14.3 STARSCREAM, 192.168.1.185 ICE CREAM, 192.168.33.3 ME GRIMLOCK, 192.168.5.101 JAZ, 192.168.3.54 OPTIMUS PRIME, 192.168.3.53 IRONHIDE, 192.168.1.116 SOUNDWAVE - THE BEST, 192.168.1.136 KUP, 192.168.192.8 SLUDGE, 192.168.1.184 LASERBEAK, 192.168.192.14 BUMBLEBEE, 192.168.144.3 GRAPPLE, 192.168.3.1 SMOKESCREEN, 192.168.3.45 RUMBLE, 192.168.14.7 RAVAGE, 192.168.5.99 MAGNUM PI, 192.168.3.30 A-TEAM, 192.168.144.17 MR T - I PITTY THE FOOL, 192.168.6.3. TRAP - ITS A TRAP, 192.168.1.135 MACGYVER, THE DUKES OF HAZZARD, 192.168.1.136 BOSS HOG, TOUR OF DUTY, 192.168.3.56 VOLTRON, 192.168.1.19 TIMMY, 192.168.1.15 JIMMY, 192.168.3.4 MR-HANKEY, 192.168.3.5 CARTMAN, 192.168.5.44 KENNY, 192.168.3.3 STAN, 192.168.19.168 KYLE, 192.168.5.60 TOLKIEN, CHEF, 192.168.3.99 LIAN-CARTMAN, 192.168.1.3 THE-SCARY-MONSTER, 192.168.1.100 BEBE, 192.168.1.156 SHARON-MARSH, 192.168.1.101 TOWELIE, LINDA-STOTCH, 192.168.192.3 GARY, 192.168.1.3 MR GARRISON, 192.168.12.3 BONO, 192.168.1.16 WENDY TESTABURGER, 192.168.192.8 ANAKIN, 192.168.3.37 DARTH VADER, 192.168.1.115 LUKE, 192.168.3.38 OBI-WAN, 192.168.1.49 HAN SOLO, 192.168.35.22 SHEEV, 192.168.3.33 LEA, 192.168.1.117 YODA, 192.168.192.168 CHEWBACA, 192.168.5.41 BOBA FETT, 192.168.192.11 JENGO-FETT, 192.168.3.58 R2-D2, 192.168.144.11 C-3PO, 192.168.22.45 STORM TROOPER, 192.168.4.3 SNOW TROOPER, 192.168.69.101 CLONE TROOPER, SUPER TROOPERS - LOL, 192.168.99.100 REY, 192.168.192.4 LANDO, PADME, 192.168.88.88 KYLO REN, 192.168.1.194 MACE WINDU - LIVES, 192.168.192.5 QUI-GON JIN, GIN AND JUICE, 192.168.1.189 ADMIRAL ACKBAR, DARTH MAUL, 192.168.3.41 AHSOKA TANO, 192.168.77.78
Here is the actual Ansible Playbook “VMWARE_list_all_powered-on_vms.yml”
---
- hosts: localhost
vars:
vcenter_hostname: vcenter.domain.local
vcenter_user: ansibleuser@DOMAIN.LOCAL
vcenter_pass: !vault |
$ANSIBLE_VAULT;1.1;AES256
esxhost: 192.168.1.101
name: "{{ vm_name }}"
notes: Ansible Test
dumpfacts: False
tasks:
- name: Gather all VMs information
vmware_vm_info:
hostname: '{{ vcenter_hostname }}'
username: '{{ vcenter_user }}'
password: '{{ vcenter_pass }}'
validate_certs: no
register: all_vm_info
delegate_to: localhost
- name: Gather a list of all powered on VMs
set_fact:
on_vm: "{{ all_vm_info.virtual_machines | json_query(query) }}"
vars:
query: "[?power_state=='poweredOn']"
register: jsoncontent
- name: Gather a list of all powered on VM names
debug: msg="{{ on_vm | json_query(jmesquery) }}"
vars:
jmesquery: "[*].{guest_name: guest_name, ip_address: ip_address}"