Chapter 3. Overcloud Images The Red Hat OpenStack Platform director provides images for the Overcloud. The QCOW image in this collection contains a base set of software components that integrate together to form various Overcloud roles, such as Compute, Controller, and storage nodes. In some situations, you might aim to modify certain aspects of the Overcloud image to suit your needs, such installing additional components to nodes. This document describes a series of actions to use the virt-customize tool to modify an existing Overcloud image to augment an existing Controller node. For example, you can use these procedures to install additional ml2 plugins, Cinder backends, or monitoring agents not shipped with the initial image. Important If you modify the Overcloud image to include third-party software and report an issue, Red Hat may request you reproduce the issue using an unmodified image in accordance with our general third-party support policy: https://access.redhat.com/articles/1067 . 3.1. Obtaining the Overcloud Images The director requires several disk images for provisioning Overcloud nodes. This includes: A introspection kernel and ramdisk - Used for bare metal system introspection over PXE boot. A deployment kernel and ramdisk - Used for system provisioning and deployment. An Overcloud kernel, ramdisk, and full image - A base Overcloud system that is written to the node's hard disk. Obtain these images from the rhosp-director-images and rhosp-director-images-ipa packages: Extract the archives to the images directory on the stack user's home ( /home/stack/images ): 3.2. Initrd: Modifying the Initial Ramdisks Some situations might require you to modify the initial ramdisk. For example, you might require a certain driver available when you boot the nodes during the introspection or provisioning processes. The following procedure shows how to modify an initial ramdisk. In the context of the Overcloud, this includes either: The introspection ramdisk - ironic-python-agent.initramfs The provisioning ramdisk - overcloud-full.initrd This procedure adds an additional RPM package to the ironic-python-agent.initramfs ramdisk as an example. Log in as the root user and create a temporary directory for the ramdisk Use the skipcpio and `cpio commands to extract the ramdisk to the temporary directory: Install an RPM package to the extracted contents: Recreate the new ramdisk: Verify the new package now exists in the ramdisk: 3.3. QCOW: Installing virt-customize to the director The libguestfs-tools package contains the virt-customize tool. Install the libguestfs-tools from the rhel-8-for-x86_64-appstream-eus-rpms repository: Important If you install the libguestfs-tools package on the undercloud, disable iscsid.socket to avoid port conflicts with the tripleo_iscsid service on the undercloud: 3.4. QCOW: Inspecting the Overcloud Image Before you can review the contents of the overcloud-full.qcow2 image, you must create a virtual machine that uses this image. To create a virtual machine instance that uses the overcloud-full.qcow2 image, enter the guestmount command: You can review the contents of the QCOW2 image in ~/overcloud-full . Alternatively, you can use virt-manager to create a virtual machine with the following boot options: Kernel path: /overcloud-full.vmlinuz initrd path: /overcloud-full.initrd Kernel arguments: root=/dev/sda 3.5. QCOW: Setting the Root Password Set the password for the root user on image: This provides administration-level access for your nodes through the console. 3.6. QCOW: Registering the Image Register your image temporarily to enable Red Hat repositories relevant to your customizations: Make sure to replace the [username] and [password] with your Red Hat customer account details. This runs the following command on the image: This registers your Overcloud image to the Red Hat Content Delivery Network: 3.7. QCOW: Attaching a Subscription and Enabling Red Hat Repositories Find a list of pool ID from your account's subscriptions: Choose a subscription pool ID and attach it to the image: Make sure to replace the [subscription-pool] with your chosen subscription pool ID. This runs the following command on the image: This adds the pool to the image, which allows you to enable Red Hat repositories with the following command: 3.8. QCOW: Copying a Custom Repository File Adding third-party software to the image requires additional repositories. For example, the following is an example repo file that contains configuration to use the OpenDaylight repository content: Copy the repository file on to the image: The --copy-in option copies the repository file to /etc/yum.repos.d/ on the Overcloud image. Important: Red Hat does not offer support for software from non-certified vendors. Check with your Red Hat support representative that the software you aim to install is supported. 3.9. QCOW: Installing RPMs Use the virt-customize command to install packages to the image: The --install option allows you to specify a package to install. 3.10. QCOW: Cleaning the Subscription Pool After installing the necessary packages to customize the image, we now remove our subscriptions and unregister the image: This removes all subscription pools from the image. 3.11. QCOW: Unregistering the Image Unregister the image. This is so the Overcloud deployment process can deploy the image to your nodes and register each of them individually. 3.12. QCOW: Reset the Machine ID Reset the machine ID for the image. This ensures machines using this image do not use duplicate machine IDs. 3.13. Uploading the Images to the Director After modifying the image, upload it to the director. Make sure to source the stackrc file so that you can access the director from the command line: This uploads the following images into the director: bm-deploy-kernel , bm-deploy-ramdisk , overcloud-full , overcloud-full-initrd , and overcloud-full-vmlinuz . These are the images for deployment and the Overcloud. The script also installs the introspection images on the director's PXE server. View a list of the images in the CLI using the following command: This list will not show the introspection PXE images (agent.*). The director copies these files to /httpboot.

