Last active
January 27, 2021 10:32
-
-
Save sky-joker/4c23becb33791f3829baacc1b44b3975 to your computer and use it in GitHub Desktop.
Prepare CI environment for VMware infrastructure Playbook
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- | |
- name: Prepare CI environment for VMware infrastructure | |
hosts: localhost | |
gather_facts: no | |
vars: | |
# common params | |
vcenter_hostname: vcenter server | |
vcenter_username: [email protected] | |
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