Following uop this blog : https://www.archy.net/automating-vm-deployment-in-vmware-vsphere-with-ansible/ Sergio had few questions
This comprehensive guide walks through creating multiple virtual machines with static IP addresses using Ansible, addressing common challenges like network connectivity and customization specifications.

The Challenge
When deploying multiple VMs in enterprise environments, manual configuration becomes time-consuming and error-prone. Common requirements include:
- Consistent VM naming conventions
- Static IP address assignment
- Proper network connectivity
- Standardized hardware specifications
- Automated hostname configuration
Traditional approaches often involve repetitive GUI operations or complex PowerCLI scripts. Ansible offers a more maintainable, version-controlled solution that integrates seamlessly with modern DevOps workflows.
Prerequisites
Before diving into the automation, ensure you have:
- Ansible installed with the
community.vmware
collection - VMware vCenter Server access with appropriate permissions
- A properly prepared VM template with VMware Tools installed
- Network connectivity between your Ansible control node and vCenter
Install the required collection:
ansible-galaxy collection install community.vmware
Basic VM Creation with Static IPs
The foundation of our automation starts with a well-structured playbook that defines all necessary variables and tasks:
---
- name: Create multiple VMs with static IP addresses
hosts: localhost
gather_facts: no
vars:
vcenter_server: "vcenter.example.com"
vcenter_username: "administrator@vsphere.local"
vcenter_password: "Password123!"
datacenter: "DC1"
datastore: "DS1"
network: "VM Network"
resource_pool: "Resources/compute-resource-pool"
template: "centos7-template"
vm_name_prefix: "testvm"
vm_count: 5
# Network configuration
base_ip: "192.168.1"
start_ip: 10
netmask: "255.255.255.0"
gateway: "192.168.1.1"
dns_servers:
- "8.8.8.8"
- "8.8.4.4"
domain: "example.com"
The Power of Dynamic IP Assignment
One of the most elegant aspects of this solution is the dynamic IP assignment using Ansible's templating engine:
ip: "{{ base_ip }}.{{ start_ip + item | int - 1 }}"
This expression automatically assigns sequential IP addresses (192.168.1.10, 192.168.1.11, etc.) based on the loop iteration, ensuring no IP conflicts while maintaining a logical addressing scheme.
Network Interface Configuration
A critical aspect often overlooked is ensuring network interfaces are properly connected. The connected
and start_connected
parameters are essential:
network_interfaces:
- network: "{{ network }}"
type: "vmxnet3" # Better performance than e1000
ip: "{{ base_ip }}.{{ start_ip + item | int - 1 }}"
netmask: "{{ netmask }}"
gateway: "{{ gateway }}"
dns_servers: "{{ dns_servers }}"
connected: true
start_connected: true
The connected: true
parameter ensures the NIC is connected immediately when the VM is running, while start_connected: true
guarantees connectivity on VM startup.
Advanced Customization with Specifications
For production environments, using customization specifications provides better control and reusability:
- name: Create customization specification
vmware_guest_customization_spec:
hostname: "{{ vcenter_server }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
name: "linux-static-{{ item }}"
type: Linux
hostname: "{{ vm_name_prefix }}-{{ item }}"
domain: "{{ domain }}"
dns_servers: "{{ dns_servers }}"
nic_settings:
- nic_number: 1
ip_address: "{{ base_ip }}.{{ start_ip + item | int - 1 }}"
subnet_mask: "{{ netmask }}"
gateway: "{{ gateway }}"
This approach creates temporary customization specifications for each VM, providing granular control over the guest OS configuration process.

Best Practices and Production Considerations
Security
- Store sensitive credentials in Ansible Vault instead of plain text
- Use service accounts with minimal required permissions
- Implement proper SSL certificate validation in production
Error Handling
- Add comprehensive error handling and rollback procedures
- Implement proper logging and monitoring
- Use Ansible's
register
andfailed_when
directives for better control flow
Performance Optimization
- Use
vmxnet3
network adapters for better performance - Consider parallel execution with
async
andpoll
for large deployments - Implement proper resource allocation based on workload requirements
Template Management
- Maintain standardized, regularly updated VM templates
- Ensure VMware Tools is properly installed and configured
- Document template specifications and update procedures
Troubleshooting Common Issues
NIC Not Connected: Always include connected: true
and start_connected: true
parameters in network interface configuration.
Customization Failures: Verify VMware Tools is installed and running on the template. Check that the template is properly generalized.
IP Address Conflicts: Implement proper IP address management (IPAM) integration or validation checks.
Slow Deployment: Use wait_for_customization: true
and wait_for_ip_address: true
to ensure proper completion before proceeding.

Ansible provides a powerful, maintainable approach to VMware automation that scales from small lab environments to enterprise data centers. By combining static IP configuration with proper network connectivity settings, you can create robust, repeatable VM deployment processes that integrate seamlessly with modern DevOps practices.
The key to success lies in proper planning, thorough testing, and adherence to best practices around security, error handling, and documentation. Start with the basic examples provided, then gradually enhance your automation to meet your organization's specific requirements.