Commands:
sudo dnf install rhosp-director-images rhosp-director-images-ipa
cd ~/images for i in /usr/share/rhosp-director-images/overcloud-full-latest-16.0.tar /usr/share/rhosp-director-images/ironic-python-agent-latest-16.0.tar; do tar -xvf USDi; done
mkdir ~/ipa-tmp cd ~/ipa-tmp
/usr/lib/dracut/skipcpio ~/images/ironic-python-agent.initramfs | zcat | cpio -ivd | pax -r
rpm2cpio ~/RPMs/python-proliantutils-2.1.7-1.el7ost.noarch.rpm | pax -r
find . 2>/dev/null | cpio --quiet -c -o | gzip -8 > /home/stack/images/ironic-python-agent.initramfs chown stack: /home/stack/images/ironic-python-agent.initramfs
lsinitrd /home/stack/images/ironic-python-agent.initramfs | grep proliant
sudo dnf install libguestfs-tools
sudo systemctl disable --now iscsid.socket
mkdir ~/overcloud-full guestmount -a overcloud-full.qcow2 -i --ro ~/overcloud-full
virt-customize --selinux-relabel -a overcloud-full.qcow2 --root-password password:test [ 0.0] Examining the guest [ 18.0] Setting a random seed [ 18.0] Setting passwords [ 19.0] Finishing off
virt-customize --selinux-relabel -a overcloud-full.qcow2 --run-command 'subscription-manager register --username=[username] --password=[password]' [ 0.0] Examining the guest [ 10.0] Setting a random seed [ 10.0] Running: subscription-manager register --username=[username] --password=[password] [ 24.0] Finishing off
subscription-manager register --username=[username] --password=[password]
sudo subscription-manager list
virt-customize --selinux-relabel -a overcloud-full.qcow2 --run-command 'subscription-manager attach --pool [subscription-pool]' [ 0.0] Examining the guest [ 12.0] Setting a random seed [ 12.0] Running: subscription-manager attach --pool [subscription-pool] [ 52.0] Finishing off
subscription-manager attach --pool [subscription-pool]
subscription-manager repos --enable=[repo-id]
cat opendaylight.repo [opendaylight] name=OpenDaylight Repository baseurl=https://nexus.opendaylight.org/content/repositories/opendaylight-yum-epel-8-x86_64/ gpgcheck=0
virt-customize --selinux-relabel -a overcloud-full.qcow2 --upload opendaylight.repo:/etc/yum.repos.d/ [ 0.0] Examining the guest [ 12.0] Setting a random seed [ 12.0] Copying: opendaylight.repo to /etc/yum.repos.d/ [ 13.0] Finishing off
virt-customize --selinux-relabel -a overcloud-full.qcow2 --install opendaylight [ 0.0] Examining the guest [ 11.0] Setting a random seed [ 11.0] Installing packages: opendaylight [ 91.0] Finishing off
virt-customize --selinux-relabel -a overcloud-full.qcow2 --run-command 'subscription-manager remove --all' [ 0.0] Examining the guest [ 12.0] Setting a random seed [ 12.0] Running: subscription-manager remove --all [ 18.0] Finishing off
virt-customize --selinux-relabel -a overcloud-full.qcow2 --run-command 'subscription-manager unregister' [ 0.0] Examining the guest [ 11.0] Setting a random seed [ 11.0] Running: subscription-manager unregister [ 17.0] Finishing off
virt-sysprep --operation machine-id -a overcloud-full.qcow2
source stackrc openstack overcloud image upload --image-path /home/stack/images/
openstack image list +--------------------------------------+------------------------+ | ID | Name | +--------------------------------------+------------------------+ | 765a46af-4417-4592-91e5-a300ead3faf6 | bm-deploy-ramdisk | | 09b40e3d-0382-4925-a356-3a4b4f36b514 | bm-deploy-kernel | | ef793cd0-e65c-456a-a675-63cd57610bd5 | overcloud-full | | 9a51a6cb-4670-40de-b64b-b70f4dd44152 | overcloud-full-initrd | | 4f7e33f4-d617-47c1-b36f-cbe90f132e5d | overcloud-full-vmlinuz | +--------------------------------------+------------------------+
[stack@host1 ~]USD ls /httpboot -l total 151636 -rw-r--r--. 1 ironic ironic 269 Sep 19 02:43 boot.ipxe -rw-r--r--. 1 root root 252 Sep 10 15:35 inspector.ipxe -rwxr-xr-x. 1 root root 5027584 Sep 10 16:32 agent.kernel -rw-r--r--. 1 root root 150230861 Sep 10 16:32 agent.ramdisk drwxr-xr-x. 2 ironic ironic 4096 Sep 19 02:45 pxelinux.cfg