Files
kayobe/ansible/seed-vm.yml
Mark Goddard a82047f14f Improve automation of seed VM network configuration
The list of libvirt networks is now generated from the seed's network interfaces.
This can be overridden if necessary.
2017-08-07 12:08:41 +00:00

113 lines
4.1 KiB
YAML

---
- name: Ensure that the seed VM configdrive exists
hosts: seed-hypervisor
vars:
seed_host: "{{ groups['seed'][0] }}"
seed_hostvars: "{{ hostvars[seed_host] }}"
seed_user_data_path: "{{ image_cache_path }}/seed-vm-user-data"
pre_tasks:
- name: Verify the seed host exists in the Ansible inventory
fail:
msg: >
There should be exactly one host in the seed group. There are
currently {{ groups['seed'] | length }}.
when: "{{ groups['seed'] | length != 1 }}"
- name: Ensure the image cache directory exists
file:
path: "{{ image_cache_path }}"
state: directory
# The user data script is used to bring up the network interfaces that will
# be configured by metadata in the configdrive. It could be used for other
# things in future if necessary.
- name: Ensure the user data file exists
copy:
content: |
#!/bin/bash
{% for interface in seed_hostvars.network_interfaces | map('net_interface', seed_host) %}
ifup {{ interface }}
{% endfor %}
dest: "{{ seed_user_data_path }}"
roles:
- role: jriguera.configdrive
# For now assume the VM OS family is the same as the hypervisor's.
configdrive_os_family: "{{ ansible_os_family }}"
configdrive_uuid: "{{ seed_host | to_uuid }}"
configdrive_fqdn: "{{ seed_host }}"
configdrive_name: "{{ seed_host }}"
configdrive_ssh_public_key: "{{ lookup('file', ssh_public_key_path) }}"
configdrive_config_dir: "{{ image_cache_path }}"
configdrive_volume_path: "{{ image_cache_path }}"
configdrive_config_dir_delete: True
configdrive_resolv:
domain: "{{ seed_hostvars.resolv_domain | default }}"
search: "{{ seed_hostvars.resolv_search | default }}"
dns: "{{ seed_hostvars.resolv_nameservers | default([]) }}"
configdrive_network_device_list: >
{{ seed_hostvars.network_interfaces |
map('net_configdrive_network_device', seed_host) |
list }}
configdrive_config_user_data_path: "{{ seed_user_data_path }}"
tasks:
- name: Set a fact containing the configdrive image path
set_fact:
seed_vm_configdrive_path: "{{ image_cache_path }}/{{ seed_host }}.iso"
- name: Ensure configdrive is decoded and decompressed
shell: >
base64 -d {{ image_cache_path }}/{{ seed_host | to_uuid }}.gz
| gunzip
> {{ seed_vm_configdrive_path }}
- name: Ensure unnecessary files are removed
file:
path: "{{ item }}"
state: absent
with_items:
- "{{ seed_user_data_path }}"
- "{{ image_cache_path }}/{{ seed_host | to_uuid }}.gz"
- name: Ensure that the seed VM is provisioned
hosts: seed-hypervisor
vars:
seed_host: "{{ groups['seed'][0] }}"
seed_hostvars: "{{ hostvars[seed_host] }}"
pre_tasks:
- name: Check the size of the configdrive image
stat:
path: "{{ seed_vm_configdrive_path }}"
get_checksum: False
get_md5: False
mime: False
register: stat_result
roles:
- role: libvirt-vm
seed_vm_configdrive_volume:
name: "{{ seed_hostvars.seed_vm_name }}-configdrive"
pool: "{{ seed_hostvars.seed_vm_pool }}"
# Round size up to next multiple of 4096.
capacity: "{{ (stat_result.stat.size + 4095) // 4096 * 4096 }}"
device: "cdrom"
format: "raw"
image: "{{ seed_vm_configdrive_path }}"
libvirt_vm_name: "{{ seed_hostvars.seed_vm_name }}"
libvirt_vm_memory_mb: "{{ seed_hostvars.seed_vm_memory_mb }}"
libvirt_vm_vcpus: "{{ seed_hostvars.seed_vm_vcpus }}"
libvirt_vm_volumes: "{{ seed_hostvars.seed_vm_volumes + [seed_vm_configdrive_volume] }}"
libvirt_vm_interfaces: >
{{ seed_hostvars.network_interfaces | map('net_libvirt_vm_network') | list }}
libvirt_vm_image_cache_path: "{{ image_cache_path }}"
become: True
tasks:
- name: Wait for SSH access to the seed VM
local_action:
module: wait_for
host: "{{ seed_hostvars.ansible_host }}"
port: 22
state: started