614958486d
We currently use a libvirt network with dynamic IP address allocation for the seed VM. After creation of the seed, determine it's IP address and update the inventory to allow access to it.
109 lines
4.1 KiB
YAML
109 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] }}"
|
|
pre_tasks:
|
|
- name: Ensure the image cache directory exists
|
|
file:
|
|
path: "{{ image_cache_path }}"
|
|
state: directory
|
|
|
|
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 }}
|
|
|
|
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 compressed configdrive is removed
|
|
file:
|
|
path: "{{ image_cache_path }}/{{ seed_host | to_uuid }}.gz"
|
|
state: absent
|
|
|
|
- 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
|
|
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: Check the seed VM's IP address
|
|
shell: virsh domifaddr {{ seed_vm_name }} | awk 'NR > 2 { print $4 }'
|
|
register: ifaddr_result
|
|
changed_when: False
|
|
become: True
|
|
until: "{{ ifaddr_result | failed or ifaddr_result.stdout != '' }}"
|
|
retries: 60
|
|
delay: 1
|
|
|
|
# Generate an inventory file for the seed VM. Note that this host will not
|
|
# be accessible to this instance of Ansible - another process should be
|
|
# started.
|
|
- name: Ensure the inventory contains a group variables file for the seed
|
|
local_action:
|
|
module: copy
|
|
content: |
|
|
---
|
|
# Do not edit this file - it is managed by Ansible and changes will be lost.
|
|
# Ansible inventory file for the Kayobe seed VM.
|
|
# This host will provide the Bifrost undercloud.
|
|
ansible_host: "{{ ifaddr_result.stdout_lines[0] | ipaddr('address') }}"
|
|
dest: "{{ kayobe_config_path }}/inventory/group_vars/seed/ansible-host"
|
|
|
|
- name: Wait for SSH access to the seed VM
|
|
local_action:
|
|
module: wait_for
|
|
host: "{{ ifaddr_result.stdout_lines[0] | ipaddr('address') }}"
|
|
port: 22
|
|
state: started
|