c16597aa2d
Adds the kayobe-seed-vm-centos8 CI job to configure the Zuul VM as a seed hypervisor, and use nested virt to provision a seed VM. This ensures that the seed hypervisor code paths are tested. The job uses a Cirros image for the seed VM rather than the usual CentOS cloud image. This is to reduce bandwidth required to download the image. It does mean that the resulting seed VM cannot be used as a seed, but nested virt would make this slow and unreliable anyway. Cirros does not load cdrom drivers by default, so we add the configdrive as a disk rather than a cdrom device. Depends-On: https://review.opendev.org/617161 Change-Id: I2268a1ddf9a2870c713f32a40689e1686365aabd Story: 2001655 Task: 6683
114 lines
4.1 KiB
YAML
114 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_device: cdrom
|
|
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: "{{ seed_vm_configdrive_device }}"
|
|
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
|