Skip to content

Instantly share code, notes, and snippets.

@sky-joker
Last active January 27, 2021 10:32
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sky-joker/4c23becb33791f3829baacc1b44b3975 to your computer and use it in GitHub Desktop.
Save sky-joker/4c23becb33791f3829baacc1b44b3975 to your computer and use it in GitHub Desktop.
Prepare CI environment for VMware infrastructure Playbook
---
- name: Prepare CI environment for VMware infrastructure
hosts: localhost
gather_facts: no
vars:
# common params
vcenter_hostname: vcenter server
vcenter_username: administrator@vsphere.local
vcenter_password: password
datacenter: datacenter name
cluster: cluster name
folder: folder
# ESXi params
esxi_template: esxi template name
esxi_snapshot: esxi snapshot name
esxi_guest_user: root
esxi_guest_password: password
datastore:
name: datastore1
vmfs_device_name: "mpx.vmhba0:C0:T0:L0"
esxi_hosts:
- name: esxi-test01
networks:
- name: VM Network
vmk: vmk0
ip: 192.168.1.40
netmask: 255.255.255.0
gateway: 192.168.1.254
- name: VM Network
- name: VM Network
- name: esxi-test02
networks:
- name: VM Network
vmk: vmk0
ip: 192.168.1.41
netmask: 255.255.255.0
gateway: 192.168.1.254
- name: VM Network
- name: VM Network
# VCSA params
vcenter_template: vcenter template name
vcenter_name: test vcenter name
vcenter_snapshot: vcenter snapshot name
vcenter_guest_user: root
vcenter_guest_password: vcenter guest password
networks:
before_ip: 192.168.1.252 # template management ip
before_gateway: 192.168.1.254 # template default gateway
after_ip: 192.168.1.200
after_gateway: 192.168.1.254
# If change the hostname for VCSA, remove below comment out and change to the proper value
# The hostname is required name resolution from DNS
# If can't name resolution, set IP address
#after_vcenter_hostname: 192.168.1.200
#unique_id: 50
# Test params
# Datacenter name to create on VCSA
test_datacenter_name: DC
tasks:
- name: force delete esxi from vCenter
vmware_guest:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
datacenter: "{{ datacenter }}"
cluster: "{{ cluster }}"
folder: "{{ folder }}"
name: "{{ item.name }}"
force: yes
state: absent
loop: "{{ esxi_hosts }}"
- name: force delete VCSA from vCenter
vmware_guest:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
datacenter: "{{ datacenter }}"
cluster: "{{ cluster }}"
folder: "{{ folder }}"
name: "{{ vcenter_name }}"
force: yes
state: absent
- name: clone vm from a template
vmware_guest:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
datacenter: "{{ datacenter }}"
cluster: "{{ cluster }}"
folder: "{{ folder }}"
template: "{{ esxi_template }}"
name: "{{ item.name }}"
linked_clone: yes
snapshot_src: "{{ esxi_snapshot }}"
hardware:
nested_virt: yes
networks: "{{ network_data }}"
state: poweredon
vars:
network_data: >-
{{ item.networks | map('dict2items')
| map('selectattr', 'key', 'equalto', 'name')
| map('list')
| list
| map('items2dict')
| list
}}
loop: "{{ esxi_hosts }}"
- name: wait until started vmware tools for ESXi
vmware_guest_tools_wait:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
folder: "{{ folder }}"
name: "{{ item.name }}"
loop: "{{ esxi_hosts }}"
- name: set management ip for ESXi(static)
vmware_vm_shell:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
datacenter: "{{ datacenter }}"
cluster: "{{ cluster }}"
folder: "{{ folder }}"
vm_id: "{{ item.0.name }}"
vm_username: "{{ esxi_guest_user }}"
vm_password: "{{ esxi_guest_password }}"
vm_shell: /bin/esxcli
vm_shell_args: "network ip interface ipv4 set -i {{ item.1.vmk }} -I {{ item.1.ip }} -N {{ item.1.netmask }} -t static -g {{ item.1.gateway }}"
wait_for_process: yes
with_subelements:
- "{{ esxi_hosts }}"
- networks
when:
- "'ip' in item.1"
- "'netmask' in item.1"
- "'gateway' in item.1"
- "'vmk' in item.1"
- name: set default gateway for ESXi(static)
vmware_vm_shell:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
datacenter: "{{ datacenter }}"
cluster: "{{ cluster }}"
folder: "{{ folder }}"
vm_id: "{{ item.0.name }}"
vm_username: "{{ esxi_guest_user }}"
vm_password: "{{ esxi_guest_password }}"
vm_shell: /bin/esxcli
vm_shell_args: "network ip route ipv4 add --gateway {{ item.1.gateway }} --network 0.0.0.0"
wait_for_process: yes
with_subelements:
- "{{ esxi_hosts }}"
- networks
when:
- "'ip' in item.1"
- "'netmask' in item.1"
- "'gateway' in item.1"
- "'vmk' in item.1"
- name: remove datastore(purpose is to change UUID for datastore)
vmware_host_datastore:
hostname: "{{ item.1.ip }}"
username: "{{ esxi_guest_user }}"
password: "{{ esxi_guest_password }}"
validate_certs: no
datastore_name: "{{ datastore.name }}"
state: absent
with_subelements:
- "{{ esxi_hosts }}"
- networks
when:
- "'ip' in item.1"
- "'vmk' in item.1"
- name: add datastore(purpose is to change UUID for datastore)
vmware_host_datastore:
hostname: "{{ item.1.ip }}"
username: "{{ esxi_guest_user }}"
password: "{{ esxi_guest_password }}"
validate_certs: no
datastore_name: "{{ datastore.name }}"
datastore_type: vmfs
vmfs_device_name: "{{ datastore.vmfs_device_name }}"
state: present
with_subelements:
- "{{ esxi_hosts }}"
- networks
when:
- "'ip' in item.1"
- "'vmk' in item.1"
- name: clone vm from a template
vmware_guest:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
datacenter: "{{ datacenter }}"
cluster: "{{ cluster }}"
folder: "{{ folder }}"
template: "{{ vcenter_template }}"
name: "{{ vcenter_name }}"
linked_clone: yes
snapshot_src: "{{ vcenter_snapshot }}"
state: poweredon
- name: wait until started vmware tools for VCSA
vmware_guest_tools_wait:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
folder: "{{ folder }}"
name: "{{ vcenter_name }}"
- name: wait until succeeded command
vmware_vm_shell:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
datacenter: "{{ datacenter }}"
cluster: "{{ cluster }}"
folder: "{{ folder }}"
vm_id: "{{ vcenter_name }}"
vm_username: "{{ vcenter_guest_user }}"
vm_password: "{{ vcenter_guest_password }}"
vm_shell: /bin/ls
wait_for_process: yes
register: command_result
until: command_result.exit_code == 0
retries: 60
delay: 30
- name: change management ip for VCSA
vmware_vm_shell:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
datacenter: "{{ datacenter }}"
cluster: "{{ cluster }}"
folder: "{{ folder }}"
vm_id: "{{ vcenter_name }}"
vm_username: "{{ vcenter_guest_user }}"
vm_password: "{{ vcenter_guest_password }}"
vm_shell: /bin/sed
vm_shell_args: "-i 's/{{ networks.before_ip }}/{{ networks.after_ip }}/' /etc/systemd/network/10-eth0.network"
wait_for_process: yes
- name: change default gateway for VCSA
vmware_vm_shell:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
datacenter: "{{ datacenter }}"
cluster: "{{ cluster }}"
folder: "{{ folder }}"
vm_id: "{{ vcenter_name }}"
vm_username: "{{ vcenter_guest_user }}"
vm_password: "{{ vcenter_guest_password }}"
vm_shell: /bin/sed
vm_shell_args: "-i 's/{{ networks.before_gateway }}/{{ networks.after_gateway }}/' /etc/systemd/network/10-eth0.network"
wait_for_process: yes
- name: reboot VCSA
vmware_guest:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
datacenter: "{{ datacenter }}"
cluster: "{{ cluster }}"
folder: "{{ folder }}"
name: "{{ vcenter_name }}"
state: rebootguest
- name: wait until connected success to mob URL
uri:
url: "https://{{ networks.after_ip }}/mob"
validate_certs: no
user: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
force_basic_auth: yes
status_code: 200
register: url_status_result
until: url_status_result.status == 200
retries: 60
delay: 30
- name: get VCSA extenstions(purpose is to check vcsa started successfully)
vcenter_extension_info:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
register: vcenter_extension_result
until: vcenter_extension_result.extension_info | length >= 1
retries: 60
delay: 30
- when: after_vcenter_hostname is defined
block:
- name: change hostname for VCSA
vmware_vcenter_settings:
hostname: "{{ networks.after_ip }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
runtime_settings:
unique_id: "{{ unique_id }}"
managed_address: "{{ networks.after_ip }}"
vcenter_server_name: "{{ after_vcenter_hostname }}"
mail:
server: ""
sender: ""
- name: change hostname for VCSA guest
vmware_vm_shell:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
datacenter: "{{ datacenter }}"
cluster: "{{ cluster }}"
folder: "{{ folder }}"
vm_id: "{{ vcenter_name }}"
vm_username: "{{ vcenter_guest_user }}"
vm_password: "{{ vcenter_guest_password }}"
vm_shell: /usr/bin/hostnamectl
vm_shell_args: "set-hostname {{ after_vcenter_hostname }}"
wait_for_process: yes
- name: reboot VCSA
vmware_guest:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
datacenter: "{{ datacenter }}"
cluster: "{{ cluster }}"
folder: "{{ folder }}"
name: "{{ vcenter_name }}"
state: rebootguest
- name: wait until connected success to mob URL
uri:
url: "https://{{ networks.after_ip }}/mob"
validate_certs: no
user: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
force_basic_auth: yes
status_code: 200
register: url_status_result
until: url_status_result.status == 200
retries: 60
delay: 30
- name: get VCSA extenstions(purpose is to check vcsa started successfully)
vcenter_extension_info:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
register: vcenter_extension_result
until: vcenter_extension_result.extension_info | length >= 1
retries: 60
delay: 30
- name: create datacenter
vmware_datacenter:
hostname: "{{ networks.after_ip }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
datacenter_name: "{{ test_datacenter_name }}"
state: present
- name: add esxi host to VCSA
vmware_host:
hostname: "{{ networks.after_ip }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
datacenter: "{{ test_datacenter_name }}"
folder: "/{{ datacenter }}/host"
esxi_hostname: "{{ item.1.ip }}"
esxi_username: "{{ esxi_guest_user }}"
esxi_password: "{{ esxi_guest_password }}"
state: present
with_subelements:
- "{{ esxi_hosts }}"
- networks
when:
- "'ip' in item.1"
- "'vmk' in item.1"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment