How to create snapshots with Ansible (VMware)

Okay, so lots of folks ask me about this, and there are a number of ways you can do this.

But if you’re using vmware and redhat satellite for central patch management for your redhat environment.

Then depending on how you patch your systems. If you snapshot every group prior to patching. Then this post will be perfect for you.

Patching Processes:

1.Snapshot every vm in your group using ansible
      2.   Update your host content-views in satellite and clear yum caches –
            – (these are not in this post) part 2
3.Patch all your servers using ansible – (these are not in this post) part 3
4..Reboot all your servers (these are not in this post) part 4
5..Test to ensure they all came back up (these not in this post for now) part 5

Note: There is a step to change the content view of all your hosts and cleaning your yum repos on all the hosts. I have not written a post on this step yet, but you should obviously automate that. I will eventually get around to including it, when I have some time.

Pre-requisites: Assumed.

 Ansible 2.9 installed and configured with python3
 VMware Community modules configured
 VMware group variables previously defined for VMware deployments(Is helpful)
 VMware user/password configure with being able to create snaphots in either datacenters you have

.

Step by Step:

1.Create a roles directory inside /etc/ansible/roles
a.mkdir -p /etc/ansible/roles/create-snapshot/tasks

b.mkdir -p /etc/ansible/roles/create-snapshot/defaults

 

2.Now you want to create a task for the snapshots.

 

c.Inside /etc/ansible/roles/create-snapshot/tasks/

d.Create a file called main.yml

 

3.Add the following code and save the file

 

– name: Login into vCenter and get cookies

  delegate_to: localhost

  uri:

url: https://{{ vcenter_host }}/rest/com/vmware/cis/session

    force_basic_auth: yes

    validate_certs: no

method: POST

user: ‘{{ vcenter_username }}’

password: ‘{{ vcenter_password }}’

register: login

 

Note: Okay so what we want to do is find the virtual machine in vsphere by name and then grab its folder value and pass it as a variable so you don’t need to define it statically in your host_var. The main reason is, say you deployed a vm and months later moved it to another folder, your code will likely have the origin folder which would be annoying, and the ansible documentation doesn’t really cover this approach, you basically figure it out as you do it. So im going to save you all time. Here is how you do it. The below will gather vm_facts based on the inventory_hostname

– name: Find Guest’s Folder using name

  vmware_guest_find:

hostname: “{{ vcenter_host }}”

username: “{{ vcenter_username }}”

password: “{{ vcenter_password }}”

     validate_certs: no

name: “{{ inventory_hostname }}”

  delegate_to: localhost

  ignore_errors: true

register: vm_facts

 

Note: It will than gather those facts and find the folder value. You then register the facts to a variable “vm_facts” Now it will spit out what it finds when you do –vvvv when you do your play. From there you can see the folder setting. You now want to set that that folder setting as its own variable that you can pass to another task as indicated below.

.

ok: [ansible-server] => {

“changed”: false,

    “folders”: [

“/SysUnix/Teststuff

],

“invocation”: {

module_args“: {

datacenter“: null,

“hostname”: “vmware.nicktailor.com“,

“name”: “ ansible-server“,

“password”: “VALUE_SPECIFIED_IN_NO_LOG_PARAMETER”,

“port”: 443,

proxy_host“: null,

proxy_port“: null,

use_instance_uuid“: false,

“username”: “admin“,

uuid“: null,

validate_certs“: false

}

}

}

 

– name: “vm_folder – setting folder value”

  set_fact:

    folder : “{{ vm_facts.folders }}”

 

Note: So you can see that the facts has a sub fact called “folders”. We want to pass that by setting that value as its own variable by making it a fact. Ansible way to set variables is setting facts. So we make that value above into a variable “vm_facts.folders” and then pass that into the next task where it asks for folders. This will get around the having to provide the exact folder the vm_resides to create snapshotting for an array of hosts.

– name: Create Snapshot

  vmware_guest_snapshot:

hostname: “{{ vcenter_host }}”

username: “{{ vcenter_username }}”

password: “{{ vcenter_password }}”

     datacenter: “{{ vcenter_dc }}”

     validate_certs: no

name: “{{ inventory_hostname }}”

state: present

     snapshot_name: “Ansible Managed Snapshot”

     folder: “‘{{ vm_facts.folders }}'”

description: “This snapshot is created by Ansible Playbook”

  delegate_to: localhost

.

4.Save the file

.

5.You can either have group_vars set up for individual datacenters, but for now just define the variables under /etc/ansible/roles/create-snapshot/defaults

.

Note: You will likely have a group_var from you vmdeploy role that you can use for here.

.

e.Create a file called main.yml and the following variables

vcenter_username: admin

vcenter_password: should be vault encrypted variable

vcenter_host: vmware.nicktailor.com

vcenter_dc: London

.

.

f.Save the file

.

 Note: Ensure your host “nicktest1” is listed in your inventory host file.
/etc/ansible/inventory/TEST/hosts

Run your playbook: from /etc/ansible

.

1.ansible-playbook –i inventory/TEST/hosts justcreatevmsnap.yml –ask-vault-pass –limit=’nicktest1

.

Playbook log:

.

[root@ansibleserver]# ansible-playbook –i inventory/TEST/hosts justcreatevmsnap.yml –ask-vault-pass –limit=’nicktest1

Vault password:

.

PLAY [all] **********************************************************************************************************************************

.

TASK [create_snapshot : Login into vCenter and get cookies] *********************************************************************************

ok: [nicktest1]

.

TASK [create_snapshot : Find Guest’s Folder using name] *************************************************************************************

ok: [nicktest1]

.

TASK [create_snapshot : vm_folder – setting folder value] ***********************************************************************************

ok: [nicktest1]

.

TASK [create_snapshot : Create Snapshot] ****************************************************************************************************

ok: [nicktest1]

.

PLAY RECAP **********************************************************************************************************************************

nicktest1            : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

 

2.Go log into vsphere and check to see the vm has a snapshot name “ansible created snapshot” if it does it worked.

.

Note: This uses the snapshot name to create. If another snapshot exists with a different name it will ignore it entirely. If you pass snapshot variable with another name and run the book again, it will create another snapshot. The same applies to removing snapshots, it will remove based on the name. We will cover that in my post to remove snapshots.

 

Leave a Reply

Your email address will not be published. Required fields are marked *