1
  • Problem Statement:
    1. Clone VM from template.
    2. Assign an IP address to the VM created.

I am using Ansible to do this work. Following is the script which is cloning the VM from the specified template:

---
- hosts: localhost
  connection: local
  sudo: false
  user: root
  gather_facts: false
  serial: 1

  vars_files:
    - createVmVars.yml

  tasks:
    - name: Deploying VM from template.
      vsphere_guest:
        vcenter_hostname: "{{vcenter_hostname}}"
        username: "{{vcenter_username}}"
        password: "{{vcenter_password}}"
        guest: "{{guest_name}}"
        from_template: yes
        template_src: "{{template_src}}"
        cluster: "{{cluster}}"
        resource_pool: "{{resource_pool}}"
        vm_extra_config:
          folder: "{{folder_name}}"

And i want to extend this script to assign IP Address (and other n/w configurations) to the newly created VM.

Shasha99
  • 1,746
  • 2
  • 16
  • 30

3 Answers3

0

You can specify static IP Address in vm_extra_config

    .
    .
    .
    cluster: "{{cluster}}"
    resource_pool: "{{resource_pool}}"
    vm_extra_config:
      folder: "{{folder_name}}"
      ip_address: "{{my_static_ip}}"
    .
    .

I wasn't able to find other network settings such as netmask and gateway though. There is no such description on either vsphere_guest or pysphere module

Kashif Siddiqui
  • 1,476
  • 14
  • 26
0

After searching a lot, I am now left with the only option to directly write network configuration into appropriate files using python. Following is working fine for me. You can run this script from Ansible using Shell module with required arguments. Change it as per your needs:

import subprocess
import sys
import shutil
import os

class NetworkConfiguration:
        def __init__(self):
                self.ntype=""
                self.hostname=""
                self.domain=""
                self.pdns=""
                self.sdns=""
                self.ip=""
                self.netmask=""
                self.gway=""
                self.files=["/etc/sysconfig/network/ifcfg-eth0",
                                "/etc/sysconfig/network/routes",
                                "/etc/resolv.conf",
                                "/etc/HOSTNAME"
                                ]

        def writeIntoFile(self,filename,s,mode):
                f=open(filename,mode)
                f.write(s)
                f.close()

        def buildString(self,filename):
                ret_str=""
                if filename == self.files[0] :
                        ret_str="DEVICE=eth0"
                        ret_str+="\n"+"STARTMODE=auto"
                        ret_str+="\n"+"BOOTPROTO="
                        if self.ntype=="s":
                                ret_str+="static"
                        else:
                                ret_str+="dhcp"
                        ret_str+="\n"+"USERCONTROL=no"
                        ret_str+="\n"+"ONBOOT=yes"
                        if self.ntype=="s":
                                ret_str+="\n"+"IPADDR="+self.ip
                                ret_str+="\n"+"NETMASK="+self.netmask
                elif filename==self.files[1]:
                        if self.ntype=="s":
                                ret_str="defualt "+self.gway+" - -"
                elif filename==self.files[2]:
                        ret_str="search "+self.domain
                        ret_str+="\n"+"nameserver "+self.pdns
                        if self.sdns!="":
                                ret_str+="\n"+"nameserver "+self.sdns
                elif filename==self.files[3]:
                        ret_str=self.hostname+"."+self.domain

                return ret_str


        def runProcess(self,args):
                p=subprocess.Popen(args,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
                return p.communicate()
#------------------------Class Ends Here---------------------------------------


nCog=NetworkConfiguration()

# Recieving arguments from commmand line.
#sequence is: network_type,hostname,domain,primary_dns,ip,netmask,gateway,secondry_dns
# note : IP, Netmask, gateway are not required in case of DHCP.
try:
        nCog.ntype=sys.argv[1]
        if nCog.ntype=="s" and  len(sys.argv)<8:
                raise Exception("Too few arguments passed for static configuration!!!")
        elif nCog.ntype=="d" and len(sys.argv)<5:
                raise Exception("Too few arguments passed for DHCP configuration!!!")
        elif nCog.ntype!="s" and nCog.ntype!="d":
                raise Exception("Not a valid network type!!!")

        nCog.hostname=sys.argv[2]
        nCog.domain=sys.argv[3]
        nCog.pdns=sys.argv[4]

        if nCog.ntype=="s":
                nCog.ip=sys.argv[5]
                nCog.netmask=sys.argv[6]
                nCog.gway=sys.argv[7]
                if len(sys.argv)==9:
                        nCog.sdns=sys.argv[8]
        elif len(sys.argv)==6:
                nCog.sdns=sys.argv[5]

except Exception, e:
        print(e)

# Writing network configurations into the appropriate files.
for f in nCog.files:
        ret_str=nCog.buildString(f)
        nCog.writeIntoFile(f,ret_str,"w")

# Setting the hostname
o, e=nCog.runProcess(['hostname',nCog.hostname])

# restart the network
o, e=nCog.runProcess(['service','network restart'])
print("restarting the network:\n------------------------------------")
print("output: "+o+"\n error: "+e)

# Adding gateway ip to the routing table in case static ip is assigned.
print os.system("sudo ip route add default via %s" % (nCog.gway))
Shasha99
  • 1,746
  • 2
  • 16
  • 30
0

Not sure how it looked in 2016, but this module now has a networks parameter, that can be used to specify network settings. It will only work during creation/deployment of VMs though, not on already existing VMs. Example:

- name: Deploy VM
  community.vmware.vmware_guest:
    ...
    networks:
      - name: VM Network
        ip: 192.168.1.100
        netmask: 255.255.255.0
        gateway: 192.168.1.1
stackprotector
  • 10,498
  • 4
  • 35
  • 64