ansibl inventory : create temporary inventory with multiple groups with add_host or group_by

631 views Asked by At

I have an assignment to provision {{ create new hosts }} according to a given invonteroy file, example

[SET1]
1.1.1.1 new_ip=1.1.1.1

[SET2]
1.1.1.2 new_ip=1.1.1.2

[SET3]
1.1.1.3 new_ip=1.1.1.3 

Here is the problem. The inventory file contains set of ip addresses that do not exists yet. What I want to do

- connect to vsphere host(5.5)
- create new machines based on amount of hosts in the inventory
- change the machines ip address to match the one in the given inventory 

modules like

vmware_shell
vmware_guest 

requires administrative permissions which I don't have. The only way to hack around this issue is to try and create an in memory or temporary inventory during provisioning task. Here is my role:

- vsphere_guest:
    vcenter_hostname: {{ vcenter }}
    validate_certs: no
    username: "{{ vsphere.username }}"
    password: "{{ vsphere.password }}"
    guest: "{{ item }}"
    from_template: yes
    template_src: Centos_base
    resource_pool: "/Resources"
    esxi:
      datacenter: Remote
      hostname: {{ esx_host }}
  with_items:
      - "{{ play_hosts }}"

- name: wait for power on to finish
  pause: seconds=5

- name: get facts from vm
  vsphere_guest:
    validate_certs: False
    vcenter_hostname: {{ vcenter }} 
    username:  "{{ vsphere.username }}"
    password:  "{{ vsphere.password }}"
    guest: "{{ item  }}"
    vmware_guest_facts: yes
  with_items:
      - "{{ play_hosts }}"
  register: vm_facts
  until: vm_facts.ansible_facts.hw_eth0.ipaddresses[0] is defined
  retries: 10
  delay: 10

- name: grab new ipaddresses
  set_fact: myIp="{{ inventory_hostname }}"

- name: Add production VMs to inventory
  add_host: hostname={{item.ansible_facts.hw_eth0.ipaddresses[0] }} groups=temp
            new_ip={{ myIp }}
  with_items: "{{ vm_facts.results }}"
  ignore_errors: yes

my question: is there any way to create a temp inventory with multiple groups and mutilple variables that matches the given inventory!?

1

There are 1 answers

0
user7306689 On BEST ANSWER

update I hacked a way around it:

- name: Add production VMs to inventory
  add_host: hostname={{item.ansible_facts.hw_eth0.ipaddresses[0] }} groups=temp
            new_ip="{{ item.ansible_facts.hw_name }}"
  with_items: "{{ vm_facts.results }}"
  ignore_errors: yes

this works since the machine name is equal to {{ play_host }}