MNAIO: Extend image saving to include manifest

In order to more successfully reproduce an environment using
saved images, we include the VM XML definition files and the
output from 'pip freeze'. We capture the list of files, their
checksums and the SHA for the git repo into a json manifest
file.

Change-Id: Ia0bf74d509b4acb10b0dd832a4cfe1bb2afb2503
This commit is contained in:
Jesse Pretorius 2018-08-15 19:25:12 +01:00
parent 6aadbb5ee9
commit 993bac94f5
2 changed files with 74 additions and 6 deletions

View File

@ -83,7 +83,7 @@
- default_vm_disk_mode == "lvm"
with_items: "{{ groups['pxe_servers'] }}"
- name: Setup file-based disk images
- name: Setup/clean-up file-based disk images
when:
- default_vm_disk_mode == "file"
block:
@ -99,6 +99,14 @@
when:
- vm_use_snapshot is not defined
- name: Clean up base image files if they are not being used
file:
path: "{{ item.path }}"
state: absent
with_items: "{{ _base_images.files }}"
when:
- not (vm_use_snapshot | bool)
- name: Create VM Disk Image
command: >-
qemu-img create
@ -123,7 +131,12 @@
virt:
name: "{{ hostvars[item]['server_hostname'] }}"
command: define
xml: "{{ lookup('template', 'kvm/kvm-vm.xml.j2') }}"
xml: >-
{%- if vm_use_snapshot | bool %}
{{ lookup('file', _virt_pools.pools.default.path | default('/data') ~ '/' ~ hostvars[item]['server_hostname'] ~ '.xml') }}
{%- else %}
{{ lookup('template', 'kvm/kvm-vm.xml.j2') }}
{%- endif %}
failed_when: false
when:
- hostvars[item]['server_vm'] | default(false) | bool

View File

@ -35,6 +35,8 @@
virt_pool:
command: info
register: _virt_pools
tags:
- always
- name: Stop running VMs
virt:
@ -45,10 +47,63 @@
with_items: "{{ groups['pxe_servers'] }}"
- name: Save VM Disk Image
command: >-
mv
{{ _virt_pools.pools.default.path | default('/data') }}/{{ hostvars[item]['server_hostname'] }}.img
{{ _virt_pools.pools.default.path | default('/data') }}/{{ hostvars[item]['server_hostname'] }}-base.img
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
mv {{ hostvars[item]['server_hostname'] }}.img {{ hostvars[item]['server_hostname'] }}-base.img
fi
exit 2
fi
args:
executable: /bin/bash
chdir: "{{ _virt_pools.pools.default.path | default('/data') }}"
when:
- hostvars[item]['server_vm'] | default(false) | bool
with_items: "{{ groups['pxe_servers'] }}"
register: _save_disk_image
changed_when: _save_disk_image.rc == 2
- name: Save VM definition
copy:
src: "/etc/libvirt/qemu/{{ hostvars[item]['server_hostname'] }}.xml"
dest: "{{ _virt_pools.pools.default.path | default('/data') }}/"
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') }}"
changed_when: false
- name: Find all the files for the manifest
find:
paths: "{{ _virt_pools.pools.default.path | default('/data') }}"
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') }}/manifest.json"