Jesse Pretorius c72cc198c4 MNAIO: Compress the disk image when saving it
When we save the VM disks, we now use compression to prepare
the base disk so that it reduces the base disk file sizes to
a much smaller base. For the infra hosts this reduces the file
from ~23GB to ~8GB. Once this is done, we then also create a
copy-on-write image in the original disk's place so that the
VM can be booted up to verify functionality or continue work
without having to re-run the 'deploy-vms' playbook.

Change-Id: If95b71d8625b4d5b2a036cec13952e4fd73cecd4
2018-08-24 14:07:38 +01:00

112 lines
4.3 KiB
YAML

---
# Copyright 2018, Rackspace US, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in witing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
- name: Save VM disk images for re-use
hosts: vm_hosts
gather_facts: "{{ gather_facts | default(true) }}"
environment: "{{ deployment_environment_variables | default({}) }}"
tags:
- save-vms
tasks:
- name: Gather variables for each operating system
include_vars: "{{ item }}"
with_first_found:
- "{{ playbook_dir }}/vars/{{ ansible_distribution | lower }}-{{ ansible_distribution_version | lower }}.yml"
- "{{ playbook_dir }}/vars/{{ ansible_distribution | lower }}-{{ ansible_distribution_major_version | lower }}.yml"
- "{{ playbook_dir }}/vars/{{ ansible_os_family | lower }}-{{ ansible_distribution_major_version | lower }}.yml"
- "{{ playbook_dir }}/vars/{{ ansible_distribution | lower }}.yml"
- "{{ playbook_dir }}/vars/{{ ansible_os_family | lower }}.yml"
tags:
- always
- name: Get info about the virt storage pools
virt_pool:
command: info
register: _virt_pools
tags:
- always
- name: Stop running VMs
virt:
name: "{{ hostvars[item]['server_hostname'] }}"
state: shutdown
when:
- hostvars[item]['server_vm'] | default(false) | bool
with_items: "{{ groups['pxe_servers'] }}"
- name: Commit, compress and save VM Disk Image and prepare new copy-on-write image
shell: |
if [[ -e {{ hostvars[item]['server_hostname'] }}.img ]]; then
if [[ -e {{ hostvars[item]['server_hostname'] }}-base.img ]]; then
qemu-img commit {{ hostvars[item]['server_hostname'] }}.img
else
qemu-img convert -O qcow2 -c {{ hostvars[item]['server_hostname'] }}.img {{ hostvars[item]['server_hostname'] }}-base.img
qemu-img create -f qcow2 -b {{ hostvars[item]['server_hostname'] }}-base.img {{ hostvars[item]['server_hostname'] }}.img
fi
exit 2
fi
args:
executable: /bin/bash
chdir: "{{ _virt_pools.pools.default.path | default('/data/images') }}"
when:
- hostvars[item]['server_vm'] | default(false) | bool
with_items: "{{ groups['pxe_servers'] }}"
register: _save_disk_image
changed_when: _save_disk_image.rc == 2
failed_when: _save_disk_image.rc not in [0, 2]
- name: Save VM definition
copy:
src: "/etc/libvirt/qemu/{{ hostvars[item]['server_hostname'] }}.xml"
dest: "{{ _virt_pools.pools.default.path | default('/data/images') }}/"
remote_src: yes
when:
- hostvars[item]['server_vm'] | default(false) | bool
with_items: "{{ groups['pxe_servers'] }}"
- name: Get the current SHA1 for the manifest
command: "git rev-parse HEAD"
args:
chdir: "{{ playbook_dir }}"
register: _repo_sha
changed_when: false
- name: Add pip freeze results to the data
shell: "pip --disable-pip-version-check freeze > pip-requirements.txt"
args:
executable: /bin/bash
chdir: "{{ _virt_pools.pools.default.path | default('/data/images') }}"
changed_when: false
- name: Find all the files for the manifest
find:
paths: "{{ _virt_pools.pools.default.path | default('/data/images') }}"
patterns:
- "*-base.img"
- "*.xml"
- "*.txt"
get_checksum: yes
register: _manifest_files
- name: Prepare the manifest file content
set_fact:
_manifest_content: >-
{ 'openstack-ansible-ops_SHA1': '{{ _repo_sha.stdout }}', 'files': {{ _manifest_files.files | json_query('[*].{path: path, checksum: checksum}') | sort(attribute='path') }} }
- name: Write out the manifest file
copy:
content: "{{ _manifest_content | to_nice_json }}"
dest: "{{ _virt_pools.pools.default.path | default('/data/images') }}/manifest.json"