{"id":28335421,"url":"https://github.com/muhanedahmed/high-availability-openstack-deployment-using-kolla-ansible","last_synced_at":"2026-04-19T10:32:16.928Z","repository":{"id":294301312,"uuid":"986230969","full_name":"MuhanedAhmed/High-Availability-OpenStack-Deployment-Using-Kolla-Ansible","owner":"MuhanedAhmed","description":"This documentation outlines the step-by-step process for deploying a highly available OpenStack environment using Kolla-Ansible. The setup includes multiple controller, compute, and storage nodes arranged to ensure redundancy and fault tolerance.","archived":false,"fork":false,"pushed_at":"2025-05-19T19:26:03.000Z","size":3862,"stargazers_count":3,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-02T08:56:01.316Z","etag":null,"topics":["ansible","cloud-platform","high-availability","kolla-ansible","linux","loadbalancing","openstack","vmware"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MuhanedAhmed.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-19T09:53:26.000Z","updated_at":"2025-05-27T15:51:56.000Z","dependencies_parsed_at":"2025-05-19T20:44:28.776Z","dependency_job_id":null,"html_url":"https://github.com/MuhanedAhmed/High-Availability-OpenStack-Deployment-Using-Kolla-Ansible","commit_stats":null,"previous_names":["muhanedahmed/high-availability-openstack-deployment-using-kolla-ansible"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/MuhanedAhmed/High-Availability-OpenStack-Deployment-Using-Kolla-Ansible","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MuhanedAhmed%2FHigh-Availability-OpenStack-Deployment-Using-Kolla-Ansible","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MuhanedAhmed%2FHigh-Availability-OpenStack-Deployment-Using-Kolla-Ansible/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MuhanedAhmed%2FHigh-Availability-OpenStack-Deployment-Using-Kolla-Ansible/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MuhanedAhmed%2FHigh-Availability-OpenStack-Deployment-Using-Kolla-Ansible/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MuhanedAhmed","download_url":"https://codeload.github.com/MuhanedAhmed/High-Availability-OpenStack-Deployment-Using-Kolla-Ansible/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MuhanedAhmed%2FHigh-Availability-OpenStack-Deployment-Using-Kolla-Ansible/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32004035,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T20:23:30.271Z","status":"online","status_checked_at":"2026-04-19T02:00:07.110Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ansible","cloud-platform","high-availability","kolla-ansible","linux","loadbalancing","openstack","vmware"],"created_at":"2025-05-26T21:58:16.615Z","updated_at":"2026-04-19T10:32:16.908Z","avatar_url":"https://github.com/MuhanedAhmed.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# High Availability OpenStack Deployment Using Kolla-Ansible\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"images/OpenStack_Logo.png\" alt=\"OpenStack Logo\" width=\"500\"/\u003e\n\u003c/p\u003e\n\nThis project documents the complete process of deploying a highly available (HA) OpenStack cloud environment using **Kolla-Ansible**. The deployment includes:\n\n- Multi-node setup (controller, compute, and storage nodes)\n- Full containerization using **Docker**\n- **Galera cluster**, **HAProxy**, and **Keepalived** for HA\n- Centralized configuration using **Ansible**\n- Virtual machines provisioned with **KVM/QEMU**\n\nThe guide is designed to help DevOps engineers, cloud architects, and advanced system administrators replicate the deployment in a lab or production-ready setup.\n\n**Tested Environment:**  \n\u003e 🖥️ OS: Rocky Linux 9  \n\u003e ☁️ Cloud Stack: OpenStack `2024.2`  \n\u003e ⚙️ Tools: Kolla-Ansible, Docker, Ansible\n\n\u003e 📘 **Note:** This documentation assumes a basic understanding of Linux, networking, and Ansible.\n\n---\n\n## 🧱 Environment Overview\n\n- The deployment was performed in a virtualized lab using VMWare Workstation. \n- One base virtual machine (VM) was created and then cloned to spawn additional nodes with the appropriate roles assigned.\n- All VMs run **Rocky Linux 9.4** and share the same hardware specs initially, with modifications based on the role.\n\n\u003e 📥 **Download Rocky Linux 9.4 ISO**:  \n\u003e [https://rockylinux.org/download](https://rockylinux.org/download)\n---\n\n## 🧩 Roles of Each Node in the OpenStack Deployment\n\nThis section describes the specific responsibilities and key services hosted on each node type within the HA OpenStack cluster.\n\n\n### 🧠 Controller Node\n\n**Primary Role:**  \nThe \"brain\" of the OpenStack cluster.\n\n**Key Services:**\n- `Keystone`: Identity management\n- `Glance`: Image storage for VMs\n- `Nova API`: Compute API endpoints\n- `Horizon`: Web dashboard interface\n- `MariaDB/Galera`: Highly available database cluster\n- `RabbitMQ`: Message queuing between OpenStack services\n\n**Responsibility:**  \nHandles orchestration, authentication, database operations, and API endpoints for all OpenStack components.\n\n---\n\n### 🧮 Compute Node\n\n**Primary Role:**  \nRuns virtual machines (VMs) and provides compute resources.\n\n**Key Services:**\n- `Nova Compute`: Manages VM lifecycle (create, delete, migrate, etc.)\n- `Libvirt/KVM`: Hypervisor interface to run VMs\n\n**Responsibility:**  \nProvides vCPUs, RAM, and local storage for VMs. Compute nodes scale horizontally — adding more nodes increases cluster capacity.\n\n---\n\n### 🌐 Network Node\n\n**Primary Role:**  \nManages all networking components of the OpenStack environment.\n\n**Key Services:**\n- `Neutron`: Networking service (routers, subnets, floating IPs)\n- `L3 Agent`: Routing and NAT for VM networks\n- `DHCP Agent`: Dynamic IP assignment to VMs\n- `OVS` / `LinuxBridge`: Virtual switch to connect instances\n\n**Responsibility:**  \nEnsures full VM connectivity, external access, router/NAT functionality, and applies security group rules.\n\n---\n\n### 💾 Storage Node\n\n**Primary Role:**  \nProvides persistent storage to VMs (and optionally object storage).\n\n**Key Services:**\n- `Cinder Volume`: Block storage for VMs using LVM as the backend\n- *(Optional)* `Swift`: Object storage (not enabled in this deployment)\n\n**Responsibility:**  \nManages volumes, snapshots, and backups. In our setup, LVM aggregates additional disks into a single volume group (`cinder-volumes`) for dynamic block provisioning.\n\n\n---\n\n## 🖥️ Deployment Architecture\n\nThis section outlines the architecture of the OpenStack HA deployment, including the roles assigned to each node, their hardware specifications, and how they are organized to ensure scalability, high availability, and separation of concerns.\n\n\n| Hostname     | Role                 | IPv4            | vCPU | RAM (GB) | Storage (GB)  | Notes                       |\n|--------------|----------------------|-----------------|------|----------|---------------|-----------------------------|\n| controller01 | Controller Node      | 192.168.142.141 | 2    | 8        | 40            | Also used to deploy Kolla   |\n| controller02 | Controller Node      | 192.168.142.142 | 2    | 8        | 40            |                             |\n| controller03 | Controller Node      | 192.168.142.143 | 2    | 8        | 40            |                             |\n| compute01    | Compute Node         | 192.168.142.151 | 2    | 8        | 40            | Virtualization enabled      |\n| compute02    | Compute Node         | 192.168.142.152 | 2    | 8        | 40            | Virtualization enabled      |\n| network01    | Network Node         | 192.168.142.161 | 2    | 8        | 40            |                             |\n| network02    | Network Node         | 192.168.142.162 | 2    | 8        | 40            |                             |\n| storage01    | Storage (Cinder LVM) | 192.168.142.171 | 2    | 8        | 40 (+10 GB)   | LVM volume for Cinder       |\n| storage02    | Storage (Cinder LVM) | 192.168.142.172 | 2    | 8        | 40 (+10 GB)   | LVM volume for Cinder       |\n\n\u003e 📌 **Note:** Each VM was cloned from `controller01` and then customized (hostname, static IP, NICs, etc.).\n\n---\n\n## 🔧 VM Networking\n\nEach VM includes at least two network interfaces:\n\n- `ens160`: Internal/OpenStack management network\n- `ens192`: External network for floating IPs and external access\n\nNIC names may vary depending on the hypervisor configuration.\n\n\u003e ⚠️ **Reminder:** Always confirm NIC names using `ip a` after VM creation.\n\n\n## ⚙️ VM Creation and OS Configuration\n\nThis section covers the step-by-step creation of the base Rocky Linux VM, cloning it to form the OpenStack cluster, OS preparation, static IP setup, and SSH key configuration.\n\n\n### 🖥️ Creating and Installing Base Rocky Linux VM\n\n1. **Create a virtual machine** named `controller01` which will serve as the base image.  \n   It will be cloned later to create other nodes, and each clone will be customized.\n2. Create the VM using the previously specified hardware (e.g., 2 vCPUs, 8 GB RAM, 40 GB disk).\n\n![Screenshot 1](images/pic1.png)\n\n3. **Add another NIC** to the VM to support internal and external network separation.\n\n![Screenshot 2](images/pic2.png)\n\n![Screenshot 3](images/pic3.png)\n\n![Screenshot 4](images/pic4.png)\n\n4. Confirm the final specifications before finishing the setup.\n\n![Screenshot 5](images/pic5.png)\n\n5. Start the VM and begin installing **Rocky Linux 9.4**.\n\n![Screenshot 6](images/pic6.png)\n\n6. Choose your preferred installation language.\n\n![Screenshot 7](images/pic7.png)\n\n7. Configure installation settings:\n   - Partitioning\n   - Networking\n   - Time zone\n   - User creation\n\n![Screenshot 8](images/pic8.png)\n\n8. **Create a user named `kolla`** to be used for Kolla Ansible deployment.\n\n\n9.  **Network Configuration:**\n   - Keep **DHCP enabled** on the first NIC (we’ll assign a static IP later).\n   - **Disable IPv4** on the second NIC (e.g., `ens192`).\n\n![Screenshot 9](images/pic9.png)\n\n![Screenshot 10](images/pic10.png)\n\n   - Disable → Enable the NIC to apply settings.\n\n![Screenshot 11](images/pic11.png)\n\n10.  Finish configuration and begin the OS installation.\n\n![Screenshot 12](images/pic12.png)\n\n11.  After reboot, log in as `root` and update the system: \n   ```bash\n   sudo dnf update -y\n   ```\n\n![Screenshot 13](images/pic13.png)\n\n12.  Add the `kolla` user to the `wheel` group:\n   ```bash\n   usermod -aG wheel kolla\n   grep wheel /etc/group\n   ```\n\n![Screenshot 14](images/pic14.png)\n\n13.  Edit the sudoers file to allow passwordless sudo for the `wheel` group:\n    \n   ```bash\n   visudo\n   ```\n    \n   - Find:\n   \n   ```bash\n   %wheel  ALL=(ALL)       ALL\n   ```\n   \n   - Comment that line and uncomment:\n   ```bash\n   %wheel  ALL=(ALL)       NOPASSWD: ALL\n   ```\n\n![Screenshot 15](images/pic15.png)\n\n---\n\n### 📦 Cloning the Base VM\n\n1. Shut down the base VM (`controller01`) before cloning.\n2. Use **full independent clone** option.\n\n![Screenshot 16](images/pic16.png)\n\n![Screenshot 17](images/pic17.png)\n\n![Screenshot 18](images/pic18.png)\n\n![Screenshot 19](images/pic19.png)\n\n3. Repeat the process to create the full architecture:\n   - `controller02`, `controller03`, `compute01`, `compute02`, `network01`, `network02`, `storage01`, `storage02`.\n\n![Screenshot 20](images/pic20.png)\n\n---\n\n### 🧾 Configure Hostname and Static IP for All VMs\n\nEach VM needs a **unique hostname** and **static IP**.\n\n1. Set the hostname:\n    ```bash\n    sudo hostnamectl set-hostname \u003chostname\u003e\n    ```\n2. Validate:\n    ```bash\n    hostname\n    ```\n\n![Screenshot 21](images/pic21.png)\n\n3. Set static IP for `ens160`:\n    ```bash\n    nmcli device status\n    ```\n\n![Screenshot 22](images/pic22.png)\n\n  ```bash\n  sudo nmcli con mod ens160 ipv4.addresses 192.168.142.141/24\n  sudo nmcli con mod ens160 ipv4.gateway 192.168.142.2\n  sudo nmcli con mod ens160 ipv4.dns 192.168.142.2\n  sudo nmcli con mod ens160 ipv4.method manual\n  ```\n\n![Screenshot 23](images/pic23.png)\n\n  ```bash\n  sudo nmcli con down ens160 \u0026\u0026 sudo nmcli con up ens160\n  ip a show ens160\n  ```\n\n![Screenshot 26](images/pic26.png)\n\nRepeat for each VM with appropriate IP and hostname.\n\n---\n\n### 📁 Configure `/etc/hosts` on `controller01`\n\n- This node will act as the Kolla-Ansible deployment host. \n- This file ensures all nodes in the cluster can be referenced by hostname during the Kolla Ansible deployment.\n- DNS entries in other nodes will be taken care by Ansible.\n\n\n1. Open the hosts file:\n    ```bash\n    sudo nano /etc/hosts\n    ```\n\n![Screenshot 27](images/pic27.png)\n\n2. Add these entries:\n    ```text\n    192.168.142.141 controller01\n    192.168.142.142 controller02\n    192.168.142.143 controller03\n    192.168.142.151 compute01\n    192.168.142.152 compute02\n    192.168.142.161 network01\n    192.168.142.162 network02\n    192.168.142.171 storage01\n    192.168.142.172 storage02\n    ```\n\n![Screenshot 28](images/pic28.png)\n\n3. Test reachability:\n    ```bash\n    for host in controller01 controller02 controller03 compute01 compute02 network01 network02 storage01 storage02; do\n      ping -c 1 $host \u003e/dev/null \u0026\u0026 echo \"$host is reachable\" || echo \"$host is NOT reachable\"\n    done\n    ```\n\n![Screenshot 29](images/pic29.png)\n\n---\n\n### 🧬 Enable Virtualization on Compute VMs\n\n1. Open VM settings for each **compute node**.\n\n![Screenshot 30](images/pic30.png)\n\n2. Enable virtualization in the hardware settings.\n\n![Screenshot 31](images/pic31.png)\n\n3. Repeat for `compute02`.\n\n---\n\n### 💽 Attach New Disk to Storage VMs (for Cinder LVM)\n\n1. Add a new virtual disk (20GB or more) to each **storage node**.\n\n![Screenshot 32](images/pic32.png)\n\n![Screenshot 33](images/pic33.png)\n\n![Screenshot 34](images/pic34.png)\n\n![Screenshot 35](images/pic35.png)\n\n![Screenshot 36](images/pic36.png)\n\n2. Verify:\n    ```bash\n    lsblk\n    ```\n\n![Screenshot 37](images/pic37.png)\n\n3. Initialize and configure LVM:\n    ```bash\n    sudo pvcreate /dev/nvme0n2\n    sudo vgcreate cinder-volumes /dev/nvme0n2\n    sudo vgs\n    ```\n\n![Screenshot 38](images/pic38.png)\n\n4. Repeat on `storage02`.\n\n---\n\n### 🔐 Generate SSH Keys for `kolla` User\n\nNow, we will generate an SSH key for the `kolla` user on `controller01` and copy the public key to all other nodes under the same user (`kolla`). This is essential for password less SSH access, which Kolla Ansible uses to operate on remote nodes.\n\n\n1. Log in as `kolla` on `controller01`.\n\n2. Generate key pair:\n    ```bash\n    ssh-keygen -t rsa -b 4096 -N \"\" -f ~/.ssh/id_rsa\n    ```\n\n![Screenshot 39](images/pic39.png)\n\n3. Copy public key to all nodes:\n    ```bash\n    for host in controller01 controller02 controller03 compute01 compute02 network01 network02 storage01 storage02; do\n      ssh-copy-id kolla@$host\n    done\n    ```\n\n\u003e 📌 You’ll be prompted for the `kolla` user password on each host.\n\n4. Test:\n    ```bash\n    ssh kolla@controller03\n    ```\n\n![Screenshot 40](images/pic40.png)\n\n---\n\n## 🚀 Installing OpenStack with Kolla-Ansible\n\nAll the following steps are executed on the **deployment node** (`controller01`), which orchestrates the entire OpenStack environment using **Kolla Ansible**.\n\n---\n\n### 📦 Install Dependencies\n\n1. **Update system packages:**\n\n   ```bash\n   sudo dnf update -y\n   ```\n\n2. **Install Python build dependencies:**\n\n   ```bash\n   sudo dnf install git python3-devel libffi-devel gcc openssl-devel python3-libselinux -y\n   ```\n\n![Screenshot 41](images/pic41.png)\n\n3. **Install Ansible:**\n\n   ```bash\n   sudo pip3 install ansible-core\n   ```\n\n![Screenshot 42](images/pic42.png)\n\n   \u003e ⚠️ If you face a `PATH` warning, update your shell configuration:\n\n![Screenshot 43](images/pic43.png)\n\n   ```bash\n   nano ~/.bashrc\n   # Add this line\n   export PATH=\"/usr/local/bin:$PATH\"\n   source ~/.bashrc\n   ```\n\n---\n\n### 🧰 Install Kolla Ansible\n\n1. **Install `kolla-ansible` via pip:**\n\n   ```bash\n   sudo pip3 install kolla-ansible\n   ```\n\n![Screenshot 44](images/pic44.png)\n\n2. **Create the configuration directory:**\n\n   ```bash\n   sudo mkdir -p /etc/kolla\n   sudo chown $USER:$USER /etc/kolla\n   ```\n\n![Screenshot 45](images/pic45.png)\n\n3. **Copy example config files:**\n\n   ```bash\n   cp -r /usr/local/share/kolla-ansible/etc_examples/kolla/* /etc/kolla/\n   ```\n\n![Screenshot 46](images/pic46.png)\n\n4. **Copy the multinode inventory file to the current directory:**\n\n   ```bash\n   cp /usr/local/share/kolla-ansible/ansible/inventory/multinode .\n   ```\n\n   \u003e ℹ️ We're using **multinode** to deploy a highly available OpenStack setup across multiple nodes.\n\n![Screenshot 47](images/pic47.png)\n\n5. **Install Ansible Galaxy dependencies:**\n\n   ```bash\n   kolla-ansible install-deps\n   ```\n\n![Screenshot 48](images/pic48.png)\n\n---\n\n### ⚙️ Configure Main Files\n\n#### `globals.yml`\n\n* **Path:** `/etc/kolla/globals.yml`\n* **Purpose:** Main config file for customizing OpenStack deployment.\n\n```bash\nnano /etc/kolla/globals.yml\n```\n\nPaste the following configuration:\n\n\u003cdetails\u003e\n\u003csummary\u003e🔽 Click to Expand `globals.yml` Example\u003c/summary\u003e\n\n```yaml\n##########################\n# General Configuration\n##########################\nconfig_strategy: \"COPY_ALWAYS\"\nkolla_base_distro: \"rocky\"\nopenstack_release: \"2024.2\"\nnetwork_address_family: \"ipv4\"\nkolla_container_engine: docker\ndocker_configure_for_zun: \"yes\"\ncontainerd_configure_for_zun: \"yes\"\ndocker_apt_package_pin: \"5:20.*\"\n\n##########################\n# Network Configuration\n##########################\nnetwork_interface: \"ens160\"\nneutron_external_interface: \"ens192\"\nkolla_internal_vip_address: \"192.168.142.250\"\n\n##########################\n# OpenStack Core Services\n##########################\nenable_openstack_core: \"yes\"\nenable_keystone: \"{{ enable_openstack_core | bool }}\"\nenable_glance: \"{{ enable_openstack_core | bool }}\"\nenable_nova: \"{{ enable_openstack_core | bool }}\"\nenable_neutron: \"{{ enable_openstack_core | bool }}\"\nenable_heat: \"{{ enable_openstack_core | bool }}\"\nenable_horizon: \"{{ enable_openstack_core | bool }}\"\n\n##########################\n# Networking Plugin\n##########################\nneutron_plugin_agent: \"openvswitch\"\nenable_kuryr: \"yes\"\n\n##########################\n# High Availability\n##########################\nenable_haproxy: \"yes\"\nenable_keepalived: \"{{ enable_haproxy | bool }}\"\n\n##########################\n# Database \u0026 Messaging\n##########################\nenable_mariadb: \"yes\"\nenable_memcached: \"yes\"\nenable_etcd: \"yes\"\n\n##########################\n# Telemetry \u0026 Monitoring\n##########################\nenable_ceilometer: \"yes\"\nenable_aodh: \"yes\"\nenable_gnocchi: \"yes\"\nenable_gnocchi_statsd: \"yes\"\nenable_prometheus: \"yes\"\nenable_grafana: \"yes\"\n\n##########################\n# Block Storage (Cinder)\n##########################\nenable_cinder: \"yes\"\nenable_cinder_backend_lvm: \"yes\"\ncinder_volume_group: \"cinder-volumes\"\n\n##########################\n# Containerized Application Services\n##########################\nenable_zun: \"yes\"\nenable_horizon_zun: \"{{ enable_zun | bool }}\"\n\n##########################\n# Image Service Configuration (Glance)\n##########################\nglance_backend_file: \"yes\"\nglance_file_datadir_volume: \"/mnt/glance\"\n```\n\n\u003c/details\u003e\n\n---\n\n#### `passwords.yml`\n\n* **Path:** `/etc/kolla/passwords.yml`\n* **Purpose:** Stores auto-generated or custom passwords for all OpenStack services.\n* **Generate it with:**\n\n  ```bash\n  kolla-genpwd\n  ```\n\n![Screenshot 49](images/pic49.png)\n\n---\n\n#### `multinode` Inventory File\n\n* Defines node roles and groups for the Ansible deployment.\n\n```ini\n[control]\ncontroller01\ncontroller02\ncontroller03\n\n[network]\nnetwork01\nnetwork02\n\n[compute]\ncompute01\ncompute02\n\n[monitoring]\ncontroller01\n\n[storage]\nstorage01\nstorage02\n\n[all:vars]\nansible_user=kolla\nansible_become=True\n\n[deployment]\nlocalhost ansible_connection=local\n```\n\n---\n\n### 📤 Deploy OpenStack\n\n1. **Bootstrap the servers:**\n\n   ```bash\n   kolla-ansible bootstrap-servers -i ./multinode\n   ```\n\n![Screenshot 50](images/pic50.png)\n\n2. **Run pre-deployment checks:**\n\n   ```bash\n   kolla-ansible prechecks -i ./multinode\n   ```\n\n![Screenshot 51](images/pic51.png)\n\n3. **Deploy OpenStack:**\n\n   ```bash\n   kolla-ansible deploy -i ./multinode\n   ```\n\n![Screenshot 52](images/pic52.png)\n\n4. **Validate service configurations:**\n\n   ```bash\n   kolla-ansible validate-config -i ./multinode\n   ```\n\n![Screenshot 53](images/pic53.png)\n\n---\n\n### 🧪 Using OpenStack After Deployment\n\n1. **Post-deployment config (generates `clouds.yaml`):**\n\n   ```bash\n   kolla-ansible post-deploy\n   ```\n\n![Screenshot 54](images/pic54.png)\n\n2. **Verify clouds.yaml file:**\n\n   ```bash\n   ls /etc/kolla/clouds.yaml\n   ```\n\n![Screenshot 55](images/pic55.png)\n\n3. **Install OpenStack CLI:**\n\n   ```bash\n   pip install python-openstackclient -c https://releases.openstack.org/constraints/upper/master\n   ```\n\n4. **Test the deployment:**\n\n- Try to list the services:\n\n```bash\nopenstack service list\n```\n\n![Screenshot 56](images/pic56.png)\n\n- Source OpenStack admin credentials file (`admin-openrc.sh`) that allows you to interact with the OpenStack CLI\n\n```bash\nsource /etc/kolla/admin-openrc.sh\n```\n\n![Screenshot 57](images/pic57.png)\n\n- Check the status of compute nodes:\n\n```bash\nopenstack compute service list\n```\n\n![Screenshot 58](images/pic58.png)\n\n5. **Access Horizon Dashboard:**\n   Open your browser and visit:\n   `http://192.168.142.250`\n\n   Login credentials:\n\n   * **Username:** `admin`\n   * **Password:** (find it using)\n\n     ```bash\n     grep keystone_admin_password /etc/kolla/passwords.yml\n     ```\n\n![Screenshot 59](images/pic59.png)\n\n![Screenshot 60](images/pic60.png)\n\n![Screenshot 61](images/pic61.png)\n\n---\n\n### 🧪 (Optional) Setup Demo Environment\n\n```bash\n/usr/local/share/kolla-ansible/init-runonce\n```\n\n![Screenshot 62](images/pic62.png)\n\n---\n\n### 🖧 Explore Running Services on Nodes\n\nExample Services by Role:\n\n#### Storage Node (`storage02`)\n\n* `cinder_backup`, `cinder_volume`, `iscsid`\n* `prometheus_cadvisor`, `fluentd`\n\n![Screenshot 63](images/pic63.png)\n\n#### Network Node (`network01`)\n\n* `neutron_l3_agent`, `neutron_dhcp_agent`, `neutron_openvswitch_agent`\n* `keepalived`, `haproxy`\n\n![Screenshot 64](images/pic64.png)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmuhanedahmed%2Fhigh-availability-openstack-deployment-using-kolla-ansible","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmuhanedahmed%2Fhigh-availability-openstack-deployment-using-kolla-ansible","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmuhanedahmed%2Fhigh-availability-openstack-deployment-using-kolla-ansible/lists"}