{"id":18209,"date":"2023-10-16T18:53:20","date_gmt":"2023-10-16T15:53:20","guid":{"rendered":"https:\/\/kifarunix.com\/?p=18209"},"modified":"2024-03-10T11:40:09","modified_gmt":"2024-03-10T08:40:09","slug":"deploy-multinode-openstack-using-kolla-ansible","status":"publish","type":"post","link":"https:\/\/kifarunix.com\/deploy-multinode-openstack-using-kolla-ansible\/","title":{"rendered":"Deploy Multinode OpenStack using Kolla-Ansible"},"content":{"rendered":"\n<p>In this guide, you will to learn how to deploy Multinode OpenStack using <a href=\"https:\/\/opendev.org\/openstack\/kolla-ansible\" target=\"_blank\" rel=\"noreferrer noopener\">Kolla-Ansible<\/a>. We will be runing our OpenStack on Ubuntu 22.04 servers.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-style-default td_pull_quote td_pull_center is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Kolla provides Docker containers and Ansible playbooks to meet Kolla\u2019s mission. Kolla\u2019s mission is to provide production-ready containers and deployment tools for operating OpenStack clouds. It allows the operators with minimal experience to deploy Multinode OpenStack quickly and as experience grows modify the OpenStack configuration to suit the operator\u2019s exact requirements.<\/p>\n<\/blockquote>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Table of Contents<\/h2><nav><ul><li><a href=\"#deploying-multi-node-open-stack-using-kolla-ansible\">Deploying Multi-node OpenStack using Kolla-Ansible<\/a><ul><li><a href=\"#deployment-architecture\">Deployment Architecture<\/a><ul><li><a href=\"#controller-node\">Controller Node:<\/a><\/li><li><a href=\"#storage-node\">Storage Node:<\/a><\/li><li><a href=\"#compute-node\">Compute Node:<\/a><\/li><\/ul><\/li><li><a href=\"#system-requirements\">System Requirements<\/a><\/li><li><a href=\"#network-configurations-on-the-nodes\">Network Configurations on the Nodes<\/a><\/li><li><a href=\"#install-required-packages-on-deployment-node\">Install Required Packages on Deployment Node<\/a><\/li><li><a href=\"#create-kolla-ansible-deployment-user-account\">Create Kolla-Ansible Deployment User Account<\/a><\/li><li><a href=\"#create-a-virtual-environment-for-deploying-kolla-ansible\">Create a Virtual Environment for Deploying Kolla-ansible<\/a><\/li><li><a href=\"#install-ansible-on-ubuntu-22-04\">Install Ansible on Ubuntu 22.04<\/a><\/li><li><a href=\"#install-kolla-ansible-on-ubuntu-22-04\">Install Kolla-ansible on Ubuntu 22.04<\/a><\/li><li><a href=\"#configure-kolla-ansible-for-multinode-open-stack-deployment\">Configure Kolla-ansible for Multinode OpenStack Deployment<\/a><ul><li><a href=\"#prepare-kolla-ansible-configuration-files\">Prepare Kolla Ansible Configuration Files<\/a><\/li><li><a href=\"#define-kolla-ansible-global-deployment-options\">Define Kolla-Ansible Global Deployment Options<\/a><\/li><li><a href=\"#configure-multinode-deployment-inventory\">Configure Multinode Deployment Inventory<\/a><\/li><li><a href=\"#generate-kolla-passwords\">Generate Kolla Passwords<\/a><\/li><\/ul><\/li><li><a href=\"#using-kolla-ansible-to-deploy-multinode-open-stack\">Using Kolla-Ansible to Deploy Multinode OpenStack<\/a><ul><li><a href=\"#install-ansible-galaxy-requirements\">Install Ansible Galaxy requirements<\/a><\/li><li><a href=\"#boostrap-open-stack-nodes-with-kolla-deploy-dependencies\">Boostrap OpenStack Nodes with Kolla Deploy Dependencies<\/a><\/li><li><a href=\"#run-pre-deployment-checks-on-the-nodes\">Run pre-deployment checks on the nodes<\/a><\/li><li><a href=\"#use-kolla-ansible-to-deploy-multinode-open-stack\">Use Kolla-Ansible to deploy Multinode OpenStack<\/a><\/li><\/ul><\/li><li><a href=\"#verify-multinode-open-stack-deployment\">Verify Multinode OpenStack Deployment<\/a><ul><li><a href=\"#list-running-open-stack-docker-containers\">List Running OpenStack Docker Containers<\/a><\/li><\/ul><\/li><li><a href=\"#multinode-open-stack-post-deployment-tasks\">Multinode OpenStack Post Deployment Tasks<\/a><ul><li><a href=\"#install-open-stack-command-line-administration-tools\">Install OpenStack command line administration tools<\/a><\/li><li><a href=\"#generate-open-stack-admin-credentials\">Generate OpenStack Admin Credentials<\/a><\/li><li><a href=\"#create-initial-networks-images-flavors-etc-optional\">Create Initial Networks, Images, Flavors etc [OPTIONAL]<\/a><\/li><\/ul><\/li><li><a href=\"#reconfiguring-the-stack\">Reconfiguring the Stack<\/a><\/li><\/ul><\/li><li><a href=\"#accessing-open-stack-web-interface-horizon\">Accessing OpenStack Web Interface (Horizon)<\/a><\/li><li><a href=\"#configure-networks-for-internet-access\">Configure Networks for Internet Access<\/a><\/li><li><a href=\"#further-reading\">Further Reading<\/a><\/li><li><a href=\"#reference\">Reference<\/a><\/li><li><a href=\"#related-tutorials\">Related Tutorials<\/a><\/li><\/ul><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"deploying-multi-node-open-stack-using-kolla-ansible\">Deploying Multi-node OpenStack using Kolla-Ansible<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"deployment-architecture\">Deployment Architecture<\/h3>\n\n\n\n<p>In this tutorial, we will be deploying a three-node Openstack with separate controller, storage and compute nodes. Each node will play a specific role as follows;<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"controller-node\">Controller Node:<\/h4>\n\n\n\n<p>The controller node is the central point of control and coordination in the OpenStack environment. It hosts various services responsible for managing and controlling other components. Some of the key services running on the controller node include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Identity Service (Keystone): Responsible for authentication and authorization of users and services within OpenStack.<\/li>\n\n\n\n<li>Image Service (Glance): Stores and manages virtual machine images used to create instances (VMs).<\/li>\n\n\n\n<li>Dashboard Service (Horizon): Provides a web-based graphical user interface for managing and monitoring the cloud resources.<\/li>\n\n\n\n<li>Networking Service (Neutron): Handles the networking aspects, including the creation and management of virtual networks, routers, and floating IPs.<\/li>\n\n\n\n<li>Compute Service (Nova API): Handles user requests to create, start, stop, and manage instances (VMs).<\/li>\n\n\n\n<li>Orchestration Service (Heat): Allows users to define and manage cloud applications using templates (e.g. YAML files) for automatic deployment.<\/li>\n\n\n\n<li>Placement Service (Placement API): Tracks and manages resource allocations on the compute nodes.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"storage-node\">Storage Node:<\/h4>\n\n\n\n<p>The storage node can configured to provide;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Cinder Volume Service:\n<ul class=\"wp-block-list\">\n<li><em>Block Storage:<\/em> Primary role is to host and manage Cinder volumes, offering block-level storage\/volumes to Nova virtual machines, Ironic bare metal hosts, containers etc. <\/li>\n\n\n\n<li>The default OpenStack Block Storage service implementation is an iSCSI solution that uses&nbsp;Logical Volume Manager (LVM)&nbsp;for Linux.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Glance Image Service:\n<ul class=\"wp-block-list\">\n<li><em>Glance Service:<\/em> Hosts and serves images to compute nodes, facilitating instance launches.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Swift Object Storage Service:\n<ul class=\"wp-block-list\">\n<li><em>Object Storage:<\/em> Can be configured to run the Swift service, providing scalable and redundant object storage.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>In this tutorial, we will just be using our storage node to provide shared storage via NFS shares for glance images and cinder volume for block storage.<\/p>\n\n\n\n<p>Thus, follow the guides below on how to setup NFS shares on Linux;<\/p>\n\n\n\n<p><a href=\"https:\/\/kifarunix.com\/?s=nfs\" target=\"_blank\" rel=\"noreferrer noopener\">How to install and setup NFS server shares on Linux<\/a><\/p>\n\n\n\n<p>On Storage node;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>showmount -e<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>Export list for storage01:\n<strong>\/mnt\/glance <\/strong>*<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"compute-node\">Compute Node:<\/h4>\n\n\n\n<p>The compute node is where the instances (VMs) are actually deployed and run. It is responsible for hosting the Nova Compute service, which interacts with the underlying hypervisor (e.g., KVM, VMware, Hyper-V) to manage the lifecycle of instances. The compute node handles instance creation, termination, and resource management, including CPU, memory, and network resources. Instances can be migrated between compute nodes for load balancing or maintenance purposes.<\/p>\n\n\n\n<p>Please note that this is just one of the many ways of deploying OpenStack. You can plan your own architecture to meet your requirements!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"system-requirements\">System Requirements<\/h3>\n\n\n\n<p>Below are the minimum requirements we have for our OpenStack nodes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>2 (or more) network interfaces.<\/li>\n\n\n\n<li>At least 8gb main memory<\/li>\n\n\n\n<li>At least 40gb disk space<\/li>\n<\/ul>\n\n\n\n<p>Below are our deployment system specifics;<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>Node\/Hostname<\/td><td>Management\/Floating IP<\/td><td>DISK<\/td><td>RAM<\/td><td>CPU<\/td><\/tr><tr><td>controller01<br><strong>Also acts as Kolla-ansible deployment node<\/strong><\/td><td>Mgt: 192.168.200.100\/24<br>Floating: 10.100.0.100\/24<\/td><td>100G<\/td><td>8G<\/td><td>2 cores<\/td><\/tr><tr><td>compute01<\/td><td>Mgt: 192.168.200.120\/24<br>Floating: 10.100.0.110\/24<\/td><td>100G<\/td><td>8G<\/td><td>2 cores<\/td><\/tr><tr><td>strorage01 (<em>provides NFS share for image storage<\/em> <em>and cinder block storage<\/em>)<\/td><td>192.168.200.110\/24<\/td><td>250G<\/td><td>8G<\/td><td>2 cores<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>You can provide as much resources since the more resources you have the better the performance of the stack.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"network-configurations-on-the-nodes\">Network Configurations on the Nodes<\/h3>\n\n\n\n<p>Below are the network configurations on the nodes;<\/p>\n\n\n\n<p>Controller Node;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat \/etc\/netplan\/00-installer-config.yaml<\/code><\/pre>\n\n\n\n<pre class=\"scroll-box\"><code>network:\n  renderer: networkd\n  ethernets:\n    enp1s0:\n      dhcp4: false\n    enp2s0:\n      dhcp4: false\n    vethint: {}\n    vethext: {}\n  bridges:\n    br0:\n      interfaces: [enp1s0]\n      dhcp4: false\n      addresses: [192.168.200.200\/24]\n      routes:\n        - to: 0.0.0.0\/0\n          via: 192.168.200.1\n      nameservers:\n        addresses:\n          - 8.8.8.8\n    br-ex:\n      interfaces: [ enp2s0, vethint ]\n      dhcp4: false\n      addresses: [10.100.0.100\/24]\n  version: 2\n<\/code><\/pre>\n\n\n\n<p>As you can see, we have also created virtual ethernets (veth interfaces) whose configuration is shown below. Veth pairs are commonly used to connect network namespaces, which are isolated network environments within a Linux system.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat \/etc\/systemd\/network\/10-veth.netdev<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;NetDev]\nName=vethint\nKind=veth\n&#91;Peer]\nName=vethext<\/code><\/pre>\n\n\n\n<p>The devices are connected to each other, and are also independent of the bridged interface, br-ex.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The <code class=\"\">[NetDev]<\/code> section defines the first veth device, <code class=\"\">vethint<\/code>. The <code class=\"\">Kind<\/code> parameter specifies that this is a veth device.<\/li>\n\n\n\n<li>The <code class=\"\">[Peer]<\/code> section defines the second veth device, <code class=\"\">vethext<\/code>. This device is automatically paired with the <code class=\"\">vethint<\/code> device.<\/li>\n<\/ul>\n\n\n\n<p>So, once you create the .netdev systemd configuration, restart the systemd-networkd service.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl restart systemd-networkd<\/code><\/pre>\n\n\n\n<p>When this configuration file is loaded by systemd-networkd, it will create the two veth devices and connect them together. Any traffic sent to one device will be received by the other device. This allows network traffic to be passed between the two network namespaces that the veth devices are attached to.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ip a<\/code><\/pre>\n\n\n\n<pre class=\"scroll-box\"><code>1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000\n    link\/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n    inet 127.0.0.1\/8 scope host lo\n       valid_lft forever preferred_lft forever\n    inet6 ::1\/128 scope host \n       valid_lft forever preferred_lft forever\n2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000\n    link\/ether 52:54:00:82:68:e4 brd ff:ff:ff:ff:ff:ff\n3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br-ex state UP group default qlen 1000\n    link\/ether 52:54:00:54:81:bc brd ff:ff:ff:ff:ff:ff\n4: br-ex: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000\n    link\/ether 46:98:06:c2:e7:21 brd ff:ff:ff:ff:ff:ff\n    inet 10.100.0.100\/24 brd 10.100.0.255 scope global br-ex\n       valid_lft forever preferred_lft forever\n    inet6 fe80::4498:6ff:fec2:e721\/64 scope link \n       valid_lft forever preferred_lft forever\n5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000\n    link\/ether aa:1f:79:9b:18:8b brd ff:ff:ff:ff:ff:ff\n    inet 192.168.200.200\/24 brd 192.168.200.255 scope global br0\n       valid_lft forever preferred_lft forever\n    inet6 fe80::a81f:79ff:fe9b:188b\/64 scope link \n       valid_lft forever preferred_lft forever\n6: vethext@vethint: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master ovs-system state UP group default qlen 1000\n    link\/ether 46:1d:4f:ba:dd:7f brd ff:ff:ff:ff:ff:ff\n    inet6 fe80::441d:4fff:feba:dd7f\/64 scope link \n       valid_lft forever preferred_lft forever\n7: vethint@vethext: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-ex state UP group default qlen 1000\n    link\/ether d2:bd:a0:d3:2d:21 brd ff:ff:ff:ff:ff:ff\n<\/code><\/pre>\n\n\n\n<p>Compute Node<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat \/etc\/netplan\/00-installer-config.yaml<\/code><\/pre>\n\n\n\n<pre class=\"scroll-box\"><code>network:\n  renderer: networkd\n  ethernets:\n    enp1s0:\n      dhcp4: false\n      addresses: [192.168.200.202\/24]\n      routes:\n        - to: 0.0.0.0\/0\n          via: 192.168.200.1\n      nameservers:\n        addresses:\n          - 8.8.8.8\n    enp2s0:\n      dhcp4: false\n      addresses: [10.100.0.110\/24]\n  version: 2 \n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>ip a<\/code><\/pre>\n\n\n\n<pre class=\"scroll-box\"><code>1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000\n    link\/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n    inet 127.0.0.1\/8 scope host lo\n       valid_lft forever preferred_lft forever\n    inet6 ::1\/128 scope host \n       valid_lft forever preferred_lft forever\n2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000\n    link\/ether 52:54:00:3a:88:51 brd ff:ff:ff:ff:ff:ff\n    inet 192.168.200.202\/24 brd 192.168.200.255 scope global enp1s0\n       valid_lft forever preferred_lft forever\n    inet6 fe80::5054:ff:fe3a:8851\/64 scope link \n       valid_lft forever preferred_lft forever\n3: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000\n    link\/ether 52:54:00:ea:cc:5d brd ff:ff:ff:ff:ff:ff\n    inet 10.100.0.110\/24 brd 10.100.0.255 scope global enp2s0\n       valid_lft forever preferred_lft forever\n    inet6 fe80::5054:ff:feea:cc5d\/64 scope link \n       valid_lft forever preferred_lft forever\n<\/code><\/pre>\n\n\n\n<p>Storage Node<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat \/etc\/netplan\/00-installer-config.yaml<\/code><\/pre>\n\n\n\n<pre class=\"scroll-box\"><code>network:\n  ethernets:\n    enp1s0:\n      dhcp4: false\n      addresses:\n        - 192.168.200.201\/24\n      routes:\n        - to: default\n          via: 192.168.200.1\n      nameservers:\n        addresses:\n          - 8.8.8.8\n    enp10s0:\n      dhcp4: false\n  version: 2\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>ip a<\/code><\/pre>\n\n\n\n<pre class=\"scroll-box\"><code>1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000\n    link\/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n    inet 127.0.0.1\/8 scope host lo\n       valid_lft forever preferred_lft forever\n    inet6 ::1\/128 scope host \n       valid_lft forever preferred_lft forever\n2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000\n    link\/ether 52:54:00:78:91:f2 brd ff:ff:ff:ff:ff:ff\n    inet 192.168.200.201\/24 brd 192.168.200.255 scope global enp1s0\n       valid_lft forever preferred_lft forever\n    inet6 fe80::5054:ff:fe78:91f2\/64 scope link \n       valid_lft forever preferred_lft forever\n4: enp10s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000\n    link\/ether 52:54:00:e2:9b:b0 brd ff:ff:ff:ff:ff:ff\n    inet6 fe80::5054:ff:fee2:9bb0\/64 scope link \n       valid_lft forever preferred_lft forever\n<\/code><\/pre>\n\n\n\n<p>You can also update your hosts file with respective DNS entries for your nodes on the controller node or the node where you will run Ansible-kolla. DNS entries in other nodes will be taken care by Ansible.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vim \/etc\/hosts<\/code><\/pre>\n\n\n\n<pre class=\"scroll-sz\"><code>\n127.0.0.1 localhost\n192.168.200.200 controller01\n192.168.200.201 compute01\n192.168.200.202 storage01\n<\/code><\/pre>\n\n\n\n<p><strong>NOTE: We are running the installation as non root user with sudo privileges.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"install-required-packages-on-deployment-node\">Install Required Packages on Deployment Node<\/h3>\n\n\n\n<p>Before you can proceed, there are a number of required packages that needs to be installed on the node that  will host Kolla-ansible. We are using controller01 node as the Kolla-Ansible node.<\/p>\n\n\n\n<p>Update and upgrade your system packages<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo apt update<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo apt upgrade<\/pre>\n\n\n\n<p>Reboot, if it is necessary;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;&#91; -f \/var\/run\/reboot-required ]] &amp;&amp; systemctl reboot -i<\/code><\/pre>\n\n\n\n<p>Install the required packages;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo apt install python3-dev python3-venv libffi-dev gcc libssl-dev git<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"create-kolla-ansible-deployment-user-account\">Create Kolla-Ansible Deployment User Account<\/h3>\n\n\n\n<p>We already have Kolla-ansible deployment user account (with <strong>passwordless sudo<\/strong>) created on all the nodes. Sample sudoers file entry for the user;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo cat \/etc\/sudoers.d\/kifarunix<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>kifarunix ALL=NOPASSWD: ALL<\/code><\/pre>\n\n\n\n<p>You also need to generate passwordless SSH keys to be used for logging into the compute and storage nodes from the controller node.<\/p>\n\n\n\n<p>Generate SSH keys on the controller node or the node that runs Kolla-ansible.<\/p>\n\n\n\n<p>Ensure you are generating the keys as the non-root sudoed user used for deployment;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kifarunix@controller01:~$ whoami \n<strong>kifarunix<\/strong><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh-keygen<\/code><\/pre>\n\n\n\n<pre class=\"scroll-box\"><code>\nGenerating public\/private rsa key pair.\nEnter file in which to save the key (\/home\/kifarunix\/.ssh\/id_rsa): <strong>ENTER<\/strong>\nEnter passphrase (empty for no passphrase): <strong>ENTER<\/strong>\nEnter same passphrase again: <strong>ENTER<\/strong>\nYour identification has been saved in \/home\/kifarunix\/.ssh\/id_rsa\nYour public key has been saved in \/home\/kifarunix\/.ssh\/id_rsa.pub\nThe key fingerprint is:\nSHA256:q+M37Axp1BJJV5cKa4HyS16vTUhE94N9T2A7R9uDdMg kifarunix@controller01\nThe key's randomart image is:\n+---[RSA 3072]----+\n|      .oo.o oo+..|\n|    ...o+. =oEo+o|\n|     oo. +..+.+o+|\n|      oo= .  o =.|\n|     oo=So      .|\n|     .oo..o      |\n|      +..+       |\n|     ..+= .      |\n|     .o+o.       |\n+----[SHA256]-----+\n<\/code><\/pre>\n\n\n\n<p>Next, copy the keys to the other nodes;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>for i in compute01 storage01; do ssh-copy-id kifarunix@$i; done<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"create-a-virtual-environment-for-deploying-kolla-ansible\">Create a Virtual Environment for Deploying Kolla-ansible<\/h3>\n\n\n\n<p>To avoid conflict between system packages and Kolla-ansible packages, it is recommended that Kolla-ansible be installed in a virtual environment.<\/p>\n\n\n\n<p>You can create a virtual environment on the controller\/deployment node by executing the command below. Be sure to replace the path to your virtual environment.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir ~\/kolla-ansible<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">python3 -m venv ~\/kolla-ansible<\/pre>\n\n\n\n<p>Next, activate your virtual environment;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">source ~\/kolla-ansible\/bin\/activate<\/pre>\n\n\n\n<p>Once you activate the Kolla-ansible virtual environment, your shell prompt should change. See my shell prompt;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">(kolla-ansible) kifarunix@controller01:~$<\/pre>\n\n\n\n<p>Upgrade pip;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">pip install -U pip<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"install-ansible-on-ubuntu-22-04\">Install Ansible on Ubuntu 22.04<\/h3>\n\n\n\n<p>Install Ansible from the virtual environment. If you ever log out of the virtual environment, you can always source the path to activate it;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">source $HOME\/kolla-ansible\/bin\/activate<\/pre>\n\n\n\n<p>Next, install Ansible. Kolla requires at least Ansible&nbsp;6&nbsp;up to&nbsp;7, as of this writing. <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">pip install 'ansible&gt;=6,&lt;8'<\/pre>\n\n\n\n<p>Create an ansible configuration file on your home directory with the following <a href=\"https:\/\/docs.openstack.org\/kolla-ansible\/2023.1\/user\/ansible-tuning.html\" target=\"_blank\" rel=\"noreferrer noopener\">tunables<\/a>;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">vim $HOME\/ansible.cfg<\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;defaults]\nhost_key_checking=False\npipelining=True\nforks=100<\/code><\/pre>\n\n\n\n<p>Save and exit the file.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"install-kolla-ansible-on-ubuntu-22-04\">Install Kolla-ansible on Ubuntu 22.04<\/h3>\n\n\n\n<p>Install Kolla-ansible on Ubuntu 22.04 using pip from the virtual environment above;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">source $HOME\/kolla-ansible\/bin\/activate<\/pre>\n\n\n\n<p>The command below installs the current stable release Kolla-ansible as of this writing.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">pip install git+https:\/\/opendev.org\/openstack\/kolla-ansible@stable\/2023.1<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"configure-kolla-ansible-for-multinode-open-stack-deployment\">Configure Kolla-ansible for Multinode OpenStack Deployment<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"prepare-kolla-ansible-configuration-files\">Prepare Kolla Ansible Configuration Files<\/h4>\n\n\n\n<p>Next, create Kolla configuration directory;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo mkdir \/etc\/kolla<\/pre>\n\n\n\n<p>Update the ownership of the Kolla config directory to the user with which you activated Koll-ansible deployment virtual environment as.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo chown $USER:$USER \/etc\/kolla<\/pre>\n\n\n\n<p>Copy the main Kolla configuration file, <code><strong>globals.yml<\/strong><\/code> and the OpenStack services passwords file, <code><strong>passwords.yml<\/strong><\/code> into the Kolla configuration directory above from the <strong>virtual environment<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">cp $HOME\/kolla-ansible\/share\/kolla-ansible\/etc_examples\/kolla\/* \/etc\/kolla\/<\/pre>\n\n\n\n<p>Confirm;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ls \/etc\/kolla<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>globals.yml  passwords.yml<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"define-kolla-ansible-global-deployment-options\">Define Kolla-Ansible Global Deployment Options<\/h4>\n\n\n\n<p>Open the<code> globals.yml<\/code> configuration file and define the Multinode Kolla global deployment options;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">vim \/etc\/kolla\/globals.yml<\/pre>\n\n\n\n<p>Below are the  basic options that we enabled for our AIO OpenStack deployment.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">grep -vE '^$|^#' \/etc\/kolla\/globals.yml<\/pre>\n\n\n\n<pre class=\"scroll-box\"><code>---\nworkaround_ansible_issue_8743: yes\nconfig_strategy: \"COPY_ALWAYS\"\nkolla_base_distro: \"ubuntu\"\nopenstack_release: \"2023.1\"\nkolla_internal_vip_address: \"192.168.200.254\"\nkolla_container_engine: docker\ndocker_configure_for_zun: \"yes\"\ncontainerd_configure_for_zun: \"yes\"\ndocker_apt_package_pin: \"5:20.*\"\nnetwork_address_family: \"ipv4\"\nneutron_plugin_agent: \"openvswitch\"\nenable_openstack_core: \"yes\"\nenable_glance: \"{{ enable_openstack_core | bool }}\"\nenable_haproxy: \"yes\"\nenable_keepalived: \"{{ enable_haproxy | bool }}\"\nenable_keystone: \"{{ enable_openstack_core | bool }}\"\nenable_mariadb: \"yes\"\nenable_memcached: \"yes\"\nenable_neutron: \"{{ enable_openstack_core | bool }}\"\nenable_nova: \"{{ enable_openstack_core | bool }}\"\nenable_aodh: \"yes\"\nenable_ceilometer: \"yes\"\nenable_cinder: \"yes\"\nenable_cinder_backend_lvm: \"yes\"\nenable_etcd: \"yes\"\nenable_gnocchi: \"yes\"\nenable_gnocchi_statsd: \"yes\"\nenable_grafana: \"yes\"\nenable_heat: \"{{ enable_openstack_core | bool }}\"\nenable_horizon: \"{{ enable_openstack_core | bool }}\"\nenable_horizon_zun: \"{{ enable_zun | bool }}\"\nenable_kuryr: \"yes\"\nenable_prometheus: \"yes\"\nenable_zun: \"yes\"\nglance_backend_file: \"yes\"\nglance_file_datadir_volume: \"\/mnt\/glance\"\ncinder_volume_group: \"cinder-volumes\"\n<\/code><\/pre>\n\n\n\n<p class=\"is-style-default\"><strong>NOTE<\/strong> that we enabled<strong> <\/strong>use of NFS share for the glance images mounted under <strong><code>\/mnt\/glance<\/code><\/strong> on the controller node. The NFS share is provided by the storage node.<\/p>\n\n\n\n<p>On controller node, this is how NFS share is mounted;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df -hT -P \/mnt\/glance<\/code><\/pre>\n\n\n\n<pre class=\"scroll-sz\"><code>Filesystem            Type  Size  Used Avail Use% Mounted on\nstorage01:\/mnt\/glance nfs4  100G  746M  100G   1% \/mnt\/glance\n<\/code><\/pre>\n\n\n\n<p>Refer to <a href=\"https:\/\/docs.openstack.org\/\/kolla-ansible\/latest\/doc-kolla-ansible.pdf\" target=\"_blank\" rel=\"noreferrer noopener\">Kolla-ansible documentation guide<\/a> to learn more about the global options used above. The configuration is also highly commented. Go through the comments for each option to learn what it is about a specific option.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"configure-multinode-deployment-inventory\">Configure Multinode Deployment Inventory<\/h4>\n\n\n\n<p>Copy Kolla-ansible deployment multinode inventory to the current working directory. Since we are deploying multinode OpenStack using Kolla-ansible, copy the multinode ansible inventory file. This is the file which contains all the information needed to determine what services run on which nodes<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">cp $HOME\/kolla-ansible\/share\/kolla-ansible\/ansible\/inventory\/multinode .<\/pre>\n\n\n\n<p>This is how our multinode inventory is configured.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat multinode<\/code><\/pre>\n\n\n\n<pre class=\"scroll-box\"><code># These initial groups are the only groups required to be modified. The\n# additional groups are for more control of the environment.\n[control]\ncontroller01 ansible_connection=local neutron_external_interface=vethext\n\n# The above can also be specified as follows:\n#control[01:03]     ansible_user=kolla\n\n# The network nodes are where your l3-agent and loadbalancers will run\n# This can be the same as a host in the control group\n[network]\ncontroller01 ansible_connection=local neutron_external_interface=vethext network_interface=br0\n\n[compute]\ncompute01 neutron_external_interface=enp2s0 network_interface=enp1s0\n\n\n[monitoring]\ncontroller01 ansible_connection=local neutron_external_interface=vethext\n\n# When compute nodes and control nodes use different interfaces,\n# you need to comment out \"api_interface\" and other interfaces from the globals.yml\n# and specify like below:\n#compute01 neutron_external_interface=eth0 api_interface=em1 tunnel_interface=em1\n\n[storage]\nstorage01 neutron_external_interface=enp10s0 network_interface=enp1s0\n\n[deployment]\nlocalhost       ansible_connection=local\n\n[baremetal:children]\ncontrol\nnetwork\ncompute\nstorage\nmonitoring\n\n[tls-backend:children]\ncontrol\n\n# You can explicitly specify which hosts run each project by updating the\n# groups in the sections below. Common services are grouped together.\n\n[common:children]\ncontrol\nnetwork\ncompute\nstorage\nmonitoring\n\n[collectd:children]\ncompute\n\n[grafana:children]\nmonitoring\n\n[etcd:children]\ncontrol\n\n[influxdb:children]\nmonitoring\n\n[prometheus:children]\nmonitoring\n\n[kafka:children]\ncontrol\n\n[telegraf:children]\ncompute\ncontrol\nmonitoring\nnetwork\nstorage\n\n[hacluster:children]\ncontrol\n\n[hacluster-remote:children]\ncompute\n\n[loadbalancer:children]\nnetwork\n\n[mariadb:children]\ncontrol\n\n[rabbitmq:children]\ncontrol\n\n[outward-rabbitmq:children]\ncontrol\n\n[monasca-agent:children]\ncompute\ncontrol\nmonitoring\nnetwork\nstorage\n\n[monasca:children]\nmonitoring\n\n[storm:children]\nmonitoring\n\n[keystone:children]\ncontrol\n\n[glance:children]\ncontrol\n\n[nova:children]\ncontrol\n\n[neutron:children]\nnetwork\n\n[openvswitch:children]\nnetwork\ncompute\nmanila-share\n\n[cinder:children]\ncontrol\n\n[cloudkitty:children]\ncontrol\n\n[freezer:children]\ncontrol\n\n[memcached:children]\ncontrol\n\n[horizon:children]\ncontrol\n\n[swift:children]\ncontrol\n\n[barbican:children]\ncontrol\n\n[heat:children]\ncontrol\n\n[murano:children]\ncontrol\n\n[solum:children]\ncontrol\n\n[ironic:children]\ncontrol\n\n[magnum:children]\ncontrol\n\n[sahara:children]\ncontrol\n\n[mistral:children]\ncontrol\n\n[manila:children]\ncontrol\n\n[ceilometer:children]\ncontrol\n\n[aodh:children]\ncontrol\n\n[cyborg:children]\ncontrol\ncompute\n\n[gnocchi:children]\ncontrol\n\n[tacker:children]\ncontrol\n\n[trove:children]\ncontrol\n\n[senlin:children]\ncontrol\n\n[vitrage:children]\ncontrol\n\n[watcher:children]\ncontrol\n\n[octavia:children]\ncontrol\n\n[designate:children]\ncontrol\n\n[placement:children]\ncontrol\n\n[bifrost:children]\ndeployment\n\n[zookeeper:children]\ncontrol\n\n[zun:children]\ncontrol\n\n[skyline:children]\ncontrol\n\n[redis:children]\ncontrol\n\n[blazar:children]\ncontrol\n\n[venus:children]\nmonitoring\n\n# Additional control implemented here. These groups allow you to control which\n# services run on which hosts at a per-service level.\n#\n# Word of caution: Some services are required to run on the same host to\n# function appropriately. For example, neutron-metadata-agent must run on the\n# same host as the l3-agent and (depending on configuration) the dhcp-agent.\n\n# Common\n[cron:children]\ncommon\n\n[fluentd:children]\ncommon\n\n[kolla-logs:children]\ncommon\n\n[kolla-toolbox:children]\ncommon\n\n[opensearch:children]\ncontrol\n\n# Opensearch dashboards\n[opensearch-dashboards:children]\nopensearch\n\n# Glance\n[glance-api:children]\nglance\n\n# Nova\n[nova-api:children]\nnova\n\n[nova-conductor:children]\nnova\n\n[nova-super-conductor:children]\nnova\n\n[nova-novncproxy:children]\nnova\n\n[nova-scheduler:children]\nnova\n\n[nova-spicehtml5proxy:children]\nnova\n\n[nova-compute-ironic:children]\nnova\n\n[nova-serialproxy:children]\nnova\n\n# Neutron\n[neutron-server:children]\ncontrol\n\n[neutron-dhcp-agent:children]\nneutron\n\n[neutron-l3-agent:children]\nneutron\n\n[neutron-metadata-agent:children]\nneutron\n\n[neutron-ovn-metadata-agent:children]\ncompute\nnetwork\n\n[neutron-bgp-dragent:children]\nneutron\n\n[neutron-infoblox-ipam-agent:children]\nneutron\n\n[neutron-metering-agent:children]\nneutron\n\n[ironic-neutron-agent:children]\nneutron\n\n[neutron-ovn-agent:children]\ncompute\nnetwork\n\n# Cinder\n[cinder-api:children]\ncinder\n\n[cinder-backup:children]\nstorage\n\n[cinder-scheduler:children]\ncinder\n\n[cinder-volume:children]\nstorage\n\n# Cloudkitty\n[cloudkitty-api:children]\ncloudkitty\n\n[cloudkitty-processor:children]\ncloudkitty\n\n# Freezer\n[freezer-api:children]\nfreezer\n\n[freezer-scheduler:children]\nfreezer\n\n# iSCSI\n[iscsid:children]\ncompute\nstorage\nironic\n\n[tgtd:children]\nstorage\n\n# Manila\n[manila-api:children]\nmanila\n\n[manila-scheduler:children]\nmanila\n\n[manila-share:children]\nnetwork\n\n[manila-data:children]\nmanila\n\n# Swift\n[swift-proxy-server:children]\nswift\n\n[swift-account-server:children]\nstorage\n\n[swift-container-server:children]\nstorage\n\n[swift-object-server:children]\nstorage\n\n# Barbican\n[barbican-api:children]\nbarbican\n\n[barbican-keystone-listener:children]\nbarbican\n\n[barbican-worker:children]\nbarbican\n\n# Heat\n[heat-api:children]\nheat\n\n[heat-api-cfn:children]\nheat\n\n[heat-engine:children]\nheat\n\n# Murano\n[murano-api:children]\nmurano\n\n[murano-engine:children]\nmurano\n\n# Monasca\n[monasca-agent-collector:children]\nmonasca-agent\n\n[monasca-agent-forwarder:children]\nmonasca-agent\n\n[monasca-agent-statsd:children]\nmonasca-agent\n\n[monasca-api:children]\nmonasca\n\n[monasca-log-persister:children]\nmonasca\n\n[monasca-log-metrics:children]\nmonasca\n\n[monasca-thresh:children]\nmonasca\n\n[monasca-notification:children]\nmonasca\n\n[monasca-persister:children]\nmonasca\n\n# Storm\n[storm-worker:children]\nstorm\n\n[storm-nimbus:children]\nstorm\n\n# Ironic\n[ironic-api:children]\nironic\n\n[ironic-conductor:children]\nironic\n\n[ironic-inspector:children]\nironic\n\n[ironic-tftp:children]\nironic\n\n[ironic-http:children]\nironic\n\n# Magnum\n[magnum-api:children]\nmagnum\n\n[magnum-conductor:children]\nmagnum\n\n# Sahara\n[sahara-api:children]\nsahara\n\n[sahara-engine:children]\nsahara\n\n# Solum\n[solum-api:children]\nsolum\n\n[solum-worker:children]\nsolum\n\n[solum-deployer:children]\nsolum\n\n[solum-conductor:children]\nsolum\n\n[solum-application-deployment:children]\nsolum\n\n[solum-image-builder:children]\nsolum\n\n# Mistral\n[mistral-api:children]\nmistral\n\n[mistral-executor:children]\nmistral\n\n[mistral-engine:children]\nmistral\n\n[mistral-event-engine:children]\nmistral\n\n# Ceilometer\n[ceilometer-central:children]\nceilometer\n\n[ceilometer-notification:children]\nceilometer\n\n[ceilometer-compute:children]\ncompute\n\n[ceilometer-ipmi:children]\ncompute\n\n# Aodh\n[aodh-api:children]\naodh\n\n[aodh-evaluator:children]\naodh\n\n[aodh-listener:children]\naodh\n\n[aodh-notifier:children]\naodh\n\n# Cyborg\n[cyborg-api:children]\ncyborg\n\n[cyborg-agent:children]\ncompute\n\n[cyborg-conductor:children]\ncyborg\n\n# Gnocchi\n[gnocchi-api:children]\ngnocchi\n\n[gnocchi-statsd:children]\ngnocchi\n\n[gnocchi-metricd:children]\ngnocchi\n\n# Trove\n[trove-api:children]\ntrove\n\n[trove-conductor:children]\ntrove\n\n[trove-taskmanager:children]\ntrove\n\n# Multipathd\n[multipathd:children]\ncompute\nstorage\n\n# Watcher\n[watcher-api:children]\nwatcher\n\n[watcher-engine:children]\nwatcher\n\n[watcher-applier:children]\nwatcher\n\n# Senlin\n[senlin-api:children]\nsenlin\n\n[senlin-conductor:children]\nsenlin\n\n[senlin-engine:children]\nsenlin\n\n[senlin-health-manager:children]\nsenlin\n\n# Octavia\n[octavia-api:children]\noctavia\n\n[octavia-driver-agent:children]\noctavia\n\n[octavia-health-manager:children]\noctavia\n\n[octavia-housekeeping:children]\noctavia\n\n[octavia-worker:children]\noctavia\n\n# Designate\n[designate-api:children]\ndesignate\n\n[designate-central:children]\ndesignate\n\n[designate-producer:children]\ndesignate\n\n[designate-mdns:children]\nnetwork\n\n[designate-worker:children]\ndesignate\n\n[designate-sink:children]\ndesignate\n\n[designate-backend-bind9:children]\ndesignate\n\n# Placement\n[placement-api:children]\nplacement\n\n# Zun\n[zun-api:children]\nzun\n\n[zun-wsproxy:children]\nzun\n\n[zun-compute:children]\ncompute\n\n[zun-cni-daemon:children]\ncompute\n\n# Skyline\n[skyline-apiserver:children]\nskyline\n\n[skyline-console:children]\nskyline\n\n# Tacker\n[tacker-server:children]\ntacker\n\n[tacker-conductor:children]\ntacker\n\n# Vitrage\n[vitrage-api:children]\nvitrage\n\n[vitrage-notifier:children]\nvitrage\n\n[vitrage-graph:children]\nvitrage\n\n[vitrage-ml:children]\nvitrage\n\n[vitrage-persistor:children]\nvitrage\n\n# Blazar\n[blazar-api:children]\nblazar\n\n[blazar-manager:children]\nblazar\n\n# Prometheus\n[prometheus-node-exporter:children]\nmonitoring\ncontrol\ncompute\nnetwork\nstorage\n\n[prometheus-mysqld-exporter:children]\nmariadb\n\n[prometheus-haproxy-exporter:children]\nloadbalancer\n\n[prometheus-memcached-exporter:children]\nmemcached\n\n[prometheus-cadvisor:children]\nmonitoring\ncontrol\ncompute\nnetwork\nstorage\n\n[prometheus-alertmanager:children]\nmonitoring\n\n[prometheus-openstack-exporter:children]\nmonitoring\n\n[prometheus-elasticsearch-exporter:children]\nopensearch\n\n[prometheus-blackbox-exporter:children]\nmonitoring\n\n[prometheus-libvirt-exporter:children]\ncompute\n\n[prometheus-msteams:children]\nprometheus-alertmanager\n\n[masakari-api:children]\ncontrol\n\n[masakari-engine:children]\ncontrol\n\n[masakari-hostmonitor:children]\ncontrol\n\n[masakari-instancemonitor:children]\ncompute\n\n[ovn-controller:children]\novn-controller-compute\novn-controller-network\n\n[ovn-controller-compute:children]\ncompute\n\n[ovn-controller-network:children]\nnetwork\n\n[ovn-database:children]\ncontrol\n\n[ovn-northd:children]\novn-database\n\n[ovn-nb-db:children]\novn-database\n\n[ovn-sb-db:children]\novn-database\n\n[venus-api:children]\nvenus\n\n[venus-manager:children]\nvenus\n<\/code><\/pre>\n\n\n\n<p>In the storage node, we also created a block storage LVM volume group called <strong>cinder-volumes<\/strong>;<\/p>\n\n\n\n<p>See below command output executed on storage node;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo vgs<\/pre>\n\n\n\n<pre class=\"scroll-sz\"><code>  VG             #PV #LV #SN Attr   VSize    VFree   \n  <strong>cinder-volumes   1   0   0 wz--n- &lt;100.00g &lt;100.00g<\/strong>\n  glance           1   1   0 wz--n- &lt;100.00g       0 \n  ubuntu-vg        1   1   0 wz--n- &lt;101.00g       0\n<\/code><\/pre>\n\n\n\n<p>See also that if different nodes have different interface names for network and management, define respective interface on each node as defined in the inventory file above.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"generate-kolla-passwords\">Generate Kolla Passwords<\/h4>\n\n\n\n<p>Kolla <code><strong>passwords.yml<\/strong><\/code> configuration file stores various OpenStack services passwords. You can automatically generate the password using the Kolla-ansible <code>kolla-genpwd<\/code> in your virtual environment.<\/p>\n\n\n\n<p>Ensure that your virtual environment is activated<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">source $HOME\/kolla-ansible\/bin\/activate<\/pre>\n\n\n\n<p>Next, generate the passwords;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">kolla-genpwd<\/pre>\n\n\n\n<p>All generated passwords will be populated to <code><strong>\/etc\/kolla\/passwords.yml<\/strong><\/code> file.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"using-kolla-ansible-to-deploy-multinode-open-stack\">Using Kolla-Ansible to Deploy Multinode OpenStack<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"install-ansible-galaxy-requirements\">Install Ansible Galaxy requirements<\/h4>\n\n\n\n<p>The Kolla Ansible Galaxy requirements are a set of Ansible roles and collections that are required to deploy OpenStack using Kolla Ansible.<\/p>\n\n\n\n<p>To install them, run the command below;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kolla-ansible install-deps<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"boostrap-open-stack-nodes-with-kolla-deploy-dependencies\">Boostrap OpenStack Nodes with Kolla Deploy Dependencies<\/h4>\n\n\n\n<p>Since everything is setup so far, you can now start to deploy Multinode OpenStack.<\/p>\n\n\n\n<p><strong>Again, ensure that your virtual environment is activated.<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">source $HOME\/kolla-ansible\/bin\/activate<\/pre>\n\n\n\n<p>Bootstrap your OpenStack nodes with kolla deploy dependencies using <code><strong>bootstrap-servers<\/strong><\/code> subcommand.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">kolla-ansible -i multinode bootstrap-servers<\/pre>\n\n\n\n<p>Below is just a snippet of the bootstrapping command;<\/p>\n\n\n\n<pre class=\"scroll-box\"><code>Bootstrapping servers : ansible-playbook -e @\/etc\/kolla\/globals.yml  -e @\/etc\/kolla\/passwords.yml -e CONFIG_DIR=\/etc\/kolla  -e kolla_action=bootstrap-servers \/home\/kifarunix\/kolla-ansible\/share\/kolla-ansible\/ansible\/kolla-host.yml  --inventory multinode\n[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details\n\nPLAY [Gather facts for all hosts] ****************************************************************************************************************************\n\nTASK [Gather facts] ******************************************************************************************************************************************\nok: [localhost]\nok: [storage01]\nok: [compute01]\n\nTASK [Gather package facts] **********************************************************************************************************************************\nskipping: [compute01]\nskipping: [localhost]\nskipping: [storage01]\n\nTASK [Group hosts to determine when using --limit] ***********************************************************************************************************\nok: [compute01]\nok: [localhost]\nok: [storage01]\n[WARNING]: Could not match supplied host pattern, ignoring: all_using_limit_True\n\nPLAY [Gather facts for all hosts (if using --limit)] *********************************************************************************************************\nskipping: no hosts matched\n\nPLAY [Apply role baremetal] **********************************************************************************************************************************\n\nTASK [openstack.kolla.etc_hosts : Include etc-hosts.yml] *****************************************************************************************************\nincluded: \/home\/kifarunix\/.ansible\/collections\/ansible_collections\/openstack\/kolla\/roles\/etc_hosts\/tasks\/etc-hosts.yml for localhost, compute01, storage01\n\nTASK [openstack.kolla.etc_hosts : Ensure localhost in \/etc\/hosts] ********************************************************************************************\nok: [compute01]\nok: [storage01]\nok: [localhost]\n\nTASK [openstack.kolla.etc_hosts : Ensure hostname does not point to 127.0.1.1 in \/etc\/hosts] *****************************************************************\nok: [localhost]\nok: [compute01]\nok: [storage01]\n\nTASK [openstack.kolla.etc_hosts : Generate \/etc\/hosts for all of the nodes] **********************************************************************************\n[WARNING]: Module remote_tmp \/root\/.ansible\/tmp did not exist and was created with a mode of 0700, this may cause issues when running as another user. To\navoid this, create the remote_tmp dir with the correct permissions manually\nchanged: [storage01]\nchanged: [compute01]\nchanged: [localhost]\n\nTASK [openstack.kolla.etc_hosts : Check whether \/etc\/cloud\/cloud.cfg exists] *********************************************************************************\nok: [storage01]\nok: [localhost]\nok: [compute01]\n\nTASK [openstack.kolla.etc_hosts : Disable cloud-init manage_etc_hosts] ***************************************************************************************\nchanged: [storage01]\nchanged: [localhost]\nchanged: [compute01]\n\nTASK [openstack.kolla.baremetal : Ensure unprivileged users can use ping] ************************************************************************************\nskipping: [localhost]\nskipping: [compute01]\nskipping: [storage01]\n\nTASK [openstack.kolla.baremetal : Set firewall default policy] ***********************************************************************************************\nok: [localhost]\nok: [storage01]\nok: [compute01]\n\nTASK [openstack.kolla.baremetal : Check if firewalld is installed] *******************************************************************************************\nskipping: [localhost]\nskipping: [compute01]\nskipping: [storage01]\n\nTASK [openstack.kolla.baremetal : Disable firewalld] *********************************************************************************************************\nskipping: [localhost] => (item=firewalld) \nskipping: [localhost]\nskipping: [compute01] => (item=firewalld) \nskipping: [compute01]\nskipping: [storage01] => (item=firewalld) \nskipping: [storage01]\n\nTASK [openstack.kolla.packages : Install packages] ***********************************************************************************************************\nok: [compute01]\nok: [storage01]\nok: [localhost]\n\nTASK [openstack.kolla.packages : Remove packages] ************************************************************************************************************\nchanged: [storage01]\nchanged: [localhost]\nchanged: [compute01]\n\nTASK [openstack.kolla.docker : include_tasks] ****************************************************************************************************************\nincluded: \/home\/kifarunix\/.ansible\/collections\/ansible_collections\/openstack\/kolla\/roles\/docker\/tasks\/repo-Debian.yml for localhost, compute01, storage01\n\nTASK [openstack.kolla.docker : Install CA certificates and gnupg packages] ***********************************************************************************\nok: [localhost]\nok: [compute01]\nok: [storage01]\n\nTASK [openstack.kolla.docker : Ensure apt sources list directory exists] *************************************************************************************\nok: [storage01]\nok: [compute01]\nok: [localhost]\n\nTASK [openstack.kolla.docker : Ensure apt keyrings directory exists] *****************************************************************************************\nok: [localhost]\nok: [compute01]\nok: [storage01]\n\nTASK [openstack.kolla.docker : Install docker apt gpg key] ***************************************************************************************************\nchanged: [compute01]\nchanged: [localhost]\nchanged: [storage01]\n\nTASK [openstack.kolla.docker : Install docker apt pin] *******************************************************************************************************\nchanged: [localhost]\nchanged: [storage01]\nchanged: [compute01]\n\nTASK [openstack.kolla.docker : Enable docker apt repository] *************************************************************************************************\nchanged: [storage01]\nchanged: [compute01]\nchanged: [localhost]\n\nTASK [openstack.kolla.docker : Check which containers are running] *******************************************************************************************\nok: [compute01]\nok: [localhost]\nok: [storage01]\n\nTASK [openstack.kolla.docker : Check if docker systemd unit exists] ******************************************************************************************\nok: [localhost]\nok: [compute01]\nok: [storage01]\n\nTASK [openstack.kolla.docker : Mask the docker systemd unit on Debian\/Ubuntu] ********************************************************************************\nchanged: [localhost]\nchanged: [compute01]\nchanged: [storage01]\n\nTASK [openstack.kolla.docker : Install packages] *************************************************************************************************************\nchanged: [localhost]\nchanged: [storage01]\nchanged: [compute01]\n\nTASK [openstack.kolla.docker : Start docker] *****************************************************************************************************************\nskipping: [localhost]\nskipping: [compute01]\nskipping: [storage01]\n\nTASK [openstack.kolla.docker : Wait for Docker to start] *****************************************************************************************************\nskipping: [localhost]\nskipping: [compute01]\nskipping: [storage01]\n\nTASK [openstack.kolla.docker : Ensure containers are running after Docker upgrade] ***************************************************************************\nskipping: [localhost]\nskipping: [compute01]\nskipping: [storage01]\n\nTASK [openstack.kolla.docker : Ensure docker config directory exists] ****************************************************************************************\nchanged: [localhost]\nchanged: [compute01]\nchanged: [storage01]\n\nTASK [openstack.kolla.docker : Write docker config] **********************************************************************************************************\nchanged: [localhost]\nchanged: [compute01]\nchanged: [storage01]\n\nTASK [openstack.kolla.docker : Remove old docker options file] ***********************************************************************************************\nskipping: [compute01]\nok: [localhost]\nok: [storage01]\n\nTASK [openstack.kolla.docker : Ensure docker service directory exists] ***************************************************************************************\nskipping: [localhost]\nskipping: [storage01]\nchanged: [compute01]\n\nTASK [openstack.kolla.docker : Configure docker service] *****************************************************************************************************\nskipping: [localhost]\nskipping: [storage01]\nchanged: [compute01]\n\nTASK [openstack.kolla.docker : Ensure the path for CA file for private registry exists] **********************************************************************\nskipping: [localhost]\nskipping: [compute01]\nskipping: [storage01]\n\nTASK [openstack.kolla.docker : Ensure the CA file for private registry exists] *******************************************************************************\nskipping: [localhost]\nskipping: [compute01]\nskipping: [storage01]\n\nTASK [openstack.kolla.docker : Flush handlers] ***************************************************************************************************************\n\nTASK [openstack.kolla.docker : Flush handlers] ***************************************************************************************************************\n\nTASK [openstack.kolla.docker : Flush handlers] ***************************************************************************************************************\n\nRUNNING HANDLER [openstack.kolla.docker : Reload docker service file] ****************************************************************************************\nok: [compute01]\n\nRUNNING HANDLER [openstack.kolla.docker : Restart docker] ****************************************************************************************************\nchanged: [localhost]\nchanged: [storage01]\nchanged: [compute01]\n\nTASK [openstack.kolla.docker : Start and enable docker] ******************************************************************************************************\nchanged: [storage01]\nchanged: [localhost]\nchanged: [compute01]\n\nTASK [openstack.kolla.docker : include_tasks] ****************************************************************************************************************\nskipping: [localhost]\nskipping: [storage01]\nincluded: \/home\/kifarunix\/.ansible\/collections\/ansible_collections\/openstack\/kolla\/roles\/docker\/tasks\/configure-containerd-for-zun.yml for compute01\n\nTASK [openstack.kolla.docker : Ensuring CNI config directory exist] ******************************************************************************************\nchanged: [compute01]\n\nTASK [openstack.kolla.docker : Copying CNI config file] ******************************************************************************************************\nchanged: [compute01]\n\nTASK [openstack.kolla.docker : Ensuring CNI bin directory exist] *********************************************************************************************\nchanged: [compute01]\n\nTASK [openstack.kolla.docker : Copy zun-cni script] **********************************************************************************************************\nchanged: [compute01]\n\nTASK [openstack.kolla.docker : Copying over containerd config] ***********************************************************************************************\nchanged: [compute01]\n\nTASK [openstack.kolla.kolla_user : Ensure groups are present] ************************************************************************************************\nskipping: [localhost] => (item=docker) \nskipping: [localhost] => (item=sudo) \nskipping: [localhost] => (item=kolla) \nskipping: [localhost]\nskipping: [compute01] => (item=docker) \nskipping: [compute01] => (item=sudo) \nskipping: [compute01] => (item=kolla) \nskipping: [compute01]\nskipping: [storage01] => (item=docker) \nskipping: [storage01] => (item=sudo) \nskipping: [storage01] => (item=kolla) \nskipping: [storage01]\n\nTASK [openstack.kolla.kolla_user : Create kolla user] ********************************************************************************************************\nskipping: [localhost]\nskipping: [compute01]\nskipping: [storage01]\n\nTASK [openstack.kolla.kolla_user : Add public key to kolla user authorized keys] *****************************************************************************\nskipping: [localhost]\nskipping: [compute01]\nskipping: [storage01]\n\nTASK [openstack.kolla.kolla_user : Grant kolla user passwordless sudo] ***************************************************************************************\nskipping: [localhost]\nskipping: [compute01]\nskipping: [storage01]\n\nTASK [openstack.kolla.docker_sdk : Install packages] *********************************************************************************************************\nchanged: [localhost]\nchanged: [compute01]\nchanged: [storage01]\n\nTASK [openstack.kolla.docker_sdk : Install latest pip in the virtualenv] *************************************************************************************\nskipping: [localhost]\nskipping: [compute01]\nskipping: [storage01]\n\nTASK [openstack.kolla.docker_sdk : Install docker SDK for python] ********************************************************************************************\nchanged: [localhost]\nchanged: [storage01]\nchanged: [compute01]\n\nTASK [openstack.kolla.baremetal : Ensure node_config_directory directory exists] *****************************************************************************\nok: [localhost]\nchanged: [compute01]\nchanged: [storage01]\n\nTASK [openstack.kolla.apparmor_libvirt : include_tasks] ******************************************************************************************************\nincluded: \/home\/kifarunix\/.ansible\/collections\/ansible_collections\/openstack\/kolla\/roles\/apparmor_libvirt\/tasks\/remove-profile.yml for localhost, compute01, storage01\n\nTASK [openstack.kolla.apparmor_libvirt : Get stat of libvirtd apparmor profile] ******************************************************************************\nok: [localhost]\nok: [compute01]\nok: [storage01]\n\nTASK [openstack.kolla.apparmor_libvirt : Get stat of libvirtd apparmor disable profile] **********************************************************************\nok: [localhost]\nok: [compute01]\nok: [storage01]\n\nTASK [openstack.kolla.apparmor_libvirt : Remove apparmor profile for libvirt] ********************************************************************************\nskipping: [localhost]\nskipping: [compute01]\nskipping: [storage01]\n\nTASK [openstack.kolla.baremetal : Change state of selinux] ***************************************************************************************************\nskipping: [localhost]\nskipping: [compute01]\nskipping: [storage01]\n\nTASK [openstack.kolla.baremetal : Set https proxy for git] ***************************************************************************************************\nskipping: [localhost]\nskipping: [compute01]\nskipping: [storage01]\n\nTASK [openstack.kolla.baremetal : Set http proxy for git] ****************************************************************************************************\nskipping: [localhost]\nskipping: [compute01]\nskipping: [storage01]\n\nTASK [openstack.kolla.baremetal : Configure ceph for zun] ****************************************************************************************************\nskipping: [localhost]\nskipping: [compute01]\nskipping: [storage01]\n\nRUNNING HANDLER [openstack.kolla.docker : Restart containerd] ************************************************************************************************\nchanged: [compute01]\n\nPLAY RECAP ***************************************************************************************************************************************************\ncompute01                  : ok=42   changed=23   unreachable=0    failed=0    skipped=20   rescued=0    ignored=0   \nlocalhost                  : ok=33   changed=14   unreachable=0    failed=0    skipped=22   rescued=0    ignored=0   \nstorage01                  : ok=33   changed=15   unreachable=0    failed=0    skipped=22   rescued=0    ignored=0\n<\/code><\/pre>\n\n\n\n<p>This is what the bootstrap command do;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Customisation of&nbsp;<code>\/etc\/hosts<\/code><\/li>\n\n\n\n<li>Creation of user and group<\/li>\n\n\n\n<li>Kolla configuration directory<\/li>\n\n\n\n<li>Package installation and removal<\/li>\n\n\n\n<li>Docker engine installation and configuration<\/li>\n\n\n\n<li>Disabling firewalls<\/li>\n\n\n\n<li>Creation of Python virtual environment<\/li>\n\n\n\n<li>Configuration of Apparmor<\/li>\n\n\n\n<li>Configuration of SELinux<\/li>\n\n\n\n<li>Configuration of NTP daemon<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"run-pre-deployment-checks-on-the-nodes\">Run pre-deployment checks on the nodes<\/h4>\n\n\n\n<p>Execute the command below to run the pre-deployment checks for hosts.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">kolla-ansible -i multinode prechecks<\/pre>\n\n\n\n<p>Sample output;<\/p>\n\n\n\n<pre class=\"scroll-box\"><code>...\nPLAY RECAP ***************************************************************************************************************************************************\ncompute01                  : ok=50   changed=0    unreachable=0    failed=0    skipped=43   rescued=0    ignored=0   \nlocalhost                  : ok=132  changed=0    unreachable=0    failed=0    skipped=163  rescued=0    ignored=0   \nstorage01                  : ok=35   changed=0    unreachable=0    failed=0    skipped=28   rescued=0    ignored=0 \n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"use-kolla-ansible-to-deploy-multinode-open-stack\">Use Kolla-Ansible to deploy Multinode OpenStack<\/h4>\n\n\n\n<p>If everything is fine, proceed to deploy Multinode OpenStack on Ubuntu 22.04;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">kolla-ansible -i multinode deploy<\/pre>\n\n\n\n<p>The process might take a while as it involves building containers for different OpenStack services.<\/p>\n\n\n\n<p>If all ends well, you should get 0 failed tasks;<\/p>\n\n\n\n<p>If during the deployment you encounter this error;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>TASK &#91;haproxy-config : Copying over nova-cell:nova-novncproxy haproxy config] ********************************************************************************\nfatal: &#91;localhost]: FAILED! =&gt; {\"msg\": \"An unhandled exception occurred while templating '{{ cell_proxy_project_services | namespace_haproxy_for_cell(cell_name) }}'. Error was a &lt;class 'ansible.errors.AnsibleError'&gt;, original message: template error while templating string: Could not load \\\"namespace_haproxy_for_cell\\\": 'namespace_haproxy_for_cell'. String: {{ cell_proxy_project_services | namespace_haproxy_for_cell(cell_name) }}. Could not load \\\"namespace_haproxy_for_cell\\\": 'namespace_haproxy_for_cell'\"}<\/strong><\/code><\/pre>\n\n\n\n<p>It is suggested <a href=\"https:\/\/github.com\/ansible\/ansible\/issues\/81945\" target=\"_blank\" rel=\"noopener\">here<\/a>, that you downgrade the version of Core ansible from 2.14.11 to 2.14.10 before running the deployment command;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pip install ansible-core==2.14.10<\/code><\/pre>\n\n\n\n<p>Next, re-run the deployment;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kolla-ansible -i multinode deploy<\/code><\/pre>\n\n\n\n<p>Ensure that no deployment task failed. If any fails, fix it before you can proceed.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"verify-multinode-open-stack-deployment\">Verify Multinode OpenStack Deployment<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"list-running-open-stack-docker-containers\">List Running OpenStack Docker Containers<\/h4>\n\n\n\n<p>Once the deployment is done, you can list running OpenStack docker containers.<\/p>\n\n\n\n<p>Controller Node Containers:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">docker ps<\/pre>\n\n\n\n<pre class=\"scroll-box\"><code>CONTAINER ID   IMAGE                                                                       COMMAND                  CREATED        STATUS                   PORTS     NAMES\nca9cecdf07eb   quay.io\/openstack.kolla\/zun-wsproxy:2023.1-ubuntu-jammy                     \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               zun_wsproxy\nc3058fa2b631   quay.io\/openstack.kolla\/zun-api:2023.1-ubuntu-jammy                         \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               zun_api\n555bf24841ed   quay.io\/openstack.kolla\/grafana:2023.1-ubuntu-jammy                         \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes                         grafana\n4ee3cb6600ef   quay.io\/openstack.kolla\/aodh-notifier:2023.1-ubuntu-jammy                   \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               aodh_notifier\n028536a0b6d1   quay.io\/openstack.kolla\/aodh-listener:2023.1-ubuntu-jammy                   \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               aodh_listener\nc86a15aa5c6d   quay.io\/openstack.kolla\/aodh-evaluator:2023.1-ubuntu-jammy                  \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               aodh_evaluator\nfb83c42b6a73   quay.io\/openstack.kolla\/aodh-api:2023.1-ubuntu-jammy                        \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               aodh_api\n6bed912c6098   quay.io\/openstack.kolla\/ceilometer-central:2023.1-ubuntu-jammy              \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (unhealthy)             ceilometer_central\n5294be9ba04f   quay.io\/openstack.kolla\/ceilometer-notification:2023.1-ubuntu-jammy         \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               ceilometer_notification\ncfd49c155691   quay.io\/openstack.kolla\/gnocchi-statsd:2023.1-ubuntu-jammy                  \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (unhealthy)             gnocchi_statsd\n7ba7dab61ca7   quay.io\/openstack.kolla\/gnocchi-metricd:2023.1-ubuntu-jammy                 \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               gnocchi_metricd\n605dd04439a1   quay.io\/openstack.kolla\/gnocchi-api:2023.1-ubuntu-jammy                     \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               gnocchi_api\ndd0919801045   quay.io\/openstack.kolla\/horizon:2023.1-ubuntu-jammy                         \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               horizon\nb16fa404322e   quay.io\/openstack.kolla\/heat-engine:2023.1-ubuntu-jammy                     \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               heat_engine\n55af05818f8a   quay.io\/openstack.kolla\/heat-api-cfn:2023.1-ubuntu-jammy                    \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               heat_api_cfn\n978aaaccae90   quay.io\/openstack.kolla\/heat-api:2023.1-ubuntu-jammy                        \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               heat_api\n062fef51d803   quay.io\/openstack.kolla\/neutron-metadata-agent:2023.1-ubuntu-jammy          \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               neutron_metadata_agent\n089d46bf865d   quay.io\/openstack.kolla\/neutron-l3-agent:2023.1-ubuntu-jammy                \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               neutron_l3_agent\nf772f1b1489c   quay.io\/openstack.kolla\/neutron-dhcp-agent:2023.1-ubuntu-jammy              \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               neutron_dhcp_agent\n9eeaba1aafda   quay.io\/openstack.kolla\/neutron-openvswitch-agent:2023.1-ubuntu-jammy       \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               neutron_openvswitch_agent\nad3c51b32405   quay.io\/openstack.kolla\/neutron-server:2023.1-ubuntu-jammy                  \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               neutron_server\n5f0cf1f39419   quay.io\/openstack.kolla\/openvswitch-vswitchd:2023.1-ubuntu-jammy            \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               openvswitch_vswitchd\ne848738cf82a   quay.io\/openstack.kolla\/openvswitch-db-server:2023.1-ubuntu-jammy           \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               openvswitch_db\n75bee8399705   quay.io\/openstack.kolla\/nova-novncproxy:2023.1-ubuntu-jammy                 \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               nova_novncproxy\n063a33022b2e   quay.io\/openstack.kolla\/nova-conductor:2023.1-ubuntu-jammy                  \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               nova_conductor\n60dfe04def4c   quay.io\/openstack.kolla\/nova-api:2023.1-ubuntu-jammy                        \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               nova_api\n78ed93d64411   quay.io\/openstack.kolla\/nova-scheduler:2023.1-ubuntu-jammy                  \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               nova_scheduler\n3b870664710d   quay.io\/openstack.kolla\/placement-api:2023.1-ubuntu-jammy                   \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               placement_api\n7f9d1e1665c2   quay.io\/openstack.kolla\/cinder-scheduler:2023.1-ubuntu-jammy                \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               cinder_scheduler\ne149f97d312d   quay.io\/openstack.kolla\/cinder-api:2023.1-ubuntu-jammy                      \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               cinder_api\ndb46e9afa5c7   quay.io\/openstack.kolla\/glance-api:2023.1-ubuntu-jammy                      \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               glance_api\ndb46f61525f0   quay.io\/openstack.kolla\/haproxy:2023.1-ubuntu-jammy                         \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               haproxy\n852fc98e1ea1   quay.io\/openstack.kolla\/keystone:2023.1-ubuntu-jammy                        \"dumb-init --single-\u2026\"   15 minutes ago   Up 15 minutes (healthy)              keystone\n573a2af3a09b   quay.io\/openstack.kolla\/keystone-fernet:2023.1-ubuntu-jammy                 \"dumb-init --single-\u2026\"   15 minutes ago   Up 15 minutes (healthy)              keystone_fernet\n0e0f71e8e708   quay.io\/openstack.kolla\/keystone-ssh:2023.1-ubuntu-jammy                    \"dumb-init --single-\u2026\"   15 minutes ago   Up 15 minutes (healthy)              keystone_ssh\n029256854ce7   quay.io\/openstack.kolla\/etcd:2023.1-ubuntu-jammy                            \"dumb-init --single-\u2026\"   15 minutes ago   Up 15 minutes                        etcd\nb74512e6271e   quay.io\/openstack.kolla\/rabbitmq:2023.1-ubuntu-jammy                        \"dumb-init --single-\u2026\"   15 minutes ago   Up 15 minutes (healthy)              rabbitmq\nfdeb9baf82a4   quay.io\/openstack.kolla\/prometheus-blackbox-exporter:2023.1-ubuntu-jammy    \"dumb-init --single-\u2026\"   15 minutes ago   Up 11 minutes                         prometheus_blackbox_exporter\n0d23b50e8024   quay.io\/openstack.kolla\/prometheus-openstack-exporter:2023.1-ubuntu-jammy   \"dumb-init --single-\u2026\"   15 minutes ago   Up 11 minutes                         prometheus_openstack_exporter\ndc9ba602c3de   quay.io\/openstack.kolla\/prometheus-alertmanager:2023.1-ubuntu-jammy         \"dumb-init --single-\u2026\"   15 minutes ago   Up 11 minutes                         prometheus_alertmanager\n9f2de50c7835   quay.io\/openstack.kolla\/prometheus-cadvisor:2023.1-ubuntu-jammy             \"dumb-init --single-\u2026\"   15 minutes ago   Up 11 minutes                         prometheus_cadvisor\nab28657f81ee   quay.io\/openstack.kolla\/prometheus-memcached-exporter:2023.1-ubuntu-jammy   \"dumb-init --single-\u2026\"   15 minutes ago   Up 11 minutes                         prometheus_memcached_exporter\ndf50420038b5   quay.io\/openstack.kolla\/prometheus-haproxy-exporter:2023.1-ubuntu-jammy     \"dumb-init --single-\u2026\"   15 minutes ago   Up 11 minutes                         prometheus_haproxy_exporter\n75941e5b1290   quay.io\/openstack.kolla\/prometheus-mysqld-exporter:2023.1-ubuntu-jammy      \"dumb-init --single-\u2026\"   15 minutes ago   Up 11 minutes                         prometheus_mysqld_exporter\n8e589fcf6ca0   quay.io\/openstack.kolla\/prometheus-node-exporter:2023.1-ubuntu-jammy        \"dumb-init --single-\u2026\"   15 minutes ago   Up 11 minutes                         prometheus_node_exporter\n59704ffe90b8   quay.io\/openstack.kolla\/prometheus-v2-server:2023.1-ubuntu-jammy            \"dumb-init --single-\u2026\"   15 minutes ago   Up 11 minutes                         prometheus_server\ncef8926622bd   quay.io\/openstack.kolla\/memcached:2023.1-ubuntu-jammy                       \"dumb-init --single-\u2026\"   15 minutes ago   Up 15 minutes (healthy)              memcached\nc50a17f0fe26   quay.io\/openstack.kolla\/mariadb-server:2023.1-ubuntu-jammy                  \"dumb-init -- kolla_\u2026\"   15 minutes ago   Up 15 minutes (healthy)              mariadb\n9f1b1c0f060a   quay.io\/openstack.kolla\/mariadb-clustercheck:2023.1-ubuntu-jammy            \"dumb-init --single-\u2026\"   15 minutes ago   Up 15 minutes                        mariadb_clustercheck\n5cb589f36080   quay.io\/openstack.kolla\/keepalived:2023.1-ubuntu-jammy                      \"dumb-init --single-\u2026\"   15 minutes ago   Up 15 minutes                        keepalived\n58931dccea50   quay.io\/openstack.kolla\/cron:2023.1-ubuntu-jammy                            \"dumb-init --single-\u2026\"   15 minutes ago   Up 11 minutes                         cron\n40b4dc10c199   quay.io\/openstack.kolla\/kolla-toolbox:2023.1-ubuntu-jammy                   \"dumb-init --single-\u2026\"   15 minutes ago   Up 11 minutes                         kolla_toolbox\n09304a67aa14   quay.io\/openstack.kolla\/fluentd:2023.1-ubuntu-jammy                         \"dumb-init --single-\u2026\"   15 minutes ago   Up 11 minutes                         fluentd\n<\/code><\/pre>\n\n\n\n<p>OpenStack services are now up and running.<\/p>\n\n\n\n<p>If you want to run Docker commands as standard user, add the user to the <strong><code>docker<\/code><\/strong> group.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo usermod -aG docker kifarunix<\/code><\/pre>\n\n\n\n<p>Confiirm the use of NFS share for the Glance images. The NFS share is bound to Glance image path, <strong>\/var\/lib\/glance<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker inspect glance_api<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>            {\n                \"Type\": \"bind\",\n                \"Source\": \"<strong>\/mnt\/glance<\/strong>\",\n                \"Destination\": \"<strong>\/var\/lib\/glance<\/strong>\",\n                \"Mode\": \"rw\",\n                \"RW\": true,\n                \"Propagation\": \"rprivate\"\n            },<\/code><\/pre>\n\n\n\n<p>Compute Node Containers:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker ps<\/code><\/pre>\n\n\n\n<pre class=\"scroll-box\"><code>CONTAINER ID   IMAGE                                                                     COMMAND                  CREATED        STATUS                   PORTS     NAMES\n58208486f3a8   quay.io\/openstack.kolla\/zun-cni-daemon:2023.1-ubuntu-jammy                \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               zun_cni_daemon\nff14d52b7e14   quay.io\/openstack.kolla\/zun-compute:2023.1-ubuntu-jammy                   \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               zun_compute\nf66ff68bdf24   quay.io\/openstack.kolla\/ceilometer-compute:2023.1-ubuntu-jammy            \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (unhealthy)             ceilometer_compute\ndabed085c5b7   quay.io\/openstack.kolla\/kuryr-libnetwork:2023.1-ubuntu-jammy              \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               kuryr\n8f0d741d001e   quay.io\/openstack.kolla\/neutron-openvswitch-agent:2023.1-ubuntu-jammy     \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               neutron_openvswitch_agent\nec57feba083f   quay.io\/openstack.kolla\/openvswitch-vswitchd:2023.1-ubuntu-jammy          \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               openvswitch_vswitchd\n9118cffd2892   quay.io\/openstack.kolla\/openvswitch-db-server:2023.1-ubuntu-jammy         \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               openvswitch_db\ndeba7e6de5a4   quay.io\/openstack.kolla\/nova-compute:2023.1-ubuntu-jammy                  \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               nova_compute\nc9db01568849   quay.io\/openstack.kolla\/nova-libvirt:2023.1-ubuntu-jammy                  \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               nova_libvirt\nb1370a657a30   quay.io\/openstack.kolla\/nova-ssh:2023.1-ubuntu-jammy                      \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)               nova_ssh\n61d7027d0ded   quay.io\/openstack.kolla\/iscsid:2023.1-ubuntu-jammy                        \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes                         iscsid\n77627a749fe1   quay.io\/openstack.kolla\/prometheus-libvirt-exporter:2023.1-ubuntu-jammy   \"dumb-init --single-\u2026\"   15 minutes ago   Up 15 minutes                        prometheus_libvirt_exporter\nd9269fbd6c1b   quay.io\/openstack.kolla\/prometheus-cadvisor:2023.1-ubuntu-jammy           \"dumb-init --single-\u2026\"   15 minutes ago   Up 15 minutes                        prometheus_cadvisor\n14d2478293fc   quay.io\/openstack.kolla\/prometheus-node-exporter:2023.1-ubuntu-jammy      \"dumb-init --single-\u2026\"   15 minutes ago   Up 15 minutes                        prometheus_node_exporter\na20ab3756886   quay.io\/openstack.kolla\/cron:2023.1-ubuntu-jammy                          \"dumb-init --single-\u2026\"   15 minutes ago   Up 11 minutes                         cron\nad85243d6c75   quay.io\/openstack.kolla\/kolla-toolbox:2023.1-ubuntu-jammy                 \"dumb-init --single-\u2026\"   15 minutes ago   Up 11 minutes                         kolla_toolbox\n976a7e42f49d   quay.io\/openstack.kolla\/fluentd:2023.1-ubuntu-jammy                       \"dumb-init --single-\u2026\"   15 minutes ago   Up 11 minutes                         fluentd\n<\/code><\/pre>\n\n\n\n<p>Storage Node Containers:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker ps<\/code><\/pre>\n\n\n\n<pre class=\"scroll-box\"><code>CONTAINER ID   IMAGE                                                                  COMMAND                  CREATED        STATUS                 PORTS     NAMES\ne97f28a62dab   quay.io\/openstack.kolla\/cinder-backup:2023.1-ubuntu-jammy              \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)             cinder_backup\nab53f97af025   quay.io\/openstack.kolla\/cinder-volume:2023.1-ubuntu-jammy              \"dumb-init --single-\u2026\"   11 minutes ago    Up 11 minutes (healthy)             cinder_volume\n9fb22368d98c   quay.io\/openstack.kolla\/tgtd:2023.1-ubuntu-jammy                       \"dumb-init --single-\u2026\"   15 minutes ago   Up 15 minutes                      tgtd\n6d89f289b8ba   quay.io\/openstack.kolla\/iscsid:2023.1-ubuntu-jammy                     \"dumb-init --single-\u2026\"   15 minutes ago   Up 15 minutes                      iscsid\n42521f44e85d   quay.io\/openstack.kolla\/prometheus-cadvisor:2023.1-ubuntu-jammy        \"dumb-init --single-\u2026\"   15 minutes ago   Up 15 minutes                      prometheus_cadvisor\nd09e87ddaf81   quay.io\/openstack.kolla\/prometheus-node-exporter:2023.1-ubuntu-jammy   \"dumb-init --single-\u2026\"   15 minutes ago   Up 15 minutes                      prometheus_node_exporter\nd32fdcb737a4   quay.io\/openstack.kolla\/cron:2023.1-ubuntu-jammy                       \"dumb-init --single-\u2026\"   15 minutes ago   Up 15 minutes                      cron\n1ba5afa44662   quay.io\/openstack.kolla\/kolla-toolbox:2023.1-ubuntu-jammy              \"dumb-init --single-\u2026\"   15 minutes ago   Up 15 minutes                      kolla_toolbox\nc9217e8a1dae   quay.io\/openstack.kolla\/fluentd:2023.1-ubuntu-jammy                    \"dumb-init --single-\u2026\"   15 minutes ago   Up 15 minutes                      fluentd\n<\/code><\/pre>\n\n\n\n<p>The block storage cinder volume <\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"multinode-open-stack-post-deployment-tasks\">Multinode OpenStack Post Deployment Tasks<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"install-open-stack-command-line-administration-tools\">Install OpenStack command line administration tools<\/h4>\n\n\n\n<p>You can now install OpenStack command line administration tools. You need to do this from the virtual environment on the control node.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">source $HOME\/kolla-ansible\/bin\/activate<\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>pip install python-openstackclient -c https:\/\/releases.openstack.org\/constraints\/upper\/2023.1<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>pip install python-neutronclient -c https:\/\/releases.openstack.org\/constraints\/upper\/2023.1<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>pip install python-glanceclient -c https:\/\/releases.openstack.org\/constraints\/upper\/2023.1<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>pip install python-heatclient -c https:\/\/releases.openstack.org\/constraints\/upper\/2023.1<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"generate-open-stack-admin-credentials\">Generate OpenStack Admin Credentials<\/h4>\n\n\n\n<p>Generate OpenStack admin user credentials file (<code>openrc<\/code>) using the command below;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kolla-ansible post-deploy<\/code><\/pre>\n\n\n\n<p>This command generates the admin credentials file,&nbsp;<code><strong>\/etc\/kolla\/admin-openrc.sh<\/strong><\/code>.<\/p>\n\n\n\n<p>To be able to use OpenStack command line tools, you need to activate the credentials using the command below;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>source \/etc\/kolla\/admin-openrc.sh<\/code><\/pre>\n\n\n\n<p>You can now administer OpenStack from cli. For example, to list the currently available services on the controller node;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">openstack service list<\/pre>\n\n\n\n<pre class=\"scroll-box\"><code>+----------------------------------+-----------+----------------+\n| ID                               | Name      | Type           |\n+----------------------------------+-----------+----------------+\n| 0f7f02e155b947b1a1f9b4241b9d59ca | nova      | compute        |\n| 2d5e37c3de0d4050bed2b4d774438bcd | glance    | image          |\n| 3964a7fd68ff443ea8cbdd43bf6d7c87 | zun       | container      |\n| 399d392f39114345806383ddccd97ea1 | cinderv3  | volumev3       |\n| 51c2d69870ce4a5bbed416f910006ab5 | neutron   | network        |\n| 7eb695afcee24953afe9d2c0bdae13b0 | aodh      | alarming       |\n| 85d545bc729e4ef68350c00bfaa1dd71 | placement | placement      |\n| a816fbd9022c46aaacd3b8a1cbcee0c6 | heat-cfn  | cloudformation |\n| bd51d3dbbb304ea98cdc6f89606b618d | keystone  | identity       |\n| e329af93def14d0c850adb7a80b4597a | gnocchi   | metric         |\n| ff9b5a4ac2fb47d798c21d933f592e63 | heat      | orchestration  |\n+----------------------------------+-----------+----------------+\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"create-initial-networks-images-flavors-etc-optional\">Create Initial Networks, Images, Flavors etc [OPTIONAL]<\/h4>\n\n\n\n<p>Kolla-ansible ship with an initial script that you can use to create initial OpenStack networks, images, nova keys using <code>init-runonce<\/code> (<strong><code>kolla-ansible\/share\/kolla-ansible\/init-runonce<\/code><\/strong>) script. The script downloads a cirros image and registers it. Then it configures networking and nova quotas to allow 40 m1.small instances to be created.<\/p>\n\n\n\n<p>It is optional to use this script.<\/p>\n\n\n\n<p>If you want to use this script, you can edit it and configure your floating network, that you want your instances to use.<\/p>\n\n\n\n<p>See our guide on <a href=\"https:\/\/kifarunix.com\/how-to-configure-openstack-networks-for-internet-access\/\" target=\"_blank\" rel=\"noreferrer noopener\">how to configure OpenStack Networks for Internet Access<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"reconfiguring-the-stack\">Reconfiguring the Stack<\/h3>\n\n\n\n<p>If you want to reconfigure the stack by adding or removing services, edit the globals.yml configuration file and redoply the changes from the virtual environment.<\/p>\n\n\n\n<p>For example, after making changes on the globals config file, reconfigure the stack;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">source \/path\/to\/virtual-environment\/bin\/activate<\/pre>\n\n\n\n<p>The redeploy the changes;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">kolla-ansible -i multinode reconfigure<\/pre>\n\n\n\n<p>You can also specify the specific nodes you want to deploy changes on.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"accessing-open-stack-web-interface-horizon\">Accessing OpenStack Web Interface (Horizon)<\/h2>\n\n\n\n<p>So far so good! OpenStack is up and running. It is time we login to the web interface via the defined Kolla VIP address. We set this to 192.168.200.254 in this guide.<\/p>\n\n\n\n<p>Therefore, to access the OpenStack Horizon from the browser, use the address, <code><strong>http:\/\/192.168.200.254<\/strong><\/code>.<\/p>\n\n\n\n<p>.This should take you to OpenStack web interface login page;<\/p>\n\n\n\n<figure class=\"gb-block-image gb-block-image-199cc5d8\"><img loading=\"lazy\" decoding=\"async\" width=\"1511\" height=\"698\" class=\"gb-image gb-image-199cc5d8\" src=\"https:\/\/kifarunix.com\/wp-content\/uploads\/2023\/10\/openstack-horizon-login.png\" alt=\"Deploy Multinode OpenStack using Kolla-Ansible\" title=\"openstack-horizon-login\" srcset=\"https:\/\/kifarunix.com\/wp-content\/uploads\/2023\/10\/openstack-horizon-login.png?v=1697452665 1511w, https:\/\/kifarunix.com\/wp-content\/uploads\/2023\/10\/openstack-horizon-login-768x355.png?v=1697452665 768w\" sizes=\"(max-width: 1511px) 100vw, 1511px\" \/><\/figure>\n\n\n\n<p>Login using <code><strong>admin<\/strong><\/code> as the username.<\/p>\n\n\n\n<p>You can obtain the admin credentials from the Kolla passwords file, <code>\/etc\/kolla\/passwords.yml<\/code>. For the Horizon authentication, you need to the Keystone admin password.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">grep keystone_admin_password \/etc\/kolla\/passwords.yml<\/pre>\n\n\n\n<p>When you successfully log in, you land on OpenStack horizon dashboard.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1901\" height=\"886\" src=\"https:\/\/kifarunix.com\/wp-content\/uploads\/2023\/10\/openstack-horizon-dashboard.png\" alt=\"\" class=\"wp-image-18999\" title=\"\" srcset=\"https:\/\/kifarunix.com\/wp-content\/uploads\/2023\/10\/openstack-horizon-dashboard.png?v=1697452950 1901w, https:\/\/kifarunix.com\/wp-content\/uploads\/2023\/10\/openstack-horizon-dashboard-768x358.png?v=1697452950 768w, https:\/\/kifarunix.com\/wp-content\/uploads\/2023\/10\/openstack-horizon-dashboard-1536x716.png?v=1697452950 1536w\" sizes=\"(max-width: 1901px) 100vw, 1901px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"configure-networks-for-internet-access\">Configure Networks for Internet Access<\/h2>\n\n\n\n<p>Check the guide below on how to configure networks for internet access.<\/p>\n\n\n\n<p><a href=\"https:\/\/kifarunix.com\/how-to-configure-openstack-networks-for-internet-access\/\" target=\"_blank\" rel=\"noreferrer noopener\">How to Configure OpenStack Networks for Internet Access<\/a><\/p>\n\n\n\n<p>And that marks the end of our guide on how to deploy Multi-node OpenStack using Kolla-Ansible on Ubuntu 22.04.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"further-reading\">Further Reading<\/h2>\n\n\n\n<p><a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/intro_getting_started.html\" target=\"_blank\" rel=\"noreferrer noopener\">Getting Started with Ansible<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/docs.openstack.org\/ussuri\/admin\/\" target=\"_blank\" rel=\"noreferrer noopener\">OpenStack Administration guides<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.docker.com\/get-started\" target=\"_blank\" rel=\"noreferrer noopener\">Getting Started with Docker<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"reference\">Reference<\/h2>\n\n\n\n<p><a href=\"https:\/\/docs.openstack.org\/project-deploy-guide\/kolla-ansible\/2023.1\/quickstart.html\" target=\"_blank\" rel=\"noreferrer noopener\">OpenStack Kolla-Ansible Quick Start Guide<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"related-tutorials\">Related Tutorials<\/h2>\n\n\n\n<p><a href=\"https:\/\/kifarunix.com\/install-and-run-mariadb-as-a-docker-container\/\" target=\"_blank\" rel=\"noreferrer noopener\">Install and Run MariaDB as a Docker Container<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/kifarunix.com\/install-and-deploy-kubernetes-cluster-on-ubuntu-20-04\/\" target=\"_blank\" rel=\"noreferrer noopener\">Install and Deploy Kubernetes Cluster on Ubuntu 20.04<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/kifarunix.com\/install-and-use-docker-ce-on-centos-8\/\" target=\"_blank\" rel=\"noreferrer noopener\">Install and Use Docker CE on CentOS 8<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/kifarunix.com\/install-docker-ce-on-ubuntu-20-04\/\" target=\"_blank\" rel=\"noreferrer noopener\">Install Docker CE on Ubuntu 20.04<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this guide, you will to learn how to deploy Multinode OpenStack using Kolla-Ansible. We will be runing our OpenStack on Ubuntu 22.04 servers. Kolla<\/p>\n","protected":false},"author":10,"featured_media":19007,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"quote","meta":{"rank_math_lock_modified_date":false,"footnotes":""},"categories":[121,992,1885,1076,1077,1886],"tags":[7270,7271,7272],"class_list":["post-18209","post","type-post","status-publish","format-quote","has-post-thumbnail","hentry","category-howtos","category-automation","category-cloud-compute","category-containers","category-docker","category-openstack","tag-deploy-multinode-openstack-kolla-ansible","tag-kolla-ansible-multinode","tag-openstack-multinode","post_format-post-format-quote","generate-columns","tablet-grid-50","mobile-grid-100","grid-parent","grid-50","resize-featured-image"],"_links":{"self":[{"href":"https:\/\/kifarunix.com\/wp-json\/wp\/v2\/posts\/18209"}],"collection":[{"href":"https:\/\/kifarunix.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kifarunix.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kifarunix.com\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/kifarunix.com\/wp-json\/wp\/v2\/comments?post=18209"}],"version-history":[{"count":32,"href":"https:\/\/kifarunix.com\/wp-json\/wp\/v2\/posts\/18209\/revisions"}],"predecessor-version":[{"id":20860,"href":"https:\/\/kifarunix.com\/wp-json\/wp\/v2\/posts\/18209\/revisions\/20860"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kifarunix.com\/wp-json\/wp\/v2\/media\/19007"}],"wp:attachment":[{"href":"https:\/\/kifarunix.com\/wp-json\/wp\/v2\/media?parent=18209"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kifarunix.com\/wp-json\/wp\/v2\/categories?post=18209"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kifarunix.com\/wp-json\/wp\/v2\/tags?post=18209"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}