52833cf481
This saves us some messing around with the dynamic libvirt IP address and writing out the IP address to the Ansible inventory.
110 lines
4.0 KiB
YAML
110 lines
4.0 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.seed_vm_interfaces | map(attribute='net_name') | 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.seed_vm_interfaces |
|
|
map(attribute='net_name') |
|
|
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 }}"
|
|
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.seed_vm_interfaces }}"
|
|
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
|