
Currently the ordering of network interfaces in the seed VM is non-deterministic. This happens because we apply the 'unique' filter to the network_interfaces list, which does not guarantee a deterministic ordering. This list is then transformed and passed to the stackhpc.libvirt-vm role. There are two consequences of this: * it is not possible to determine which interface names should be used prior to creating a seed VM * if a seed VM is recreated, the interface ordering may change This change fixes the issue by sorting the network_interfaces list alphabetically before it is transformed and passed to the stackhpc.libvirt-vm. A new 'seed_vm_interfaces' variable is also added, which allows for customisation of the VM's interfaces - potentially allowing for more complex setups such as trunked VLANs. Story: 2007259 Task: 38621 There is a second issue, which is that if the seed VM has a network interface not configured with a gateway, cloud-init will fail to configure the network interfaces on the host. This has been observed on CentOS 8, but is probably more tied to the version of cloud-init, and may affect CentOS 7. The following error is seen in the cloud-init logs: KeyError: 'gateway' This change has been addressed in the jriguera.configdrive role, and this change updates the version used in requirements.yml. Story: 2007769 Task: 39993 Change-Id: Ib6ab41a3ba320a1fe15d0d23561fad2fab7861e6
113 lines
4.1 KiB
YAML
113 lines
4.1 KiB
YAML
---
|
|
- name: Ensure that the seed VM configdrive exists
|
|
hosts: seed-hypervisor
|
|
vars:
|
|
seed_host: "{{ groups['seed'][0] }}"
|
|
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
|
|
|
|
# NOTE(priteau): On seed hypervisors running CentOS 8, the configdrive role
|
|
# will fail to install coreutils if coreutils-single is already present.
|
|
# Until the role handles it, install it using the --allowerasing option
|
|
# which will remove coreutils-single.
|
|
- name: Ensure coreutils package is installed
|
|
command: "dnf install coreutils -y --allowerasing"
|
|
become: True
|
|
when:
|
|
- ansible_os_family == 'RedHat'
|
|
|
|
- name: Ensure the image cache directory exists
|
|
file:
|
|
path: "{{ image_cache_path }}"
|
|
state: directory
|
|
owner: "{{ ansible_user_uid }}"
|
|
group: "{{ ansible_user_gid }}"
|
|
become: True
|
|
|
|
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: "{{ hostvars[seed_host].resolv_domain | default }}"
|
|
search: "{{ hostvars[seed_host].resolv_search | default }}"
|
|
dns: "{{ hostvars[seed_host].resolv_nameservers | default([]) }}"
|
|
configdrive_network_device_list: >
|
|
{{ hostvars[seed_host].network_interfaces |
|
|
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 unnecessary files are removed
|
|
file:
|
|
path: "{{ item }}"
|
|
state: absent
|
|
with_items:
|
|
- "{{ 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] }}"
|
|
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: stackhpc.libvirt-vm
|
|
seed_vm_configdrive_volume:
|
|
name: "{{ hostvars[seed_host].seed_vm_name }}-configdrive"
|
|
pool: "{{ hostvars[seed_host].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_image_cache_path: "{{ image_cache_path }}"
|
|
libvirt_vms:
|
|
- name: "{{ hostvars[seed_host].seed_vm_name }}"
|
|
memory_mb: "{{ hostvars[seed_host].seed_vm_memory_mb }}"
|
|
vcpus: "{{ hostvars[seed_host].seed_vm_vcpus }}"
|
|
volumes: "{{ hostvars[seed_host].seed_vm_volumes + [seed_vm_configdrive_volume] }}"
|
|
interfaces: "{{ hostvars[seed_host].seed_vm_interfaces }}"
|
|
console_log_enabled: true
|
|
become: True
|
|
|
|
tasks:
|
|
- name: Wait for SSH access to the seed VM
|
|
local_action:
|
|
module: wait_for
|
|
host: "{{ hostvars[seed_host].ansible_host }}"
|
|
port: 22
|
|
state: started
|
|
# NOTE: Ensure we exceed the 5 minute DHCP timeout of the eth0
|
|
# interface if necessary.
|
|
timeout: 360
|