From c93f414287ca7a146f1c81ec82868a5ddc3d31f2 Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Mon, 30 Jun 2025 11:03:50 +0000 Subject: [PATCH 01/38] manual installation of glance openstack component --- playbooks/glance/glance-setup.sh | 198 +++++++++++++++++++++++++++++ playbooks/glance/keystone-setup.sh | 125 ++++++++++++++++++ 2 files changed, 323 insertions(+) create mode 100755 playbooks/glance/glance-setup.sh create mode 100755 playbooks/glance/keystone-setup.sh diff --git a/playbooks/glance/glance-setup.sh b/playbooks/glance/glance-setup.sh new file mode 100755 index 00000000..2de36786 --- /dev/null +++ b/playbooks/glance/glance-setup.sh @@ -0,0 +1,198 @@ +#!/bin/bash +set -euo pipefail + +# Temporarily disable exit on unbound variables to suppress RC_DIR unbound variable errors +set +u +unset RC_DIR || true +unset DEVSTACK_DIR || true +set -u + +NEW_MYSQL_ROOT_PASS="newpassword" +GLANCE_DB_PASS="GlancePass123!" +GLANCE_USER_PASS="GlancePass123!" +CONTROLLER_HOST=localhost +KEYSTONE_PORT=5001 # Keystone runs on this port +KEYSTONE_ADMIN_PASS="admin" # MUST match Keystone bootstrap password + +is_mysql_installed() { + command -v mysql >/dev/null 2>&1 +} + +can_mysql_root_no_password() { + sudo mysql -u root -e "SELECT 1;" >/dev/null 2>&1 +} + +can_mysql_root_with_password() { + sudo mysql -u root -p"${NEW_MYSQL_ROOT_PASS}" -e "SELECT 1;" >/dev/null 2>&1 +} + +keystone_is_up() { + curl -s -o /dev/null -w "%{http_code}" http://${CONTROLLER_HOST}:${KEYSTONE_PORT}/v3 | grep -qE "200|300" +} + +openstack_auth_is_valid() { + export OS_USERNAME=admin + export OS_PASSWORD=${KEYSTONE_ADMIN_PASS} + export OS_PROJECT_NAME=admin + export OS_AUTH_URL=http://${CONTROLLER_HOST}:${KEYSTONE_PORT}/v3 + export OS_USER_DOMAIN_NAME=Default + export OS_PROJECT_DOMAIN_NAME=Default + export OS_IDENTITY_API_VERSION=3 + + openstack token issue >/dev/null 2>&1 +} + +echo "==> Checking if MySQL is installed..." + +if ! is_mysql_installed; then + echo "MySQL not installed. Installing MariaDB and dependencies..." + sudo DEBIAN_FRONTEND=noninteractive apt update + sudo DEBIAN_FRONTEND=noninteractive apt install -y mariadb-server python3-pymysql || true + sudo systemctl enable mariadb + sudo systemctl start mariadb + + echo "Setting MySQL root password (initial no-password access)..." + sudo mysql -u root < Creating Glance database and user..." +sudo mysql -u root -p"${NEW_MYSQL_ROOT_PASS}" < Installing Glance and dependencies..." +sudo DEBIAN_FRONTEND=noninteractive apt install -y glance python3-glanceclient apache2 libapache2-mod-wsgi-py3 crudini + +echo "==> Checking for OpenStack client..." +if ! command -v openstack >/dev/null 2>&1; then + echo "Installing python3-openstackclient..." + sudo apt update + sudo apt install -y python3-openstackclient +fi + +echo "==> Checking if Keystone is up..." +if ! keystone_is_up; then + echo "ERROR: Keystone service is not reachable at http://${CONTROLLER_HOST}:${KEYSTONE_PORT}/v3." + echo "Please start Keystone before running this script." + echo "To avoid RC_DIR errors, consider running this script via:" + echo " env -i bash --noprofile --norc ./glance-setup.sh" + exit 1 +fi + +echo "==> Validating OpenStack authentication..." +if ! openstack_auth_is_valid; then + echo "ERROR: Unable to authenticate to Keystone at http://${CONTROLLER_HOST}:${KEYSTONE_PORT}/v3." + echo "Please check your OS_USERNAME, OS_PASSWORD, and Keystone bootstrap password." + echo "Ensure Keystone was bootstrapped with password '${KEYSTONE_ADMIN_PASS}'." + exit 1 +fi + +# Ensure 'service' project exists (fix for 'No project with a name or ID of service exists' error) +if ! openstack project show service >/dev/null 2>&1; then + echo "Creating 'service' project in Keystone..." + openstack project create --domain default service +fi + +echo "==> Setting OpenStack environment variables for Glance registration..." +export OS_USERNAME=admin +export OS_PASSWORD=${KEYSTONE_ADMIN_PASS} +export OS_PROJECT_NAME=admin +export OS_AUTH_URL=http://${CONTROLLER_HOST}:${KEYSTONE_PORT}/v3 +export OS_USER_DOMAIN_NAME=Default +export OS_PROJECT_DOMAIN_NAME=Default +export OS_IDENTITY_API_VERSION=3 + +echo "==> Registering Glance with Keystone..." +if ! openstack user show glance >/dev/null 2>&1; then + openstack user create --domain default --password "$GLANCE_USER_PASS" glance +fi + +openstack role add --project service --user glance admin || true + +if ! openstack service show image >/dev/null 2>&1; then + openstack service create --name glance --description "OpenStack Image" image +fi + +if ! openstack endpoint list | grep -q glance; then + openstack endpoint create --region RegionOne image public "http://${CONTROLLER_HOST}:9292" + openstack endpoint create --region RegionOne image internal "http://${CONTROLLER_HOST}:9292" + openstack endpoint create --region RegionOne image admin "http://${CONTROLLER_HOST}:9292" +fi + +echo "==> Configuring Glance..." +sudo crudini --set /etc/glance/glance-api.conf database connection "mysql+pymysql://glance:${GLANCE_DB_PASS}@localhost/glance" + +sudo crudini --set /etc/glance/glance-api.conf keystone_authtoken www_authenticate_uri "http://${CONTROLLER_HOST}:${KEYSTONE_PORT}" +sudo crudini --set /etc/glance/glance-api.conf keystone_authtoken auth_url "http://${CONTROLLER_HOST}:${KEYSTONE_PORT}" +sudo crudini --set /etc/glance/glance-api.conf keystone_authtoken memcached_servers "${CONTROLLER_HOST}:11211" +sudo crudini --set /etc/glance/glance-api.conf keystone_authtoken auth_type password +sudo crudini --set /etc/glance/glance-api.conf keystone_authtoken project_domain_name Default +sudo crudini --set /etc/glance/glance-api.conf keystone_authtoken user_domain_name Default +sudo crudini --set /etc/glance/glance-api.conf keystone_authtoken project_name service +sudo crudini --set /etc/glance/glance-api.conf keystone_authtoken username glance +sudo crudini --set /etc/glance/glance-api.conf keystone_authtoken password "${GLANCE_USER_PASS}" + +sudo crudini --set /etc/glance/glance-api.conf glance_store stores "file,http" +sudo crudini --set /etc/glance/glance-api.conf glance_store default_store "file" +sudo crudini --set /etc/glance/glance-api.conf glance_store filesystem_store_datadir "/var/lib/glance/images/" + +echo "==> Migrating Glance database..." +sudo glance-manage db_sync + +echo "==> Enabling and starting Glance service..." +sudo systemctl enable glance-api +sudo systemctl restart glance-api + +echo "==> Waiting for Glance API to start and respond on port 9292..." +for i in {1..30}; do + if curl -s http://localhost:9292/v2 >/dev/null 2>&1; then + echo "Glance API is up!" + break + else + echo "Waiting for Glance API... ($i/30)" + sleep 2 + fi +done + +if ! curl -s http://localhost:9292/v2 >/dev/null 2>&1; then + echo "ERROR: Glance API did not start properly. Exiting." + exit 1 +fi + +echo "==> Downloading and uploading test image (cirros)..." +wget -q http://download.cirros-cloud.net/0.6.2/cirros-0.6.2-x86_64-disk.img || true + +if ! openstack image list | grep -q cirros; then + openstack image create "cirros" \ + --file cirros-0.6.2-x86_64-disk.img \ + --disk-format qcow2 --container-format bare \ + --public +fi + +echo "✅ Glance is fully installed, configured, and ready." diff --git a/playbooks/glance/keystone-setup.sh b/playbooks/glance/keystone-setup.sh new file mode 100755 index 00000000..a6e37c83 --- /dev/null +++ b/playbooks/glance/keystone-setup.sh @@ -0,0 +1,125 @@ +#!/bin/bash +set -e + +# === CONFIGURATION === + +MYSQL_ROOT_PASS="newpassword" +KEYSTONE_DB_PASS="keystone_db_pass" +ADMIN_TOKEN="ADMIN" +CONTROLLER_HOST="localhost" +KEYSTONE_PORT=5001 # Changed port to avoid conflicts + +# === FUNCTIONS === +function install_if_missing { + PKG="$1" + if ! dpkg -s "$PKG" >/dev/null 2>&1; then + echo "Installing $PKG..." + sudo apt install -y "$PKG" + else + echo "$PKG is already installed." + fi +} + +function ensure_mysql_root_password { + echo "==> Checking MySQL root access..." + if mysql -u root -e "exit" 2>/dev/null; then + echo "✅ No MySQL root password yet, setting it..." + sudo mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASS}'; FLUSH PRIVILEGES;" + elif mysql -u root -p"${MYSQL_ROOT_PASS}" -e "exit" 2>/dev/null; then + echo "✅ MySQL root password already set and valid." + else + echo "❌ Could not access MySQL as root. Exiting." + exit 1 + fi +} + +function create_keystone_db { + echo "==> Configuring Keystone database..." + sudo mysql -u root -p"${MYSQL_ROOT_PASS}" < Installing MariaDB and Keystone packages..." +sudo apt update + +install_if_missing mariadb-server +install_if_missing python3-pymysql +install_if_missing keystone +install_if_missing apache2 +install_if_missing libapache2-mod-wsgi-py3 +install_if_missing crudini + +# Enable and start MariaDB +sudo systemctl enable mariadb +sudo systemctl start mariadb + +# Set MySQL root password if needed +ensure_mysql_root_password + +# Create Keystone DB and user +create_keystone_db + +# Update keystone.conf +echo "==> Updating keystone.conf..." +sudo crudini --set /etc/keystone/keystone.conf database connection "mysql+pymysql://keystone:${KEYSTONE_DB_PASS}@localhost/keystone" +sudo crudini --set /etc/keystone/keystone.conf token provider fernet +sudo crudini --set /etc/keystone/keystone.conf DEFAULT admin_token "${ADMIN_TOKEN}" + +# DB Sync +echo "==> Syncing Keystone DB..." +sudo keystone-manage db_sync + +# Fernet keys +echo "==> Initializing Fernet keys..." +sudo keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone +sudo keystone-manage credential_setup --keystone-user keystone --keystone-group keystone + +# Bootstrap Keystone with new port +echo "==> Bootstrapping Keystone..." +sudo keystone-manage bootstrap --bootstrap-password admin \ + --bootstrap-admin-url http://${CONTROLLER_HOST}:${KEYSTONE_PORT}/v3/ \ + --bootstrap-internal-url http://${CONTROLLER_HOST}:${KEYSTONE_PORT}/v3/ \ + --bootstrap-public-url http://${CONTROLLER_HOST}:${KEYSTONE_PORT}/v3/ \ + --bootstrap-region-id RegionOne + +# Add Listen directive to ports.conf if missing +if ! sudo grep -q "^Listen ${KEYSTONE_PORT}$" /etc/apache2/ports.conf; then + echo "==> Adding Listen ${KEYSTONE_PORT} to /etc/apache2/ports.conf..." + echo "Listen ${KEYSTONE_PORT}" | sudo tee -a /etc/apache2/ports.conf +fi + +# Disable old conflicting site if exists +if sudo a2query -s keystone.conf >/dev/null 2>&1; then + echo "==> Disabling old Keystone site keystone.conf..." + sudo a2dissite keystone.conf +fi + +# Write Apache WSGI config for Keystone without Listen directive (only ) +echo "==> Writing Apache WSGI config for Keystone..." +cat </dev/null + + WSGIDaemonProcess keystone processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP} + WSGIProcessGroup keystone + WSGIScriptAlias / /usr/bin/keystone-wsgi-public + ErrorLogFormat "%{cu}t %M" + ErrorLog /var/log/apache2/keystone_error.log + CustomLog /var/log/apache2/keystone_access.log combined + +EOF + +echo "==> Enabling Keystone Apache site and restarting Apache..." +sudo a2ensite wsgi-keystone.conf + +sudo systemctl restart apache2 || { + echo "❌ Apache failed to start. Check config!" + sudo apachectl configtest + exit 1 +} + +echo "✅ Keystone installation complete!" From 859fccea09b45746a080151e21d0385a5f1e8516 Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Mon, 30 Jun 2025 13:22:40 +0100 Subject: [PATCH 02/38] glance openstack component installation using ansible --- playbooks/docs/glance-ansible_docs.md | 243 ++++++++++++++++++ playbooks/glance-ansible/glance.yaml | 6 + playbooks/glance-ansible/inventory.ini | 0 .../roles/glance/defaults/main.yaml | 0 .../roles/glance/task/main.yaml | 0 .../roles/keystone/defaults/main.yaml | 0 .../roles/keystone/task/main.yaml | 0 playbooks/glance/glance-setup.sh | 198 -------------- playbooks/glance/keystone-setup.sh | 125 --------- 9 files changed, 249 insertions(+), 323 deletions(-) create mode 100644 playbooks/docs/glance-ansible_docs.md create mode 100644 playbooks/glance-ansible/glance.yaml create mode 100644 playbooks/glance-ansible/inventory.ini create mode 100644 playbooks/glance-ansible/roles/glance/defaults/main.yaml create mode 100644 playbooks/glance-ansible/roles/glance/task/main.yaml create mode 100644 playbooks/glance-ansible/roles/keystone/defaults/main.yaml create mode 100644 playbooks/glance-ansible/roles/keystone/task/main.yaml delete mode 100755 playbooks/glance/glance-setup.sh delete mode 100755 playbooks/glance/keystone-setup.sh diff --git a/playbooks/docs/glance-ansible_docs.md b/playbooks/docs/glance-ansible_docs.md new file mode 100644 index 00000000..0c6520e8 --- /dev/null +++ b/playbooks/docs/glance-ansible_docs.md @@ -0,0 +1,243 @@ +# OpenStack Glance Deployment Using Ansible +### Comprehensive Documentation and Architecture Explanation + +--- + +## Table of Contents + +- [Introduction](#introduction) +- [OpenStack Architecture Context](#openstack-architecture-context) +- [Project Overview](#project-overview) +- [Pre-requisites and Environment](#pre-requisites-and-environment) +- [Project Structure](#project-structure) +- [Detailed Configuration Variables](#detailed-configuration-variables) +- [Role Breakdown and Workflow](#role-breakdown-and-workflow) + - [Keystone Role (Identity Service)](#keystone-role-identity-service) + - [Glance Role (Image Service)](#glance-role-image-service) +- [How the Ansible Playbook Operates](#how-the-ansible-playbook-operates) +- [Key Components and Concepts](#key-components-and-concepts) +- [Security Considerations](#security-considerations) +- [Post-Installation Verification](#post-installation-verification) +- [Extending and Customizing](#extending-and-customizing) +- [Troubleshooting Guide](#troubleshooting-guide) +- [References](#references) + +--- + +## Introduction + +This document details the automated installation and configuration of OpenStack's **Keystone** (identity service) and **Glance** (image service) components using Ansible. It provides a modular, idempotent, and reusable approach that simplifies deploying these critical cloud infrastructure services, ensuring they are correctly configured, secured, and integrated. + +--- + +## OpenStack Architecture Context + +OpenStack is composed of loosely coupled services that provide infrastructure-as-a-service (IaaS). Two essential components covered here are: + +- **Keystone:** The central authentication and authorization system. Every other OpenStack service depends on Keystone for identity management. +- **Glance:** The image service managing VM disk images used to provision instances. + +Glance requires Keystone to authenticate users and services securely. Therefore, Keystone must be installed and operational before deploying Glance. + +--- + +## Project Overview + +This Ansible project aims to: + +- **Automate installation** of Keystone and Glance along with their dependencies. +- **Configure database access** via MariaDB with securely managed credentials. +- **Set up Keystone** with secure tokens and proper Apache WSGI integration. +- **Configure Glance** to authenticate with Keystone and store images on local filesystem. +- **Register services and endpoints** in Keystone to enable integration across OpenStack components. +- **Deploy a minimal test image** to validate the Glance installation. + +--- + +## Pre-requisites and Environment + +- A fresh or clean **Ubuntu/Debian** system with root/sudo access. +- Ansible (version 2.9 or higher recommended) installed locally. +- Network connectivity to fetch packages and cloud images. +- Sufficient permissions to install packages, manage services, and configure Apache. + +--- + +## Project Structure + +The project follows best practices for Ansible roles, structured as: + +glance-ansible/ +├── inventory.ini # Defines target hosts (default: localhost) +├── glance.yml # Main playbook orchestrating Keystone & Glance roles +└── roles/ + ├── keystone/ # Keystone role (identity service) + │ ├── defaults/main.yml # Default variables for Keystone + │ └── tasks/main.yml # Keystone installation & configuration steps + └── glance/ # Glance role (image service) + ├── defaults/main.yml # Default variables for Glance + └── tasks/main.yml # Glance installation & configuration steps + + +- `inventory.ini`: Defines target hosts (in this case, localhost as controller node). +- `glance.yml`: Main playbook invoking both Keystone and Glance roles in proper sequence. +- `roles/keystone`: Automates Keystone installation and configuration. +- `roles/glance`: Automates Glance installation and configuration, depending on Keystone. + +--- + +## Detailed Configuration Variables + +Each role contains default variables for easy customization: + +| Variable | Description | Default Value | +|----------------------------|--------------------------------------------------------------|----------------------| +| `mysql_root_password` | Root password for MariaDB/MySQL server | `newpassword` | +| `keystone_db_password` | Database password for Keystone's MySQL user | `keystone_db_pass` | +| `admin_token` | Initial Keystone admin token used internally during bootstrap | `ADMIN` | +| `controller_host` | Hostname/IP where OpenStack services run | `localhost` | +| `keystone_port` | HTTP port Keystone listens on | `5001` | +| `glance_db_pass` | Database password for Glance's MySQL user | `GlancePass123!` | +| `glance_user_pass` | Password for the Glance user within Keystone | `GlancePass123!` | +| `keystone_admin_pass` | Password used to bootstrap Keystone admin user | `admin` | + +> **Security Tip:** Replace default passwords with strong secrets before deploying to production. + +--- + +## Role Breakdown and Workflow + +### Keystone Role (Identity Service) + +**Purpose:** Set up Keystone to manage authentication for OpenStack. + +- **Package Installation:** Installs MariaDB, Keystone, Apache2, WSGI modules, and configuration helpers. +- **Database Setup:** Creates `keystone` database and user with restricted privileges. +- **Configuration:** Updates Keystone's config file with DB connection string, token provider (`fernet`), and admin token. +- **Database Sync:** Runs `keystone-manage db_sync` to create schema. +- **Key Setup:** Generates encryption keys for secure token management. +- **Bootstrap:** Initializes Keystone with admin credentials and endpoint URLs. +- **Apache Configuration:** Configures Apache with WSGI to serve Keystone on a dedicated port (`5001`). Ensures the site is enabled and Apache restarted. + +### Glance Role (Image Service) + +**Purpose:** Set up Glance for image management, relying on Keystone for authentication. + +- **Package Installation:** Installs Glance service, client tools, Apache2, WSGI modules, and utilities like `crudini` and `wget`. +- **Database Setup:** Ensures MariaDB root password is set; creates `glance` DB and user. +- **Configuration:** Configures `glance-api.conf` with DB connection and Keystone authentication details. +- **Database Sync:** Runs `glance-manage db_sync` to prepare database schema. +- **Service Management:** Enables and starts `glance-api` service. +- **Service Availability:** Polls Glance API endpoint until service is ready. +- **Keystone Integration:** + - Creates OpenStack user and service project if missing. + - Registers Glance service and API endpoints (public, internal, admin). +- **Image Upload:** Downloads Cirros test image and uploads it into Glance for verification. + +--- + +## How the Ansible Playbook Operates + +1. **Playbook Entry Point:** + The playbook (`glance.yml`) runs on the controller host and applies Keystone role first, ensuring the identity service is ready. + +2. **Idempotency:** + All tasks are written to be idempotent, meaning repeated runs will not cause errors or redundant changes. + +3. **Sequential Execution:** + Glance role only runs after Keystone is installed and accessible, preventing race conditions and dependency failures. + +4. **Variable-driven Configuration:** + Passwords, hostnames, ports, and other parameters are abstracted into variables for easy environment adaptation. + +5. **Service Registration:** + OpenStack users, projects, services, and endpoints are registered via CLI commands executed with appropriate OpenStack environment variables exported dynamically. + +6. **Service Availability Checks:** + The playbook waits and checks for the Glance API endpoint to be responsive before proceeding to image upload, ensuring system readiness. + +--- + +## Key Components and Concepts + +- **MariaDB:** Backend database storing persistent data for Keystone and Glance. +- **Fernet Tokens:** Secure symmetric encryption tokens used by Keystone for identity tokens. +- **WSGI and Apache:** Web server and gateway interface to serve Keystone and Glance APIs. +- **`crudini`:** Command-line utility to modify `.ini` configuration files reliably. +- **OpenStack CLI (`openstack`):** Used for managing Keystone users, roles, services, and images. +- **Cirros Image:** Minimal cloud image used as a functional test for the Glance service. + +--- + +## Security Considerations + +- Change default passwords before deploying in production environments. +- Protect the Keystone and Glance API endpoints using firewall rules and HTTPS with valid certificates. +- Secure MariaDB with restricted network access and strong authentication. +- Manage Fernet key rotations periodically to ensure token security. +- Limit user privileges to least required for operations. + +--- + +## Post-Installation Verification + +To verify a successful deployment: + +1. **Export OpenStack Credentials:** + +```bash +export OS_USERNAME=admin +export OS_PASSWORD=admin +export OS_PROJECT_NAME=admin +export OS_USER_DOMAIN_NAME=Default +export OS_PROJECT_DOMAIN_NAME=Default +export OS_AUTH_URL=http://localhost:5001/v3 +export OS_IDENTITY_API_VERSION=3 +``` +2. **Check Keystone Status** + +```bash +openstack token issue +```` + +3. **List Keystoone Image** + +```sh +openstack image list +``` + +Look for the 'cirros' image uploaded by the playbook. + +## Extending and Customizing + +- Add roles for other OpenStack services like Nova (compute), Neutron (networking), Cinder (block storage). + +- Change Glance backend storage from local filesystem to Swift or Ceph. + +- Configure HTTPS with SSL certificates for Apache. + +- Integrate with external authentication backends (LDAP, OAuth). + +- Automate multi-node OpenStack deployments. + +## Troubleshooting Guide + +| Issue | Diagnostic Steps | Resolution Suggestions | +|-------------------------------|--------------------------------------------------|------------------------------------------------| +| Keystone API not reachable | Check Apache and Keystone logs | Restart services, verify configs and firewall | +| MariaDB connection errors | Attempt to connect manually with `mysql` CLI | Reset root password, ensure MariaDB is running | +| Glance API fails to start | Inspect `/var/log/glance/` logs | Check config files and database connections | +| OpenStack CLI authentication fails | Verify environment variables and Keystone credentials | Re-run Keystone bootstrap or reset passwords | +| Image upload fails | Validate network and storage permissions | Check Glance logs, storage directory permissions| + +## References + +- [OpenStack Official Documentation](https://docs.openstack.org/) +- [Keystone Service Documentation](https://docs.openstack.org/keystone/latest/) +- [Glance Service Documentation](https://docs.openstack.org/glance/latest/) +- [Ansible Best Practices](https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html) +- [Fernet Tokens in Keystone](https://docs.openstack.org/keystone/latest/admin/fernet_tokens.html) + +## Summary + +This project automates a critical piece of an OpenStack cloud environment with an emphasis on security, maintainability, and extensibility. It combines robust database configuration, secure service bootstrapping, and integrated testing in an Ansible-driven workflow, making it suitable for lab environments, proof-of-concepts, or a foundation for production deployments. diff --git a/playbooks/glance-ansible/glance.yaml b/playbooks/glance-ansible/glance.yaml new file mode 100644 index 00000000..3d9aef3c --- /dev/null +++ b/playbooks/glance-ansible/glance.yaml @@ -0,0 +1,6 @@ +- name: Deploy OpenStack Keystone and Glance + hosts: controller + become: true + roles: + - keystone + - glance \ No newline at end of file diff --git a/playbooks/glance-ansible/inventory.ini b/playbooks/glance-ansible/inventory.ini new file mode 100644 index 00000000..e69de29b diff --git a/playbooks/glance-ansible/roles/glance/defaults/main.yaml b/playbooks/glance-ansible/roles/glance/defaults/main.yaml new file mode 100644 index 00000000..e69de29b diff --git a/playbooks/glance-ansible/roles/glance/task/main.yaml b/playbooks/glance-ansible/roles/glance/task/main.yaml new file mode 100644 index 00000000..e69de29b diff --git a/playbooks/glance-ansible/roles/keystone/defaults/main.yaml b/playbooks/glance-ansible/roles/keystone/defaults/main.yaml new file mode 100644 index 00000000..e69de29b diff --git a/playbooks/glance-ansible/roles/keystone/task/main.yaml b/playbooks/glance-ansible/roles/keystone/task/main.yaml new file mode 100644 index 00000000..e69de29b diff --git a/playbooks/glance/glance-setup.sh b/playbooks/glance/glance-setup.sh deleted file mode 100755 index 2de36786..00000000 --- a/playbooks/glance/glance-setup.sh +++ /dev/null @@ -1,198 +0,0 @@ -#!/bin/bash -set -euo pipefail - -# Temporarily disable exit on unbound variables to suppress RC_DIR unbound variable errors -set +u -unset RC_DIR || true -unset DEVSTACK_DIR || true -set -u - -NEW_MYSQL_ROOT_PASS="newpassword" -GLANCE_DB_PASS="GlancePass123!" -GLANCE_USER_PASS="GlancePass123!" -CONTROLLER_HOST=localhost -KEYSTONE_PORT=5001 # Keystone runs on this port -KEYSTONE_ADMIN_PASS="admin" # MUST match Keystone bootstrap password - -is_mysql_installed() { - command -v mysql >/dev/null 2>&1 -} - -can_mysql_root_no_password() { - sudo mysql -u root -e "SELECT 1;" >/dev/null 2>&1 -} - -can_mysql_root_with_password() { - sudo mysql -u root -p"${NEW_MYSQL_ROOT_PASS}" -e "SELECT 1;" >/dev/null 2>&1 -} - -keystone_is_up() { - curl -s -o /dev/null -w "%{http_code}" http://${CONTROLLER_HOST}:${KEYSTONE_PORT}/v3 | grep -qE "200|300" -} - -openstack_auth_is_valid() { - export OS_USERNAME=admin - export OS_PASSWORD=${KEYSTONE_ADMIN_PASS} - export OS_PROJECT_NAME=admin - export OS_AUTH_URL=http://${CONTROLLER_HOST}:${KEYSTONE_PORT}/v3 - export OS_USER_DOMAIN_NAME=Default - export OS_PROJECT_DOMAIN_NAME=Default - export OS_IDENTITY_API_VERSION=3 - - openstack token issue >/dev/null 2>&1 -} - -echo "==> Checking if MySQL is installed..." - -if ! is_mysql_installed; then - echo "MySQL not installed. Installing MariaDB and dependencies..." - sudo DEBIAN_FRONTEND=noninteractive apt update - sudo DEBIAN_FRONTEND=noninteractive apt install -y mariadb-server python3-pymysql || true - sudo systemctl enable mariadb - sudo systemctl start mariadb - - echo "Setting MySQL root password (initial no-password access)..." - sudo mysql -u root < Creating Glance database and user..." -sudo mysql -u root -p"${NEW_MYSQL_ROOT_PASS}" < Installing Glance and dependencies..." -sudo DEBIAN_FRONTEND=noninteractive apt install -y glance python3-glanceclient apache2 libapache2-mod-wsgi-py3 crudini - -echo "==> Checking for OpenStack client..." -if ! command -v openstack >/dev/null 2>&1; then - echo "Installing python3-openstackclient..." - sudo apt update - sudo apt install -y python3-openstackclient -fi - -echo "==> Checking if Keystone is up..." -if ! keystone_is_up; then - echo "ERROR: Keystone service is not reachable at http://${CONTROLLER_HOST}:${KEYSTONE_PORT}/v3." - echo "Please start Keystone before running this script." - echo "To avoid RC_DIR errors, consider running this script via:" - echo " env -i bash --noprofile --norc ./glance-setup.sh" - exit 1 -fi - -echo "==> Validating OpenStack authentication..." -if ! openstack_auth_is_valid; then - echo "ERROR: Unable to authenticate to Keystone at http://${CONTROLLER_HOST}:${KEYSTONE_PORT}/v3." - echo "Please check your OS_USERNAME, OS_PASSWORD, and Keystone bootstrap password." - echo "Ensure Keystone was bootstrapped with password '${KEYSTONE_ADMIN_PASS}'." - exit 1 -fi - -# Ensure 'service' project exists (fix for 'No project with a name or ID of service exists' error) -if ! openstack project show service >/dev/null 2>&1; then - echo "Creating 'service' project in Keystone..." - openstack project create --domain default service -fi - -echo "==> Setting OpenStack environment variables for Glance registration..." -export OS_USERNAME=admin -export OS_PASSWORD=${KEYSTONE_ADMIN_PASS} -export OS_PROJECT_NAME=admin -export OS_AUTH_URL=http://${CONTROLLER_HOST}:${KEYSTONE_PORT}/v3 -export OS_USER_DOMAIN_NAME=Default -export OS_PROJECT_DOMAIN_NAME=Default -export OS_IDENTITY_API_VERSION=3 - -echo "==> Registering Glance with Keystone..." -if ! openstack user show glance >/dev/null 2>&1; then - openstack user create --domain default --password "$GLANCE_USER_PASS" glance -fi - -openstack role add --project service --user glance admin || true - -if ! openstack service show image >/dev/null 2>&1; then - openstack service create --name glance --description "OpenStack Image" image -fi - -if ! openstack endpoint list | grep -q glance; then - openstack endpoint create --region RegionOne image public "http://${CONTROLLER_HOST}:9292" - openstack endpoint create --region RegionOne image internal "http://${CONTROLLER_HOST}:9292" - openstack endpoint create --region RegionOne image admin "http://${CONTROLLER_HOST}:9292" -fi - -echo "==> Configuring Glance..." -sudo crudini --set /etc/glance/glance-api.conf database connection "mysql+pymysql://glance:${GLANCE_DB_PASS}@localhost/glance" - -sudo crudini --set /etc/glance/glance-api.conf keystone_authtoken www_authenticate_uri "http://${CONTROLLER_HOST}:${KEYSTONE_PORT}" -sudo crudini --set /etc/glance/glance-api.conf keystone_authtoken auth_url "http://${CONTROLLER_HOST}:${KEYSTONE_PORT}" -sudo crudini --set /etc/glance/glance-api.conf keystone_authtoken memcached_servers "${CONTROLLER_HOST}:11211" -sudo crudini --set /etc/glance/glance-api.conf keystone_authtoken auth_type password -sudo crudini --set /etc/glance/glance-api.conf keystone_authtoken project_domain_name Default -sudo crudini --set /etc/glance/glance-api.conf keystone_authtoken user_domain_name Default -sudo crudini --set /etc/glance/glance-api.conf keystone_authtoken project_name service -sudo crudini --set /etc/glance/glance-api.conf keystone_authtoken username glance -sudo crudini --set /etc/glance/glance-api.conf keystone_authtoken password "${GLANCE_USER_PASS}" - -sudo crudini --set /etc/glance/glance-api.conf glance_store stores "file,http" -sudo crudini --set /etc/glance/glance-api.conf glance_store default_store "file" -sudo crudini --set /etc/glance/glance-api.conf glance_store filesystem_store_datadir "/var/lib/glance/images/" - -echo "==> Migrating Glance database..." -sudo glance-manage db_sync - -echo "==> Enabling and starting Glance service..." -sudo systemctl enable glance-api -sudo systemctl restart glance-api - -echo "==> Waiting for Glance API to start and respond on port 9292..." -for i in {1..30}; do - if curl -s http://localhost:9292/v2 >/dev/null 2>&1; then - echo "Glance API is up!" - break - else - echo "Waiting for Glance API... ($i/30)" - sleep 2 - fi -done - -if ! curl -s http://localhost:9292/v2 >/dev/null 2>&1; then - echo "ERROR: Glance API did not start properly. Exiting." - exit 1 -fi - -echo "==> Downloading and uploading test image (cirros)..." -wget -q http://download.cirros-cloud.net/0.6.2/cirros-0.6.2-x86_64-disk.img || true - -if ! openstack image list | grep -q cirros; then - openstack image create "cirros" \ - --file cirros-0.6.2-x86_64-disk.img \ - --disk-format qcow2 --container-format bare \ - --public -fi - -echo "✅ Glance is fully installed, configured, and ready." diff --git a/playbooks/glance/keystone-setup.sh b/playbooks/glance/keystone-setup.sh deleted file mode 100755 index a6e37c83..00000000 --- a/playbooks/glance/keystone-setup.sh +++ /dev/null @@ -1,125 +0,0 @@ -#!/bin/bash -set -e - -# === CONFIGURATION === - -MYSQL_ROOT_PASS="newpassword" -KEYSTONE_DB_PASS="keystone_db_pass" -ADMIN_TOKEN="ADMIN" -CONTROLLER_HOST="localhost" -KEYSTONE_PORT=5001 # Changed port to avoid conflicts - -# === FUNCTIONS === -function install_if_missing { - PKG="$1" - if ! dpkg -s "$PKG" >/dev/null 2>&1; then - echo "Installing $PKG..." - sudo apt install -y "$PKG" - else - echo "$PKG is already installed." - fi -} - -function ensure_mysql_root_password { - echo "==> Checking MySQL root access..." - if mysql -u root -e "exit" 2>/dev/null; then - echo "✅ No MySQL root password yet, setting it..." - sudo mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASS}'; FLUSH PRIVILEGES;" - elif mysql -u root -p"${MYSQL_ROOT_PASS}" -e "exit" 2>/dev/null; then - echo "✅ MySQL root password already set and valid." - else - echo "❌ Could not access MySQL as root. Exiting." - exit 1 - fi -} - -function create_keystone_db { - echo "==> Configuring Keystone database..." - sudo mysql -u root -p"${MYSQL_ROOT_PASS}" < Installing MariaDB and Keystone packages..." -sudo apt update - -install_if_missing mariadb-server -install_if_missing python3-pymysql -install_if_missing keystone -install_if_missing apache2 -install_if_missing libapache2-mod-wsgi-py3 -install_if_missing crudini - -# Enable and start MariaDB -sudo systemctl enable mariadb -sudo systemctl start mariadb - -# Set MySQL root password if needed -ensure_mysql_root_password - -# Create Keystone DB and user -create_keystone_db - -# Update keystone.conf -echo "==> Updating keystone.conf..." -sudo crudini --set /etc/keystone/keystone.conf database connection "mysql+pymysql://keystone:${KEYSTONE_DB_PASS}@localhost/keystone" -sudo crudini --set /etc/keystone/keystone.conf token provider fernet -sudo crudini --set /etc/keystone/keystone.conf DEFAULT admin_token "${ADMIN_TOKEN}" - -# DB Sync -echo "==> Syncing Keystone DB..." -sudo keystone-manage db_sync - -# Fernet keys -echo "==> Initializing Fernet keys..." -sudo keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone -sudo keystone-manage credential_setup --keystone-user keystone --keystone-group keystone - -# Bootstrap Keystone with new port -echo "==> Bootstrapping Keystone..." -sudo keystone-manage bootstrap --bootstrap-password admin \ - --bootstrap-admin-url http://${CONTROLLER_HOST}:${KEYSTONE_PORT}/v3/ \ - --bootstrap-internal-url http://${CONTROLLER_HOST}:${KEYSTONE_PORT}/v3/ \ - --bootstrap-public-url http://${CONTROLLER_HOST}:${KEYSTONE_PORT}/v3/ \ - --bootstrap-region-id RegionOne - -# Add Listen directive to ports.conf if missing -if ! sudo grep -q "^Listen ${KEYSTONE_PORT}$" /etc/apache2/ports.conf; then - echo "==> Adding Listen ${KEYSTONE_PORT} to /etc/apache2/ports.conf..." - echo "Listen ${KEYSTONE_PORT}" | sudo tee -a /etc/apache2/ports.conf -fi - -# Disable old conflicting site if exists -if sudo a2query -s keystone.conf >/dev/null 2>&1; then - echo "==> Disabling old Keystone site keystone.conf..." - sudo a2dissite keystone.conf -fi - -# Write Apache WSGI config for Keystone without Listen directive (only ) -echo "==> Writing Apache WSGI config for Keystone..." -cat </dev/null - - WSGIDaemonProcess keystone processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP} - WSGIProcessGroup keystone - WSGIScriptAlias / /usr/bin/keystone-wsgi-public - ErrorLogFormat "%{cu}t %M" - ErrorLog /var/log/apache2/keystone_error.log - CustomLog /var/log/apache2/keystone_access.log combined - -EOF - -echo "==> Enabling Keystone Apache site and restarting Apache..." -sudo a2ensite wsgi-keystone.conf - -sudo systemctl restart apache2 || { - echo "❌ Apache failed to start. Check config!" - sudo apachectl configtest - exit 1 -} - -echo "✅ Keystone installation complete!" From 5c7d7352775891dbf90e3d7a8038d47c3c264685 Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Mon, 30 Jun 2025 13:36:39 +0100 Subject: [PATCH 03/38] fixed some markdown lint issues --- docs/VLAN.md | 4 ++-- docs/ansible_docs.md | 26 +++++++++++++------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/VLAN.md b/docs/VLAN.md index f58a860b..36bf2453 100644 --- a/docs/VLAN.md +++ b/docs/VLAN.md @@ -16,9 +16,9 @@ the same network switch. There are two types of VLANs: - **Port-Based VLAN**: A VLAN is assigned to a particular port, and any machine - connected to that port automatically joins that VLAN + connected to that port automatically joins that VLAN. - **User-Based or Dynamic VLAN**: VLANs are assigned based on user - authentication or other dynamic criteria + authentication or other dynamic criteria. ## Network Architecture diff --git a/docs/ansible_docs.md b/docs/ansible_docs.md index 940e6e19..240a6f47 100644 --- a/docs/ansible_docs.md +++ b/docs/ansible_docs.md @@ -15,13 +15,13 @@ how to install Ansible here: Ansible provides several tools to facilitate server management: - **OpenSSH**: Used for setting up SSH and generating keys for server - authentication + authentication. - **Ad-hoc Commands**: Used as alternatives to playbooks for quick and simple - tasks + tasks. - **Playbooks**: YAML files containing specific tasks to manage servers, used - for complex tasks + for complex tasks. - **Inventory File**: Contains the list of servers grouped by categories for - organized management + organized management. ## How It Works @@ -31,8 +31,8 @@ Ansible relies on SSH to authenticate and configure servers. While you can use a single SSH key for managing all servers, it is often recommended to use two separate keys: -- One for personal SSH logins -- Another specifically for automation with Ansible +- One for personal SSH logins. +- Another specifically for automation with Ansible. #### Creation of SSH Keys @@ -72,9 +72,9 @@ For more details, see: Playbooks define the automation logic in a structured way. When you run a playbook, Ansible: -1. Loads temporary modules to the remote server -2. Executes the tasks (e.g., install packages, start services) -3. Removes the modules after execution +1. Loads temporary modules to the remote server. +2. Executes the tasks (e.g., install packages, start services). +3. Removes the modules after execution. For more details on playbooks: @@ -95,15 +95,15 @@ To learn more about ad-hoc commands, see: Ansible excels at server management by providing: - **Playbooks**: Makes task handover between teams seamless, as all required - tasks are documented in playbooks + tasks are documented in playbooks. - **Inventory Files**: Organizes server IP addresses by groups, making it easy - to manage and assign tasks + to manage and assign tasks. - **SSH Key**: Automates authentication, making server access and management - more efficient + more efficient. ## What If Ansible Becomes Outdated? -If Ansible becomes outdated or no longer maintained, other modern tools can be +If Ansible becomes outdated or is no longer maintained, other modern tools can be used for infrastructure automation and server management: - [Chef](https://docs.chef.io/manage/) From d0887cfac5c04725f271502e84f7ca95b259de5c Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Mon, 30 Jun 2025 15:30:21 +0100 Subject: [PATCH 04/38] glance openstack component installation using ansible --- playbooks/docs/glance-ansible_docs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playbooks/docs/glance-ansible_docs.md b/playbooks/docs/glance-ansible_docs.md index 0c6520e8..7a5c3da6 100644 --- a/playbooks/docs/glance-ansible_docs.md +++ b/playbooks/docs/glance-ansible_docs.md @@ -240,4 +240,4 @@ Look for the 'cirros' image uploaded by the playbook. ## Summary -This project automates a critical piece of an OpenStack cloud environment with an emphasis on security, maintainability, and extensibility. It combines robust database configuration, secure service bootstrapping, and integrated testing in an Ansible-driven workflow, making it suitable for lab environments, proof-of-concepts, or a foundation for production deployments. +This project automates a critical piece of an OpenStack cloud environment with an emphasis on security, maintainability, and extensibility. It combines robust database configuration, secure service bootstrapping, and integrated testing in an Ansible-driven workflow, making it suitable for lab environments, proof-of-concepts, or a foundation for production deployments. \ No newline at end of file From 558aee596f4e4ef302edde861a017ad26c2e159f Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Mon, 30 Jun 2025 13:26:02 +0100 Subject: [PATCH 05/38] Update accept.txt --- .github/styles/config/vocabularies/Ansible/accept.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/styles/config/vocabularies/Ansible/accept.txt b/.github/styles/config/vocabularies/Ansible/accept.txt index bc038abe..d5538ab1 100644 --- a/.github/styles/config/vocabularies/Ansible/accept.txt +++ b/.github/styles/config/vocabularies/Ansible/accept.txt @@ -34,3 +34,13 @@ (?i)vms? (?i)macoss? (?i)oss? +(?i)config +(?i)configs +(?i)Cirros +(?i)Idempotency +(?i)hostnames +(?i)Fernet +(?i)Ceph +(?i)OAuth +(?i)APIs +(?i)cirros From f50a5a0b044837e55ab9c28b4787b7939363bb3f Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Mon, 30 Jun 2025 15:41:56 +0100 Subject: [PATCH 06/38] glance openstack installation using ansible --- playbooks/glance-ansible/inventory.ini | 2 + .../roles/glance/defaults/main.yaml | 7 + .../roles/glance/task/main.yaml | 155 ++++++++++++++++++ .../roles/keystone/defaults/main.yaml | 6 + .../roles/keystone/task/main.yaml | 101 ++++++++++++ 5 files changed, 271 insertions(+) diff --git a/playbooks/glance-ansible/inventory.ini b/playbooks/glance-ansible/inventory.ini index e69de29b..8e8872fa 100644 --- a/playbooks/glance-ansible/inventory.ini +++ b/playbooks/glance-ansible/inventory.ini @@ -0,0 +1,2 @@ +[controller] +localhost ansible_connection=local diff --git a/playbooks/glance-ansible/roles/glance/defaults/main.yaml b/playbooks/glance-ansible/roles/glance/defaults/main.yaml index e69de29b..a0d0573a 100644 --- a/playbooks/glance-ansible/roles/glance/defaults/main.yaml +++ b/playbooks/glance-ansible/roles/glance/defaults/main.yaml @@ -0,0 +1,7 @@ +--- +new_mysql_root_pass: newpassword +glance_db_pass: GlancePass123! +glance_user_pass: GlancePass123! +controller_host: localhost +keystone_port: 5001 +keystone_admin_pass: admin diff --git a/playbooks/glance-ansible/roles/glance/task/main.yaml b/playbooks/glance-ansible/roles/glance/task/main.yaml index e69de29b..690ccd60 100644 --- a/playbooks/glance-ansible/roles/glance/task/main.yaml +++ b/playbooks/glance-ansible/roles/glance/task/main.yaml @@ -0,0 +1,155 @@ +--- +- name: Install Glance dependencies + apt: + name: + - glance + - python3-glanceclient + - apache2 + - libapache2-mod-wsgi-py3 + - crudini + - wget + state: present + update_cache: yes + +- name: Ensure MySQL root password is valid + shell: | + mysql -u root -p"{{ new_mysql_root_pass }}" -e "SELECT 1;" || \ + (mysql -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '{{ new_mysql_root_pass }}'; FLUSH PRIVILEGES;") + args: + executable: /bin/bash + +- name: Create Glance database and user + mysql_db: + name: glance + state: present + +- name: Create Glance DB user + mysql_user: + name: glance + password: "{{ glance_db_pass }}" + priv: "glance.*:ALL" + host: localhost + state: present + +- name: Configure glance-api.conf + block: + - name: Set DB connection + ini_file: + path: /etc/glance/glance-api.conf + section: database + option: connection + value: "mysql+pymysql://glance:{{ glance_db_pass }}@localhost/glance" + + - name: Set Keystone authtoken settings + ini_file: + path: /etc/glance/glance-api.conf + section: keystone_authtoken + option: "{{ item.option }}" + value: "{{ item.value }}" + loop: + - { option: www_authenticate_uri, value: "http://{{ controller_host }}:{{ keystone_port }}" } + - { option: auth_url, value: "http://{{ controller_host }}:{{ keystone_port }}" } + - { option: memcached_servers, value: "{{ controller_host }}:11211" } + - { option: auth_type, value: password } + - { option: project_domain_name, value: Default } + - { option: user_domain_name, value: Default } + - { option: project_name, value: service } + - { option: username, value: glance } + - { option: password, value: "{{ glance_user_pass }}" } + + - name: Configure glance_store + ini_file: + path: /etc/glance/glance-api.conf + section: glance_store + option: "{{ item.option }}" + value: "{{ item.value }}" + loop: + - { option: stores, value: "file,http" } + - { option: default_store, value: file } + - { option: filesystem_store_datadir, value: "/var/lib/glance/images/" } + +- name: Run db sync + command: glance-manage db_sync + +- name: Enable and restart glance-api + systemd: + name: glance-api + state: restarted + enabled: yes + +- name: Wait for Glance API to start + uri: + url: http://localhost:9292/v2 + method: GET + status_code: 200 + register: glance_api_status + retries: 30 + delay: 2 + until: glance_api_status.status == 200 + +- name: Ensure Cirros test image exists + get_url: + url: http://download.cirros-cloud.net/0.6.2/cirros-0.6.2-x86_64-disk.img + dest: /tmp/cirros.img + +- name: Create Glance user if missing + shell: openstack user show glance || openstack user create --domain default --password {{ glance_user_pass }} glance + environment: + OS_USERNAME: admin + OS_PASSWORD: "{{ keystone_admin_pass }}" + OS_PROJECT_NAME: admin + OS_AUTH_URL: "http://{{ controller_host }}:{{ keystone_port }}/v3" + OS_USER_DOMAIN_NAME: Default + OS_PROJECT_DOMAIN_NAME: Default + OS_IDENTITY_API_VERSION: 3 + args: + executable: /bin/bash + +- name: Create service project if missing + shell: openstack project show service || openstack project create --domain default service + environment: + OS_USERNAME: admin + OS_PASSWORD: "{{ keystone_admin_pass }}" + OS_PROJECT_NAME: admin + OS_AUTH_URL: "http://{{ controller_host }}:{{ keystone_port }}/v3" + OS_USER_DOMAIN_NAME: Default + OS_PROJECT_DOMAIN_NAME: Default + OS_IDENTITY_API_VERSION: 3 + args: + executable: /bin/bash + +- name: Register Glance service and endpoints + shell: | + openstack service show image || openstack service create --name glance --description "OpenStack Image" image + openstack endpoint list | grep -q glance || ( + openstack endpoint create --region RegionOne image public "http://{{ controller_host }}:9292" && + openstack endpoint create --region RegionOne image internal "http://{{ controller_host }}:9292" && + openstack endpoint create --region RegionOne image admin "http://{{ controller_host }}:9292" + ) + environment: + OS_USERNAME: admin + OS_PASSWORD: "{{ keystone_admin_pass }}" + OS_PROJECT_NAME: admin + OS_AUTH_URL: "http://{{ controller_host }}:{{ keystone_port }}/v3" + OS_USER_DOMAIN_NAME: Default + OS_PROJECT_DOMAIN_NAME: Default + OS_IDENTITY_API_VERSION: 3 + args: + executable: /bin/bash + +- name: Upload test image to Glance + shell: | + openstack image list | grep -q cirros || \ + openstack image create "cirros" \ + --file /tmp/cirros.img \ + --disk-format qcow2 --container-format bare --public + environment: + OS_USERNAME: admin + OS_PASSWORD: "{{ keystone_admin_pass }}" + OS_PROJECT_NAME: admin + OS_AUTH_URL: "http://{{ controller_host }}:{{ keystone_port }}/v3" + OS_USER_DOMAIN_NAME: Default + OS_PROJECT_DOMAIN_NAME: Default + OS_IDENTITY_API_VERSION: 3 + args: + executable: /bin/bash diff --git a/playbooks/glance-ansible/roles/keystone/defaults/main.yaml b/playbooks/glance-ansible/roles/keystone/defaults/main.yaml index e69de29b..79ade152 100644 --- a/playbooks/glance-ansible/roles/keystone/defaults/main.yaml +++ b/playbooks/glance-ansible/roles/keystone/defaults/main.yaml @@ -0,0 +1,6 @@ +--- +mysql_root_password: newpassword +keystone_db_password: keystone_db_pass +admin_token: ADMIN +controller_host: localhost +keystone_port: 5001 \ No newline at end of file diff --git a/playbooks/glance-ansible/roles/keystone/task/main.yaml b/playbooks/glance-ansible/roles/keystone/task/main.yaml index e69de29b..19789fb9 100644 --- a/playbooks/glance-ansible/roles/keystone/task/main.yaml +++ b/playbooks/glance-ansible/roles/keystone/task/main.yaml @@ -0,0 +1,101 @@ +--- +- name: Install Keystone dependencies + apt: + name: + - mariadb-server + - python3-pymysql + - keystone + - apache2 + - libapache2-mod-wsgi-py3 + - crudini + update_cache: yes + state: present + +- name: Ensure MariaDB is started + systemd: + name: mariadb + enabled: yes + state: started + +- name: Set MySQL root password if not set + shell: | + mysql -u root -e "exit" && \ + mysql -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '{{ mysql_root_password }}'; FLUSH PRIVILEGES;" || true + args: + executable: /bin/bash + +- name: Create Keystone database and user + mysql_db: + name: keystone + state: present + notify: + - Create Keystone DB user + +- name: Set Keystone database connection string + ini_file: + path: /etc/keystone/keystone.conf + section: database + option: connection + value: "mysql+pymysql://keystone:{{ keystone_db_password }}@localhost/keystone" + +- name: Set Keystone token provider + ini_file: + path: /etc/keystone/keystone.conf + section: token + option: provider + value: fernet + +- name: Set Keystone admin token + ini_file: + path: /etc/keystone/keystone.conf + section: DEFAULT + option: admin_token + value: "{{ admin_token }}" + +- name: Sync Keystone database + command: keystone-manage db_sync + +- name: Setup Fernet keys + command: keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone + +- name: Setup credentials + command: keystone-manage credential_setup --keystone-user keystone --keystone-group keystone + +- name: Bootstrap Keystone + command: > + keystone-manage bootstrap + --bootstrap-password admin + --bootstrap-admin-url http://{{ controller_host }}:{{ keystone_port }}/v3/ + --bootstrap-internal-url http://{{ controller_host }}:{{ keystone_port }}/v3/ + --bootstrap-public-url http://{{ controller_host }}:{{ keystone_port }}/v3/ + --bootstrap-region-id RegionOne + +- name: Ensure Keystone port is in ports.conf + lineinfile: + path: /etc/apache2/ports.conf + line: "Listen {{ keystone_port }}" + create: yes + +- name: Write Keystone Apache config + copy: + dest: /etc/apache2/sites-available/wsgi-keystone.conf + content: | + + WSGIDaemonProcess keystone processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP} + WSGIProcessGroup keystone + WSGIScriptAlias / /usr/bin/keystone-wsgi-public + ErrorLogFormat "%{cu}t %M" + ErrorLog /var/log/apache2/keystone_error.log + CustomLog /var/log/apache2/keystone_access.log combined + + +- name: Enable Keystone site + command: a2ensite wsgi-keystone.conf + notify: + - Restart Apache + +- name: Restart Apache + systemd: + name: apache2 + state: restarted + enabled: yes \ No newline at end of file From 633d5bd8449ac58cc5e58aadc77d49f58d594838 Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Mon, 30 Jun 2025 17:14:44 +0100 Subject: [PATCH 07/38] fixed the project structure --- playbooks/docs/glance-ansible_docs.md | 59 +++++---------------------- 1 file changed, 11 insertions(+), 48 deletions(-) diff --git a/playbooks/docs/glance-ansible_docs.md b/playbooks/docs/glance-ansible_docs.md index 7a5c3da6..51dcf1e7 100644 --- a/playbooks/docs/glance-ansible_docs.md +++ b/playbooks/docs/glance-ansible_docs.md @@ -67,17 +67,18 @@ This Ansible project aims to: The project follows best practices for Ansible roles, structured as: +```text glance-ansible/ ├── inventory.ini # Defines target hosts (default: localhost) -├── glance.yml # Main playbook orchestrating Keystone & Glance roles +├── glance.yml # Main playbook orchestrating Keystone & Glance roles └── roles/ - ├── keystone/ # Keystone role (identity service) - │ ├── defaults/main.yml # Default variables for Keystone - │ └── tasks/main.yml # Keystone installation & configuration steps - └── glance/ # Glance role (image service) - ├── defaults/main.yml # Default variables for Glance - └── tasks/main.yml # Glance installation & configuration steps - + ├── keystone/ # Keystone role (identity service) + │ ├── defaults/main.yml # Default variables for Keystone + │ └── tasks/main.yml # Keystone installation & configuration steps + └── glance/ # Glance role (image service) + ├── defaults/main.yml # Default variables for Glance + └── tasks/main.yml # Glance installation & configuration steps +``` - `inventory.ini`: Defines target hosts (in this case, localhost as controller node). - `glance.yml`: Main playbook invoking both Keystone and Glance roles in proper sequence. @@ -198,46 +199,8 @@ export OS_IDENTITY_API_VERSION=3 ```bash openstack token issue -```` - -3. **List Keystoone Image** - -```sh -openstack image list ``` -Look for the 'cirros' image uploaded by the playbook. - -## Extending and Customizing - -- Add roles for other OpenStack services like Nova (compute), Neutron (networking), Cinder (block storage). - -- Change Glance backend storage from local filesystem to Swift or Ceph. - -- Configure HTTPS with SSL certificates for Apache. - -- Integrate with external authentication backends (LDAP, OAuth). - -- Automate multi-node OpenStack deployments. - -## Troubleshooting Guide - -| Issue | Diagnostic Steps | Resolution Suggestions | -|-------------------------------|--------------------------------------------------|------------------------------------------------| -| Keystone API not reachable | Check Apache and Keystone logs | Restart services, verify configs and firewall | -| MariaDB connection errors | Attempt to connect manually with `mysql` CLI | Reset root password, ensure MariaDB is running | -| Glance API fails to start | Inspect `/var/log/glance/` logs | Check config files and database connections | -| OpenStack CLI authentication fails | Verify environment variables and Keystone credentials | Re-run Keystone bootstrap or reset passwords | -| Image upload fails | Validate network and storage permissions | Check Glance logs, storage directory permissions| - -## References - -- [OpenStack Official Documentation](https://docs.openstack.org/) -- [Keystone Service Documentation](https://docs.openstack.org/keystone/latest/) -- [Glance Service Documentation](https://docs.openstack.org/glance/latest/) -- [Ansible Best Practices](https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html) -- [Fernet Tokens in Keystone](https://docs.openstack.org/keystone/latest/admin/fernet_tokens.html) - -## Summary +3. **List Keystoone Image** -This project automates a critical piece of an OpenStack cloud environment with an emphasis on security, maintainability, and extensibility. It combines robust database configuration, secure service bootstrapping, and integrated testing in an Ansible-driven workflow, making it suitable for lab environments, proof-of-concepts, or a foundation for production deployments. \ No newline at end of file +``` \ No newline at end of file From 3ec33594f5bdb8f1885197817ac03d2146eefa32 Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Wed, 21 May 2025 15:27:41 +0100 Subject: [PATCH 08/38] documentation on how to configure network interfaces using netplan along with ansible --- docs/netplan_doc.md | 347 ++++++++++++++++++++++++++++++++++++++++++++ docs/playbook.yaml | 40 +++++ 2 files changed, 387 insertions(+) create mode 100644 docs/netplan_doc.md create mode 100644 docs/playbook.yaml diff --git a/docs/netplan_doc.md b/docs/netplan_doc.md new file mode 100644 index 00000000..3f4fcea0 --- /dev/null +++ b/docs/netplan_doc.md @@ -0,0 +1,347 @@ +# NETWORK CONFIGURATION USING NETPLAN WITH ANSIBLE + +## WHAT IS NETPLAN + +Netplan is a modern network configuration tool, primarily used in Ubuntu-based Linux distributions. Its goal is to simplify the management of network interfaces through the use of YAML files. Before its introduction, network configuration in Linux was done through files like /etc/network/interfacesor other methods specific to the services used, like NetworkManageror systemd-networkd. With Netplan, these configurations are unified, providing a standard and accessible solution. + +This guide is designed to show you how to use Netplan with ansible to efficiently configure your network interfaces, whether you need to manage Ethernet connections, Wi-Fi, or even advanced configurations like VLANs and static routes, alongside with ansible to automate all this tedious processes. + +## WHY NETPLAN + +Netplan was first introduced to the Ubuntu universe in version 17.10 (Artful Aardvark). Prior to this release, Linux server and system administrators often used traditional file and ifup/down/etc/network/interfaces tools to manage their network interfaces. These methods, while widely used, were becoming increasingly limited in modern, complex network environments. + +With the emergence of new needs, particularly around dynamic network management, the need for a tool that unifies the different network services has become apparent. Netplan was designed to fill this gap. It acts as an overlay simplifying the management of systemd-networkd (systemd's network manager) and NetworkManager. This allows administrators to use a single, simplified syntax, regardless of the underlying service. + +Netplan's choice for Ubuntu distributions also enabled a smoother transition to cloud infrastructures and virtualized environments, where tools like cloud-init benefit from automated and more flexible network configuration. + +**What are NetworkManager and systemd-networkd?** + +As mentioned above, Netplan acts as a unified configuration interface for two main network managers: NetworkManagerand systemd-networkd. Both services play a key role in managing network interfaces on Ubuntu distributions and its derivatives, but they are not used in the same contexts. + +**Network Manager** + +NetworkManager is the network manager primarily used on desktop systems like Ubuntu Desktop or its graphical derivatives such as Kubuntu and Lubuntu. It is designed to simplify network connection management, especially in environments where interfaces change frequently, such as with Wi-Fi connections, VPNs, or mobile networks. + +On a system using NetworkManager, you often have access to a graphical interface, such as the one built into the GNOME desktop environment, to manage networks. This makes NetworkManager ideal for workstations where flexibility and user interaction are essential. + +**systemd-networkd** + +systemd-networkd, on the other hand, is more often used on server systems, such as Ubuntu Server, where network interface management is more static and does not require frequent user interaction. This service is minimalistic and seamlessly integrated into the systemd system, making it suitable for servers and headless environments. + +**checking your manager** + +it is important to know whic network manager is active, as it determines how **Netplan** will apply your network configuration. + +To check if NetworkManager is installed and active, you can run the following command: + +```sh +sudo systemctl status NetworkManager +``` +if service is active, you will see a return indicating status as "running". Otherwise the service will be inactive or uninstalled. + +To check systemd-networkd is active, using the following commamd: + +```sh +sudo systemectl status systemd-networkd +``` + +similarly if this service is active, indicating that systemd-networkd is managing the network. + +**Netplan File Structure and Permissions** + +The configuration files used by Netplan are in YAML format, a simple and readable format that makes it easy to configure network interfaces. These files are located in the directory /etc/netplan/and it is from there that network configurations are applied. + +Each Netplan file follows a strict YAML syntax with well-defined indentations. Here is a simple example of a configuration where the Ethernet interface uses DHCP to obtain an IP address automatically: + +```sh +network: + version: 2 + renderer: networkd + ethernets: + eth0: + dhcp4: true +``` + +Explanation : + +- network: Main block that contains all network configurations. +- version: The version of the Netplan configuration file (currently it is version 2). +- renderer: Defines which service manages network configuration. Here, networkdmeans that systemd-networkd is used. For a desktop environment, one can use NetworkManager . +- ethernets: This block contains the Ethernet interfaces. In this example, eth0is the interface being configured. +- dhcp4: Enables DHCP for IPv4, which assigns an IP address automatically. + + +## Typical configurations with Netplan + +Netplan is a flexible tool that allows you to configure different types of networks: IPv4 and IPv6 addresses , DHCP or static configurations , as well as more complex scenarios like network bridges , link aggregation ( bonding ), and Wi-Fi connections . Here is a set of typical configurations that cover these different cases. + +**IPv4 configuration with DHCP** + +To configure a network interface with an IPv4 address obtained via DHCP , here is a simple configuration. This is commonly used for workstations or servers in environments where the IP address is automatically provided by a DHCP server : +```sh +network: + version: 2 + renderer: networkd + ethernets: + eth0: + dhcp4: true +``` + +In this example, the eth0 interface automatically obtains an IPv4 address via DHCP. + +**Configuring a fixed IPv4 address** + +If you need a static IPv4 address for your interface, for example for a server, here's how to configure that: + +```sh +network: + version: 2 + renderer: networkd + ethernets: + eth0: + addresses: + - 192.168.1.100/24 + gateway4: 192.168.1.1 + nameservers: + addresses: + - 8.8.8.8 + - 8.8.4.4 +``` + +- addresses: Sets the static IP address with the subnet mask (/24). +- gateway4: specifies the default gateway. +- nameservers: defines the DNS servers (here, those of Google). + +**IPv6 Configuration with DHCP** + +To configure an interface to obtain an IPv6 address via DHCP , the syntax is similar to that for IPv4 . Here's how to configure DHCP for IPv6 on Netplan : + +```sh +network: + version: 2 + renderer: networkd + ethernets: + eth0: + dhcp6: true +``` + +This configuration allows the eth0 interface to obtain a dynamic IPv6 address via DHCPv6 . + +**Configuring a Static IPv6 Address** + +To set a static IPv6 address , here is an example configuration: + +```sh +network: + version: 2 + renderer: networkd + ethernets: + eth0: + addresses: + - 2001:0db8:85a3::8a2e:0370:7334/64 + gateway6: 2001:0db8:85a3::1 + nameservers: + addresses: + - 2001:4860:4860::8888 + - 2001:4860:4860::8844 +``` + +- addresses: specifies the static IPv6 address and its prefix ( /64). +- gateway6: Sets the default gateway for IPv6 . +- nameservers: Sets the DNS servers for IPv6 . + +**Wi-Fi configuration** + +Setting up a Wi-Fi network with Netplan requires specifying the SSID and security key. Here's an example of how to configure a Wi-Fi interface : + +```sh +network: + version: 2 + renderer: NetworkManager + wifis: + wlan0: + access-points: + "MonSSID": + password: "motdepassewifi" + dhcp4: true +``` + +In this example: + +- wlan0 is the Wi-Fi interface . +- access-pointsspecifies the Wi-Fi network name ( MonSSID) and its password. +- dhcp4: trueindicates that the Wi-Fi interface + +**Checking network connectivity** + +If you have followed the [ubuntu server installation]() documentation, then no need of configuring the network interface for wi-fi or ethernet manually, because it was surely configured during the installation of ubuntu server. You may use the following command to ensure that network connection is well configured: + +```sh +cat /etc/netplan/50-cloud-init.yaml +``` + +Also, you can use the followimg commands to check whether you are connected to internet: + +```sh +ping -c 5 8.8.8.8 +``` +OR + +```sh +ping -c 5 google.com +``` + +If you see zero packet loss, all the 5 packet were transmitted and 5 packet received, then it means that the DNS(doman name system) is able to resolve domain-name to ip address thus you are connected to the internet. + +**Configuring network interfaces manually** + +If you want to configure wi-fi, static ipv4, static ipv6, ipv4 with DHCP and ipv6 with DHCP manually, do the following: + +1- You have to: + +```sh +sudo nano /etc/netplan/50-cloud-init.yaml +``` +then replace the configuration in there with any configuration above dependending on your choice + +2- To apply the changes, run the following command: +```sh +netplan genate +netplan apply +``` +**configuring network interfaces manually using ansible script along with playbook** + +To configure any of this network interfaces manually using ansible script, do the following: + +1- We need to install ansible in our machine to be able to run ansible script, so run the following command to install ansilble on you machine: + +```sh +sudo apt update && sudo apt upgrade -y +sudo apt install python3 +sudo python3 venv my_venv | sudo source my_venv/bin/activate | cd my_venv +sudo apt install -y build-essential libssl-dev libffi-dev python3-dev python3-pip +python3 install ansible --user +``` + + +2- Create a playbook.yml file, copy and paste the following: + +```sh +--- + + - name: Configure Ethernet with static IP using Netplan + hosts: localhost + become: yes + + vars: + interface_name: "ens33" + static_ip: "10.42.0.10/24" + gateway4: "10.42.0.1" + nameservers: + - "8.8.8.8" + - "8.8.4.4" + + tasks: + + - name: Create Netplan configuration for Ethernet + copy: + dest: /etc/netplan/50-cloud-init.yaml + content: | + network: + version: 2 + ethernets: + {{ interface_name }}: + dhcp4: no + addresses: + {{ static_ip }} + gateway4: + {{ gateway }} + nameservers: + addresses: + {{ nameservers }} + notify: + Apply Netplan + + handlers: + - name: Apply Netplan + command: netplan apply + + - name: Check interface IP using ip a + command: ip -4 addr show {{ interface_name }} + register: ip_result + + - name: Display interface IP info + debug: + var: ip_result.stdout_lines + +``` + +2- To execute the ansible code run this command: + +```sh +sudo ansible-playbook -i host playbook.yaml +``` + +If your output looks like this: + +``` +inet 192.168.1.100/24 brd 192.168.1.255 scope global ens33 +``` + +Then, this indicate that your network interface "ens33" has been configured. + +OR +if you want to instead a configure a wireless network interface with a static ip address i.e a network interface that uses wi-fi replace copy and paste instead the following ansible script in the /etc/netplan/50-cloud-init.yaml file. + +```sh +--- + + - name: Configure wi-fi with static IP using Netplan + hosts: localhost + become: yes + + vars: + static_ip: "192.168.1.100/24" + + tasks: + + - name: Create Netplan configuration for Ethernet + copy: + dest: /etc/netplan/50-cloud-init.yaml + content: | + network: + version: 2 + wifi: + wlan0: + access-point: + {{ wifi_name }}: + dhcp4: true + addresses: + {{ static_ip }} + + notify: + Apply Netplan + + handlers: + - name: Apply Netplan + command: netplan apply + + - name: Check interface IP using ip a + command: ip -4 addr show {{ interface_name }} + register: ip_result + + - name: Display interface IP info + debug: + var: ip_result.stdout_lines + +``` + +If your output looks like this: + +``` +inet 192.168.1.100/24 brd 192.168.1.255 scope global wlan0 +``` + +Then, this indicate that your network interface "wlan0" has been configured. + + diff --git a/docs/playbook.yaml b/docs/playbook.yaml new file mode 100644 index 00000000..8ffa1775 --- /dev/null +++ b/docs/playbook.yaml @@ -0,0 +1,40 @@ +- name: Installer Docker sur les serveurs + hosts: servers + become: true + tasks: + - name: Mettre à jour la liste des paquets + ansible.builtin.apt: + update_cache: yes + + + - name: Installer les dépendances + ansible.builtin.apt: + name: + - apt-transport-https + - ca-certificates + - curl + - software-properties-common + state: present + + + - name: Ajouter la clé GPG officielle de Docker + ansible.builtin.apt_key: + url: https://download.docker.com/linux/ubuntu/gpg + state: present + + + - name: Ajouter le dépôt APT Docker + ansible.builtin.apt_repository: + repo: deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable + + + - name: Installer Docker + ansible.builtin.apt: + name: docker-ce + state: present + + + - name: S'assurer que Docker est démarré + ansible.builtin.service: + name: docker + state: started \ No newline at end of file From c673c5190f39be978098bac3825d76ad5b8716c6 Mon Sep 17 00:00:00 2001 From: onelrian Date: Mon, 2 Jun 2025 10:23:18 +0100 Subject: [PATCH 09/38] Delete docs/playbook.yaml --- docs/playbook.yaml | 40 ---------------------------------------- 1 file changed, 40 deletions(-) delete mode 100644 docs/playbook.yaml diff --git a/docs/playbook.yaml b/docs/playbook.yaml deleted file mode 100644 index 8ffa1775..00000000 --- a/docs/playbook.yaml +++ /dev/null @@ -1,40 +0,0 @@ -- name: Installer Docker sur les serveurs - hosts: servers - become: true - tasks: - - name: Mettre à jour la liste des paquets - ansible.builtin.apt: - update_cache: yes - - - - name: Installer les dépendances - ansible.builtin.apt: - name: - - apt-transport-https - - ca-certificates - - curl - - software-properties-common - state: present - - - - name: Ajouter la clé GPG officielle de Docker - ansible.builtin.apt_key: - url: https://download.docker.com/linux/ubuntu/gpg - state: present - - - - name: Ajouter le dépôt APT Docker - ansible.builtin.apt_repository: - repo: deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable - - - - name: Installer Docker - ansible.builtin.apt: - name: docker-ce - state: present - - - - name: S'assurer que Docker est démarré - ansible.builtin.service: - name: docker - state: started \ No newline at end of file From f5de228cb8ea3f457d2b9ad1d5bec223c2f41071 Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Mon, 2 Jun 2025 14:27:55 +0100 Subject: [PATCH 10/38] docs(netplan): documentation on how to configure network interface using netplan --- docs/netplan_doc.md | 156 ++++++++++++++++++++++---------------------- 1 file changed, 77 insertions(+), 79 deletions(-) diff --git a/docs/netplan_doc.md b/docs/netplan_doc.md index 3f4fcea0..35f52e73 100644 --- a/docs/netplan_doc.md +++ b/docs/netplan_doc.md @@ -228,51 +228,46 @@ python3 install ansible --user ```sh --- - - - name: Configure Ethernet with static IP using Netplan - hosts: localhost - become: yes - - vars: - interface_name: "ens33" - static_ip: "10.42.0.10/24" - gateway4: "10.42.0.1" - nameservers: - - "8.8.8.8" - - "8.8.4.4" - - tasks: - - - name: Create Netplan configuration for Ethernet - copy: - dest: /etc/netplan/50-cloud-init.yaml - content: | - network: - version: 2 - ethernets: +- name: Configure Ethernet with static IP using Netplan + hosts: localhost + become: yes + + vars: + interface_name: "ens33" + static_ip: "10.42.0.10/24" + gateway4: "10.42.0.1" + nameservers: + - "8.8.8.8" + - "8.8.4.4" + + tasks: + - name: Create Netplan configuration for Ethernet + copy: + dest: /etc/netplan/50-cloud-init.yaml + content: | + network: + version: 2 + ethernets: {{ interface_name }}: dhcp4: no addresses: - {{ static_ip }} - gateway4: - {{ gateway }} + - {{ static_ip }} + gateway4: {{ gateway4 }} nameservers: - addresses: - {{ nameservers }} - notify: - Apply Netplan - - handlers: - - name: Apply Netplan - command: netplan apply - - - name: Check interface IP using ip a - command: ip -4 addr show {{ interface_name }} - register: ip_result - - - name: Display interface IP info - debug: - var: ip_result.stdout_lines + addresses: {{ nameservers }} + notify: Apply Netplan + + handlers: + - name: Apply Netplan + command: netplan apply + + - name: Check interface IP using ip a + command: ip -4 addr show {{ interface_name }} + register: ip_result + + - name: Display interface IP info + debug: + var: ip_result.stdout_lines ``` @@ -295,45 +290,48 @@ if you want to instead a configure a wireless network interface with a static ip ```sh --- - - - name: Configure wi-fi with static IP using Netplan - hosts: localhost - become: yes - - vars: - static_ip: "192.168.1.100/24" - - tasks: - - - name: Create Netplan configuration for Ethernet - copy: - dest: /etc/netplan/50-cloud-init.yaml - content: | - network: - version: 2 - wifi: - wlan0: - access-point: - {{ wifi_name }}: - dhcp4: true +- name: Configure Wi-Fi with static IP using Netplan + hosts: localhost + become: yes + + vars: + wifi_name: "your_wifi_ssid" + static_ip: "192.168.1.100/24" + interface_name: "wlan0" + + tasks: + - name: Create Netplan configuration for Wi-Fi + copy: + dest: /etc/netplan/50-cloud-init.yaml + content: | + network: + version: 2 + wifis: + {{ interface_name }}: + dhcp4: no + addresses: + - {{ static_ip }} + gateway4: 192.168.1.1 + nameservers: addresses: - {{ static_ip }} - - notify: - Apply Netplan - - handlers: - - name: Apply Netplan - command: netplan apply - - - name: Check interface IP using ip a - command: ip -4 addr show {{ interface_name }} - register: ip_result - - - name: Display interface IP info - debug: - var: ip_result.stdout_lines - + - 8.8.8.8 + - 8.8.4.4 + access-points: + "{{ wifi_name }}": + password: "your_wifi_password" + notify: Apply Netplan + + - name: Check interface IP using ip a + command: ip -4 addr show {{ interface_name }} + register: ip_result + + - name: Display interface IP info + debug: + var: ip_result.stdout_lines + + handlers: + - name: Apply Netplan + command: netplan apply ``` If your output looks like this: From de2079eb442b5e1d99ea798bd6b4f105682bf6ae Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Mon, 2 Jun 2025 14:35:11 +0100 Subject: [PATCH 11/38] docs(netplan): documentation on how to configure network interface using netplan --- docs/netplan_doc.md | 78 +++++++++++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 31 deletions(-) diff --git a/docs/netplan_doc.md b/docs/netplan_doc.md index 35f52e73..78763ba7 100644 --- a/docs/netplan_doc.md +++ b/docs/netplan_doc.md @@ -16,7 +16,7 @@ Netplan's choice for Ubuntu distributions also enabled a smoother transition to **What are NetworkManager and systemd-networkd?** -As mentioned above, Netplan acts as a unified configuration interface for two main network managers: NetworkManagerand systemd-networkd. Both services play a key role in managing network interfaces on Ubuntu distributions and its derivatives, but they are not used in the same contexts. +As mentioned above, Netplan acts as a unified configuration interface for two main network managers: NetworkManager and systemd-networkd. Both services play a key role in managing network interfaces on Ubuntu distributions and its derivatives, but they are not used in the same contexts. **Network Manager** @@ -30,28 +30,37 @@ systemd-networkd, on the other hand, is more often used on server systems, such **checking your manager** -it is important to know whic network manager is active, as it determines how **Netplan** will apply your network configuration. +It is important to know which network manager is active, as it determines how +**Netplan** will apply your network configuration. -To check if NetworkManager is installed and active, you can run the following command: +To check if NetworkManager is installed and active, you can run the following +command: ```sh sudo systemctl status NetworkManager ``` -if service is active, you will see a return indicating status as "running". Otherwise the service will be inactive or uninstalled. +If the service is active, you will see a return indicating status as "running". +Otherwise, the service will be inactive or uninstalled. -To check systemd-networkd is active, using the following commamd: +To check if systemd-networkd is active, use the following command: ```sh -sudo systemectl status systemd-networkd +sudo systemctl status systemd-networkd ``` -similarly if this service is active, indicating that systemd-networkd is managing the network. +Similarly, if this service is active, it indicates that systemd-networkd is +managing the network. **Netplan File Structure and Permissions** -The configuration files used by Netplan are in YAML format, a simple and readable format that makes it easy to configure network interfaces. These files are located in the directory /etc/netplan/and it is from there that network configurations are applied. +The configuration files used by Netplan are in YAML format, a simple and readable +format that makes it easy to configure network interfaces. These files are +located in the directory /etc/netplan/ and it is from there that network +configurations are applied. -Each Netplan file follows a strict YAML syntax with well-defined indentations. Here is a simple example of a configuration where the Ethernet interface uses DHCP to obtain an IP address automatically: +Each Netplan file follows a strict YAML syntax with well-defined indentations. +Here is a simple example of a configuration where the Ethernet interface uses +DHCP to obtain an IP address automatically: ```sh network: @@ -62,12 +71,15 @@ network: dhcp4: true ``` -Explanation : +Explanation: - network: Main block that contains all network configurations. - version: The version of the Netplan configuration file (currently it is version 2). -- renderer: Defines which service manages network configuration. Here, networkdmeans that systemd-networkd is used. For a desktop environment, one can use NetworkManager . -- ethernets: This block contains the Ethernet interfaces. In this example, eth0is the interface being configured. +- renderer: Defines which service manages network configuration. Here, networkd + means that systemd-networkd is used. For a desktop environment, one can use + NetworkManager. +- ethernets: This block contains the Ethernet interfaces. In this example, eth0 + is the interface being configured. - dhcp4: Enables DHCP for IPv4, which assigns an IP address automatically. @@ -195,25 +207,31 @@ If you see zero packet loss, all the 5 packet were transmitted and 5 packet rece **Configuring network interfaces manually** -If you want to configure wi-fi, static ipv4, static ipv6, ipv4 with DHCP and ipv6 with DHCP manually, do the following: +If you want to configure Wi-Fi, static IPv4, static IPv6, IPv4 with DHCP, or +IPv6 with DHCP manually, do the following: -1- You have to: +1. You need to: ```sh sudo nano /etc/netplan/50-cloud-init.yaml ``` -then replace the configuration in there with any configuration above dependending on your choice +Then replace the configuration with any of the configurations above, depending +on your choice. -2- To apply the changes, run the following command: +2. To apply the changes, run the following command: ```sh -netplan genate +netplan generate netplan apply ``` -**configuring network interfaces manually using ansible script along with playbook** -To configure any of this network interfaces manually using ansible script, do the following: +**Configuring network interfaces manually using Ansible script along with +playbook** -1- We need to install ansible in our machine to be able to run ansible script, so run the following command to install ansilble on you machine: +To configure any of these network interfaces manually using Ansible script, do +the following: + +1. We need to install Ansible on our machine to be able to run Ansible scripts. + Run the following command to install Ansible: ```sh sudo apt update && sudo apt upgrade -y @@ -223,8 +241,7 @@ sudo apt install -y build-essential libssl-dev libffi-dev python3-dev python3-pi python3 install ansible --user ``` - -2- Create a playbook.yml file, copy and paste the following: +2. Create a playbook.yml file, copy and paste the following: ```sh --- @@ -268,10 +285,9 @@ python3 install ansible --user - name: Display interface IP info debug: var: ip_result.stdout_lines - ``` -2- To execute the ansible code run this command: +3. To execute the Ansible code, run this command: ```sh sudo ansible-playbook -i host playbook.yaml @@ -283,10 +299,12 @@ If your output looks like this: inet 192.168.1.100/24 brd 192.168.1.255 scope global ens33 ``` -Then, this indicate that your network interface "ens33" has been configured. +Then this indicates that your network interface "ens33" has been configured. -OR -if you want to instead a configure a wireless network interface with a static ip address i.e a network interface that uses wi-fi replace copy and paste instead the following ansible script in the /etc/netplan/50-cloud-init.yaml file. +Alternatively, if you want to configure a wireless network interface with a +static IP address (i.e., a network interface that uses Wi-Fi), replace the +content in the /etc/netplan/50-cloud-init.yaml file with the following Ansible +script: ```sh --- @@ -338,8 +356,6 @@ If your output looks like this: ``` inet 192.168.1.100/24 brd 192.168.1.255 scope global wlan0 -``` - -Then, this indicate that your network interface "wlan0" has been configured. - +``` +Then this indicates that your network interface "wlan0" has been configured. \ No newline at end of file From 6cd98a3fe2785d7986441e089ec3dcac61d5d692 Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Mon, 2 Jun 2025 14:52:40 +0100 Subject: [PATCH 12/38] docs(netplan): documentation on how to configure network interface using netplan --- docs/netplan_doc.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/netplan_doc.md b/docs/netplan_doc.md index 78763ba7..74470fc8 100644 --- a/docs/netplan_doc.md +++ b/docs/netplan_doc.md @@ -2,7 +2,7 @@ ## WHAT IS NETPLAN -Netplan is a modern network configuration tool, primarily used in Ubuntu-based Linux distributions. Its goal is to simplify the management of network interfaces through the use of YAML files. Before its introduction, network configuration in Linux was done through files like /etc/network/interfacesor other methods specific to the services used, like NetworkManageror systemd-networkd. With Netplan, these configurations are unified, providing a standard and accessible solution. +Netplan is a modern network configuration tool, primarily used in Ubuntu-based Linux distributions. Its goal is to simplify the management of network interfaces through the use of YAML files. Before its introduction, network configuration in Linux was done through files like /etc/network/interfaces or other methods specific to the services used, like NetworkManager or systemd-networkd. With Netplan, these configurations are unified, providing a standard and accessible solution. This guide is designed to show you how to use Netplan with ansible to efficiently configure your network interfaces, whether you need to manage Ethernet connections, Wi-Fi, or even advanced configurations like VLANs and static routes, alongside with ansible to automate all this tedious processes. @@ -10,9 +10,16 @@ This guide is designed to show you how to use Netplan with ansible to efficientl Netplan was first introduced to the Ubuntu universe in version 17.10 (Artful Aardvark). Prior to this release, Linux server and system administrators often used traditional file and ifup/down/etc/network/interfaces tools to manage their network interfaces. These methods, while widely used, were becoming increasingly limited in modern, complex network environments. -With the emergence of new needs, particularly around dynamic network management, the need for a tool that unifies the different network services has become apparent. Netplan was designed to fill this gap. It acts as an overlay simplifying the management of systemd-networkd (systemd's network manager) and NetworkManager. This allows administrators to use a single, simplified syntax, regardless of the underlying service. +With the emergence of new needs, particularly around dynamic network management, +the need for a tool that unifies the different network services has become +apparent. Netplan is designed to fill this gap. It acts as an overlay simplifying +the management of systemd-networkd (systemd is the network manager) and +NetworkManager. This allows administrators to use a single, simplified syntax, +regardless of the underlying service. -Netplan's choice for Ubuntu distributions also enabled a smoother transition to cloud infrastructures and virtualized environments, where tools like cloud-init benefit from automated and more flexible network configuration. +Netplan is the choice for Ubuntu distributions that enabled a smoother transition +to cloud infrastructures and virtualized environments, where tools like cloud-init +benefit from automated and more flexible network configuration. **What are NetworkManager and systemd-networkd?** From f82a404ff40d75ab1265e179866acc87f2f83d2b Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Wed, 4 Jun 2025 07:47:57 +0100 Subject: [PATCH 13/38] made some changes --- docs/netplan_doc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/netplan_doc.md b/docs/netplan_doc.md index 74470fc8..10f8312d 100644 --- a/docs/netplan_doc.md +++ b/docs/netplan_doc.md @@ -92,7 +92,7 @@ Explanation: ## Typical configurations with Netplan -Netplan is a flexible tool that allows you to configure different types of networks: IPv4 and IPv6 addresses , DHCP or static configurations , as well as more complex scenarios like network bridges , link aggregation ( bonding ), and Wi-Fi connections . Here is a set of typical configurations that cover these different cases. +Netplan is a flexible tool that allows you to configure different types of networks: IPv4 and IPv6 addresses , DHCP or static configurations , as well as more complex scenarios like network bridges , link aggregation (bonding), and Wi-Fi connections . Here is a set of typical configurations that cover these different cases. **IPv4 configuration with DHCP** From 34d97feeb3c866e8b9359c9c749b9ef7f28ad34c Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Tue, 3 Jun 2025 17:25:18 +0100 Subject: [PATCH 14/38] Update netplan_doc.md --- docs/netplan_doc.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/netplan_doc.md b/docs/netplan_doc.md index 10f8312d..c872cffa 100644 --- a/docs/netplan_doc.md +++ b/docs/netplan_doc.md @@ -189,7 +189,7 @@ In this example: - wlan0 is the Wi-Fi interface . - access-pointsspecifies the Wi-Fi network name ( MonSSID) and its password. -- dhcp4: trueindicates that the Wi-Fi interface +- dhcp4: true indicates that the Wi-Fi interface **Checking network connectivity** @@ -365,4 +365,4 @@ If your output looks like this: inet 192.168.1.100/24 brd 192.168.1.255 scope global wlan0 ``` -Then this indicates that your network interface "wlan0" has been configured. \ No newline at end of file +Then this indicates that your network interface "wlan0" has been configured. From ff32c7b1d02275365d77099513d0505870356e8a Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Wed, 4 Jun 2025 07:32:36 +0100 Subject: [PATCH 15/38] Update netplan_doc.md --- docs/netplan_doc.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/netplan_doc.md b/docs/netplan_doc.md index c872cffa..75598f66 100644 --- a/docs/netplan_doc.md +++ b/docs/netplan_doc.md @@ -199,7 +199,7 @@ If you have followed the [ubuntu server installation]() documentation, then no n cat /etc/netplan/50-cloud-init.yaml ``` -Also, you can use the followimg commands to check whether you are connected to internet: +Also, you can use the following commands to check whether you are connected to internet: ```sh ping -c 5 8.8.8.8 @@ -210,7 +210,7 @@ OR ping -c 5 google.com ``` -If you see zero packet loss, all the 5 packet were transmitted and 5 packet received, then it means that the DNS(doman name system) is able to resolve domain-name to ip address thus you are connected to the internet. +If you see zero packet loss, all the 5 packet were transmitted and 5 packet received, then it means that the DNS(doman name system) is able to resolve domain-name to IP address thus you are connected to the internet. **Configuring network interfaces manually** From 600e2e7466d1a8f64b7c442f1d00708b53f7b22b Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Wed, 4 Jun 2025 07:55:52 +0100 Subject: [PATCH 16/38] fix error related to markdown linting --- docs/netplan_doc.md | 145 +++++++++++++++++++++++++++++--------------- 1 file changed, 96 insertions(+), 49 deletions(-) diff --git a/docs/netplan_doc.md b/docs/netplan_doc.md index 75598f66..f5916947 100644 --- a/docs/netplan_doc.md +++ b/docs/netplan_doc.md @@ -1,14 +1,27 @@ # NETWORK CONFIGURATION USING NETPLAN WITH ANSIBLE -## WHAT IS NETPLAN +## WHAT IS NETPLAN -Netplan is a modern network configuration tool, primarily used in Ubuntu-based Linux distributions. Its goal is to simplify the management of network interfaces through the use of YAML files. Before its introduction, network configuration in Linux was done through files like /etc/network/interfaces or other methods specific to the services used, like NetworkManager or systemd-networkd. With Netplan, these configurations are unified, providing a standard and accessible solution. +Netplan is a modern network configuration tool, primarily used in Ubuntu-based +Linux distributions. Its goal is to simplify the management of network interfaces +through the use of YAML files. Before its introduction, network configuration in +Linux was done through files like /etc/network/interfaces or other methods +specific to the services used, like NetworkManager or systemd-networkd. With +Netplan, these configurations are unified, providing a standard and accessible +solution. -This guide is designed to show you how to use Netplan with ansible to efficiently configure your network interfaces, whether you need to manage Ethernet connections, Wi-Fi, or even advanced configurations like VLANs and static routes, alongside with ansible to automate all this tedious processes. +This guide is designed to show you how to use Netplan with ansible to efficiently +configure your network interfaces, whether you need to manage Ethernet +connections, Wi-Fi, or even advanced configurations like VLANs and static routes, +alongside with ansible to automate all this tedious processes. ## WHY NETPLAN -Netplan was first introduced to the Ubuntu universe in version 17.10 (Artful Aardvark). Prior to this release, Linux server and system administrators often used traditional file and ifup/down/etc/network/interfaces tools to manage their network interfaces. These methods, while widely used, were becoming increasingly limited in modern, complex network environments. +Netplan was first introduced to the Ubuntu universe in version 17.10 (Artful +Aardvark). Prior to this release, Linux server and system administrators often +used traditional file and ifup/down/etc/network/interfaces tools to manage their +network interfaces. These methods, while widely used, were becoming increasingly +limited in modern, complex network environments. With the emergence of new needs, particularly around dynamic network management, the need for a tool that unifies the different network services has become @@ -21,24 +34,38 @@ Netplan is the choice for Ubuntu distributions that enabled a smoother transitio to cloud infrastructures and virtualized environments, where tools like cloud-init benefit from automated and more flexible network configuration. -**What are NetworkManager and systemd-networkd?** +## Network Managers -As mentioned above, Netplan acts as a unified configuration interface for two main network managers: NetworkManager and systemd-networkd. Both services play a key role in managing network interfaces on Ubuntu distributions and its derivatives, but they are not used in the same contexts. +As mentioned above, Netplan acts as a unified configuration interface for two +main network managers: NetworkManager and systemd-networkd. Both services play a +key role in managing network interfaces on Ubuntu distributions and its +derivatives, but they are not used in the same contexts. -**Network Manager** +### Network Manager -NetworkManager is the network manager primarily used on desktop systems like Ubuntu Desktop or its graphical derivatives such as Kubuntu and Lubuntu. It is designed to simplify network connection management, especially in environments where interfaces change frequently, such as with Wi-Fi connections, VPNs, or mobile networks. +NetworkManager is the network manager primarily used on desktop systems like +Ubuntu Desktop or its graphical derivatives such as Kubuntu and Lubuntu. It is +designed to simplify network connection management, especially in environments +where interfaces change frequently, such as with Wi-Fi connections, VPNs, or +mobile networks. -On a system using NetworkManager, you often have access to a graphical interface, such as the one built into the GNOME desktop environment, to manage networks. This makes NetworkManager ideal for workstations where flexibility and user interaction are essential. +On a system using NetworkManager, you often have access to a graphical interface, +such as the one built into the GNOME desktop environment, to manage networks. +This makes NetworkManager ideal for workstations where flexibility and user +interaction are essential. -**systemd-networkd** +### systemd-networkd -systemd-networkd, on the other hand, is more often used on server systems, such as Ubuntu Server, where network interface management is more static and does not require frequent user interaction. This service is minimalistic and seamlessly integrated into the systemd system, making it suitable for servers and headless environments. +systemd-networkd, on the other hand, is more often used on server systems, such +as Ubuntu Server, where network interface management is more static and does not +require frequent user interaction. This service is minimalistic and seamlessly +integrated into the systemd system, making it suitable for servers and headless +environments. -**checking your manager** +## Checking Your Network Manager It is important to know which network manager is active, as it determines how -**Netplan** will apply your network configuration. +Netplan will apply your network configuration. To check if NetworkManager is installed and active, you can run the following command: @@ -46,6 +73,7 @@ command: ```sh sudo systemctl status NetworkManager ``` + If the service is active, you will see a return indicating status as "running". Otherwise, the service will be inactive or uninstalled. @@ -58,7 +86,7 @@ sudo systemctl status systemd-networkd Similarly, if this service is active, it indicates that systemd-networkd is managing the network. -**Netplan File Structure and Permissions** +## Netplan File Structure and Permissions The configuration files used by Netplan are in YAML format, a simple and readable format that makes it easy to configure network interfaces. These files are @@ -80,23 +108,29 @@ network: Explanation: -- network: Main block that contains all network configurations. -- version: The version of the Netplan configuration file (currently it is version 2). +- network: Main block that contains all network configurations +- version: The version of the Netplan configuration file (currently it is version 2) - renderer: Defines which service manages network configuration. Here, networkd means that systemd-networkd is used. For a desktop environment, one can use - NetworkManager. + NetworkManager - ethernets: This block contains the Ethernet interfaces. In this example, eth0 - is the interface being configured. -- dhcp4: Enables DHCP for IPv4, which assigns an IP address automatically. + is the interface being configured +- dhcp4: Enables DHCP for IPv4, which assigns an IP address automatically +## Typical Configurations with Netplan -## Typical configurations with Netplan +Netplan is a flexible tool that allows you to configure different types of +networks: IPv4 and IPv6 addresses, DHCP or static configurations, as well as more +complex scenarios like network bridges, link aggregation (bonding), and Wi-Fi +connections. Here is a set of typical configurations that cover these different +cases. -Netplan is a flexible tool that allows you to configure different types of networks: IPv4 and IPv6 addresses , DHCP or static configurations , as well as more complex scenarios like network bridges , link aggregation (bonding), and Wi-Fi connections . Here is a set of typical configurations that cover these different cases. +### IPv4 Configuration with DHCP -**IPv4 configuration with DHCP** +To configure a network interface with an IPv4 address obtained via DHCP, here is +a simple configuration. This is commonly used for workstations or servers in +environments where the IP address is automatically provided by a DHCP server: -To configure a network interface with an IPv4 address obtained via DHCP , here is a simple configuration. This is commonly used for workstations or servers in environments where the IP address is automatically provided by a DHCP server : ```sh network: version: 2 @@ -106,11 +140,13 @@ network: dhcp4: true ``` -In this example, the eth0 interface automatically obtains an IPv4 address via DHCP. +In this example, the eth0 interface automatically obtains an IPv4 address via +DHCP. -**Configuring a fixed IPv4 address** +### Configuring a Fixed IPv4 Address -If you need a static IPv4 address for your interface, for example for a server, here's how to configure that: +If you need a static IPv4 address for your interface, for example for a server, +here's how to configure that: ```sh network: @@ -127,13 +163,14 @@ network: - 8.8.4.4 ``` -- addresses: Sets the static IP address with the subnet mask (/24). -- gateway4: specifies the default gateway. -- nameservers: defines the DNS servers (here, those of Google). +- addresses: Sets the static IP address with the subnet mask (/24) +- gateway4: specifies the default gateway +- nameservers: defines the DNS servers (here, those of Google) -**IPv6 Configuration with DHCP** +### IPv6 Configuration with DHCP -To configure an interface to obtain an IPv6 address via DHCP , the syntax is similar to that for IPv4 . Here's how to configure DHCP for IPv6 on Netplan : +To configure an interface to obtain an IPv6 address via DHCP, the syntax is +similar to that for IPv4. Here's how to configure DHCP for IPv6 on Netplan: ```sh network: @@ -144,11 +181,12 @@ network: dhcp6: true ``` -This configuration allows the eth0 interface to obtain a dynamic IPv6 address via DHCPv6 . +This configuration allows the eth0 interface to obtain a dynamic IPv6 address via +DHCPv6. -**Configuring a Static IPv6 Address** +### Configuring a Static IPv6 Address -To set a static IPv6 address , here is an example configuration: +To set a static IPv6 address, here is an example configuration: ```sh network: @@ -165,13 +203,14 @@ network: - 2001:4860:4860::8844 ``` -- addresses: specifies the static IPv6 address and its prefix ( /64). -- gateway6: Sets the default gateway for IPv6 . -- nameservers: Sets the DNS servers for IPv6 . +- addresses: specifies the static IPv6 address and its prefix (/64) +- gateway6: Sets the default gateway for IPv6 +- nameservers: Sets the DNS servers for IPv6 -**Wi-Fi configuration** +### Wi-Fi Configuration -Setting up a Wi-Fi network with Netplan requires specifying the SSID and security key. Here's an example of how to configure a Wi-Fi interface : +Setting up a Wi-Fi network with Netplan requires specifying the SSID and security +key. Here's an example of how to configure a Wi-Fi interface: ```sh network: @@ -187,32 +226,39 @@ network: In this example: -- wlan0 is the Wi-Fi interface . -- access-pointsspecifies the Wi-Fi network name ( MonSSID) and its password. -- dhcp4: true indicates that the Wi-Fi interface +- wlan0 is the Wi-Fi interface +- access-points specifies the Wi-Fi network name (MonSSID) and its password +- dhcp4: true indicates that the Wi-Fi interface uses DHCP -**Checking network connectivity** +## Checking Network Connectivity -If you have followed the [ubuntu server installation]() documentation, then no need of configuring the network interface for wi-fi or ethernet manually, because it was surely configured during the installation of ubuntu server. You may use the following command to ensure that network connection is well configured: +If you have followed the Ubuntu server installation documentation, then no need of +configuring the network interface for Wi-Fi or ethernet manually, because it was +surely configured during the installation of Ubuntu server. You may use the +following command to ensure that network connection is well configured: ```sh cat /etc/netplan/50-cloud-init.yaml ``` -Also, you can use the following commands to check whether you are connected to internet: +Also, you can use the following commands to check whether you are connected to +internet: ```sh ping -c 5 8.8.8.8 ``` + OR ```sh ping -c 5 google.com ``` -If you see zero packet loss, all the 5 packet were transmitted and 5 packet received, then it means that the DNS(doman name system) is able to resolve domain-name to IP address thus you are connected to the internet. +If you see zero packet loss, all the 5 packet were transmitted and 5 packet +received, then it means that the DNS (domain name system) is able to resolve +domain-name to IP address thus you are connected to the internet. -**Configuring network interfaces manually** +## Configuring Network Interfaces Manually If you want to configure Wi-Fi, static IPv4, static IPv6, IPv4 with DHCP, or IPv6 with DHCP manually, do the following: @@ -222,17 +268,18 @@ IPv6 with DHCP manually, do the following: ```sh sudo nano /etc/netplan/50-cloud-init.yaml ``` + Then replace the configuration with any of the configurations above, depending on your choice. 2. To apply the changes, run the following command: + ```sh netplan generate netplan apply ``` -**Configuring network interfaces manually using Ansible script along with -playbook** +## Configuring Network Interfaces with Ansible To configure any of these network interfaces manually using Ansible script, do the following: From 57ec63651dbcc3452e007b63d5b088c1e3b12f1d Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Wed, 4 Jun 2025 08:01:28 +0100 Subject: [PATCH 17/38] fix error related to markdown linting --- docs/netplan_doc.md | 144 ++++++++++++++++++++++---------------------- 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/docs/netplan_doc.md b/docs/netplan_doc.md index f5916947..ab0d0373 100644 --- a/docs/netplan_doc.md +++ b/docs/netplan_doc.md @@ -2,79 +2,79 @@ ## WHAT IS NETPLAN -Netplan is a modern network configuration tool, primarily used in Ubuntu-based -Linux distributions. Its goal is to simplify the management of network interfaces -through the use of YAML files. Before its introduction, network configuration in -Linux was done through files like /etc/network/interfaces or other methods -specific to the services used, like NetworkManager or systemd-networkd. With -Netplan, these configurations are unified, providing a standard and accessible +Netplan is a modern network configuration tool, primarily used in Ubuntu-based +Linux distributions. Its goal is to simplify the management of network interfaces +through the use of YAML files. Before its introduction, network configuration in +Linux was done through files like /etc/network/interfaces or other methods +specific to the services used, like NetworkManager or systemd-networkd. With +Netplan, these configurations are unified, providing a standard and accessible solution. -This guide is designed to show you how to use Netplan with ansible to efficiently -configure your network interfaces, whether you need to manage Ethernet -connections, Wi-Fi, or even advanced configurations like VLANs and static routes, +This guide is designed to show you how to use Netplan with ansible to efficiently +configure your network interfaces, whether you need to manage Ethernet +connections, Wi-Fi, or even advanced configurations like VLANs and static routes, alongside with ansible to automate all this tedious processes. ## WHY NETPLAN -Netplan was first introduced to the Ubuntu universe in version 17.10 (Artful -Aardvark). Prior to this release, Linux server and system administrators often -used traditional file and ifup/down/etc/network/interfaces tools to manage their -network interfaces. These methods, while widely used, were becoming increasingly +Netplan was first introduced to the Ubuntu universe in version 17.10 (Artful +Aardvark). Prior to this release, Linux server and system administrators often +used traditional file and ifup/down/etc/network/interfaces tools to manage their +network interfaces. These methods, while widely used, were becoming increasingly limited in modern, complex network environments. -With the emergence of new needs, particularly around dynamic network management, -the need for a tool that unifies the different network services has become -apparent. Netplan is designed to fill this gap. It acts as an overlay simplifying -the management of systemd-networkd (systemd is the network manager) and -NetworkManager. This allows administrators to use a single, simplified syntax, +With the emergence of new needs, particularly around dynamic network management, +the need for a tool that unifies the different network services has become +apparent. Netplan is designed to fill this gap. It acts as an overlay simplifying +the management of systemd-networkd (systemd is the network manager) and +NetworkManager. This allows administrators to use a single, simplified syntax, regardless of the underlying service. -Netplan is the choice for Ubuntu distributions that enabled a smoother transition -to cloud infrastructures and virtualized environments, where tools like cloud-init +Netplan is the choice for Ubuntu distributions that enabled a smoother transition +to cloud infrastructures and virtualized environments, where tools like cloud-init benefit from automated and more flexible network configuration. ## Network Managers -As mentioned above, Netplan acts as a unified configuration interface for two -main network managers: NetworkManager and systemd-networkd. Both services play a -key role in managing network interfaces on Ubuntu distributions and its +As mentioned above, Netplan acts as a unified configuration interface for two +main network managers: NetworkManager and systemd-networkd. Both services play a +key role in managing network interfaces on Ubuntu distributions and its derivatives, but they are not used in the same contexts. ### Network Manager -NetworkManager is the network manager primarily used on desktop systems like -Ubuntu Desktop or its graphical derivatives such as Kubuntu and Lubuntu. It is -designed to simplify network connection management, especially in environments -where interfaces change frequently, such as with Wi-Fi connections, VPNs, or +NetworkManager is the network manager primarily used on desktop systems like +Ubuntu Desktop or its graphical derivatives such as Kubuntu and Lubuntu. It is +designed to simplify network connection management, especially in environments +where interfaces change frequently, such as with Wi-Fi connections, VPNs, or mobile networks. -On a system using NetworkManager, you often have access to a graphical interface, -such as the one built into the GNOME desktop environment, to manage networks. -This makes NetworkManager ideal for workstations where flexibility and user +On a system using NetworkManager, you often have access to a graphical interface, +such as the one built into the GNOME desktop environment, to manage networks. +This makes NetworkManager ideal for workstations where flexibility and user interaction are essential. ### systemd-networkd -systemd-networkd, on the other hand, is more often used on server systems, such -as Ubuntu Server, where network interface management is more static and does not -require frequent user interaction. This service is minimalistic and seamlessly -integrated into the systemd system, making it suitable for servers and headless +systemd-networkd, on the other hand, is more often used on server systems, such +as Ubuntu Server, where network interface management is more static and does not +require frequent user interaction. This service is minimalistic and seamlessly +integrated into the systemd system, making it suitable for servers and headless environments. ## Checking Your Network Manager -It is important to know which network manager is active, as it determines how +It is important to know which network manager is active, as it determines how Netplan will apply your network configuration. -To check if NetworkManager is installed and active, you can run the following +To check if NetworkManager is installed and active, you can run the following command: ```sh sudo systemctl status NetworkManager ``` -If the service is active, you will see a return indicating status as "running". +If the service is active, you will see a return indicating status as "running". Otherwise, the service will be inactive or uninstalled. To check if systemd-networkd is active, use the following command: @@ -83,18 +83,18 @@ To check if systemd-networkd is active, use the following command: sudo systemctl status systemd-networkd ``` -Similarly, if this service is active, it indicates that systemd-networkd is +Similarly, if this service is active, it indicates that systemd-networkd is managing the network. ## Netplan File Structure and Permissions -The configuration files used by Netplan are in YAML format, a simple and readable -format that makes it easy to configure network interfaces. These files are -located in the directory /etc/netplan/ and it is from there that network +The configuration files used by Netplan are in YAML format, a simple and readable +format that makes it easy to configure network interfaces. These files are +located in the directory /etc/netplan/ and it is from there that network configurations are applied. -Each Netplan file follows a strict YAML syntax with well-defined indentations. -Here is a simple example of a configuration where the Ethernet interface uses +Each Netplan file follows a strict YAML syntax with well-defined indentations. +Here is a simple example of a configuration where the Ethernet interface uses DHCP to obtain an IP address automatically: ```sh @@ -110,25 +110,25 @@ Explanation: - network: Main block that contains all network configurations - version: The version of the Netplan configuration file (currently it is version 2) -- renderer: Defines which service manages network configuration. Here, networkd - means that systemd-networkd is used. For a desktop environment, one can use +- renderer: Defines which service manages network configuration. Here, networkd + means that systemd-networkd is used. For a desktop environment, one can use NetworkManager -- ethernets: This block contains the Ethernet interfaces. In this example, eth0 +- ethernets: This block contains the Ethernet interfaces. In this example, eth0 is the interface being configured - dhcp4: Enables DHCP for IPv4, which assigns an IP address automatically ## Typical Configurations with Netplan -Netplan is a flexible tool that allows you to configure different types of -networks: IPv4 and IPv6 addresses, DHCP or static configurations, as well as more -complex scenarios like network bridges, link aggregation (bonding), and Wi-Fi -connections. Here is a set of typical configurations that cover these different +Netplan is a flexible tool that allows you to configure different types of +networks: IPv4 and IPv6 addresses, DHCP or static configurations, as well as more +complex scenarios like network bridges, link aggregation (bonding), and Wi-Fi +connections. Here is a set of typical configurations that cover these different cases. ### IPv4 Configuration with DHCP -To configure a network interface with an IPv4 address obtained via DHCP, here is -a simple configuration. This is commonly used for workstations or servers in +To configure a network interface with an IPv4 address obtained via DHCP, here is +a simple configuration. This is commonly used for workstations or servers in environments where the IP address is automatically provided by a DHCP server: ```sh @@ -140,12 +140,12 @@ network: dhcp4: true ``` -In this example, the eth0 interface automatically obtains an IPv4 address via +In this example, the eth0 interface automatically obtains an IPv4 address via DHCP. ### Configuring a Fixed IPv4 Address -If you need a static IPv4 address for your interface, for example for a server, +If you need a static IPv4 address for your interface, for example for a server, here's how to configure that: ```sh @@ -169,7 +169,7 @@ network: ### IPv6 Configuration with DHCP -To configure an interface to obtain an IPv6 address via DHCP, the syntax is +To configure an interface to obtain an IPv6 address via DHCP, the syntax is similar to that for IPv4. Here's how to configure DHCP for IPv6 on Netplan: ```sh @@ -181,7 +181,7 @@ network: dhcp6: true ``` -This configuration allows the eth0 interface to obtain a dynamic IPv6 address via +This configuration allows the eth0 interface to obtain a dynamic IPv6 address via DHCPv6. ### Configuring a Static IPv6 Address @@ -209,7 +209,7 @@ network: ### Wi-Fi Configuration -Setting up a Wi-Fi network with Netplan requires specifying the SSID and security +Setting up a Wi-Fi network with Netplan requires specifying the SSID and security key. Here's an example of how to configure a Wi-Fi interface: ```sh @@ -232,16 +232,16 @@ In this example: ## Checking Network Connectivity -If you have followed the Ubuntu server installation documentation, then no need of -configuring the network interface for Wi-Fi or ethernet manually, because it was -surely configured during the installation of Ubuntu server. You may use the +If you have followed the Ubuntu server installation documentation, then no need of +configuring the network interface for Wi-Fi or ethernet manually, because it was +surely configured during the installation of Ubuntu server. You may use the following command to ensure that network connection is well configured: ```sh cat /etc/netplan/50-cloud-init.yaml ``` -Also, you can use the following commands to check whether you are connected to +Also, you can use the following commands to check whether you are connected to internet: ```sh @@ -254,13 +254,13 @@ OR ping -c 5 google.com ``` -If you see zero packet loss, all the 5 packet were transmitted and 5 packet -received, then it means that the DNS (domain name system) is able to resolve +If you see zero packet loss, all the 5 packet were transmitted and 5 packet +received, then it means that the DNS (domain name system) is able to resolve domain-name to IP address thus you are connected to the internet. ## Configuring Network Interfaces Manually -If you want to configure Wi-Fi, static IPv4, static IPv6, IPv4 with DHCP, or +If you want to configure Wi-Fi, static IPv4, static IPv6, IPv4 with DHCP, or IPv6 with DHCP manually, do the following: 1. You need to: @@ -269,7 +269,7 @@ IPv6 with DHCP manually, do the following: sudo nano /etc/netplan/50-cloud-init.yaml ``` -Then replace the configuration with any of the configurations above, depending +Then replace the configuration with any of the configurations above, depending on your choice. 2. To apply the changes, run the following command: @@ -281,10 +281,10 @@ netplan apply ## Configuring Network Interfaces with Ansible -To configure any of these network interfaces manually using Ansible script, do +To configure any of these network interfaces manually using Ansible script, do the following: -1. We need to install Ansible on our machine to be able to run Ansible scripts. +1. We need to install Ansible on our machine to be able to run Ansible scripts. Run the following command to install Ansible: ```sh @@ -297,7 +297,7 @@ python3 install ansible --user 2. Create a playbook.yml file, copy and paste the following: -```sh +```yaml --- - name: Configure Ethernet with static IP using Netplan hosts: localhost @@ -355,12 +355,12 @@ inet 192.168.1.100/24 brd 192.168.1.255 scope global ens33 Then this indicates that your network interface "ens33" has been configured. -Alternatively, if you want to configure a wireless network interface with a -static IP address (i.e., a network interface that uses Wi-Fi), replace the -content in the /etc/netplan/50-cloud-init.yaml file with the following Ansible +Alternatively, if you want to configure a wireless network interface with a +static IP address (i.e., a network interface that uses Wi-Fi), replace the +content in the /etc/netplan/50-cloud-init.yaml file with the following Ansible script: -```sh +```yaml --- - name: Configure Wi-Fi with static IP using Netplan hosts: localhost From 68a3706f626670753767e855aff8c76e9be976e3 Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Wed, 4 Jun 2025 08:12:19 +0100 Subject: [PATCH 18/38] fix error related to markdown linting --- docs/netplan_doc.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/netplan_doc.md b/docs/netplan_doc.md index ab0d0373..3af28844 100644 --- a/docs/netplan_doc.md +++ b/docs/netplan_doc.md @@ -349,7 +349,7 @@ sudo ansible-playbook -i host playbook.yaml If your output looks like this: -``` +```text inet 192.168.1.100/24 brd 192.168.1.255 scope global ens33 ``` @@ -408,7 +408,7 @@ script: If your output looks like this: -``` +```text inet 192.168.1.100/24 brd 192.168.1.255 scope global wlan0 ``` From 109646dc22dd4792aa9f1855ea12019b0c141f81 Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Wed, 4 Jun 2025 08:27:14 +0100 Subject: [PATCH 19/38] fix error related to markdown linting --- docs/netplan_doc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/netplan_doc.md b/docs/netplan_doc.md index 3af28844..3bef9d5c 100644 --- a/docs/netplan_doc.md +++ b/docs/netplan_doc.md @@ -412,4 +412,4 @@ If your output looks like this: inet 192.168.1.100/24 brd 192.168.1.255 scope global wlan0 ``` -Then this indicates that your network interface "wlan0" has been configured. +Then this indicates that your network interface "wlan0" has been configured. \ No newline at end of file From b25bc71c0cea2a6b706f5f5b69ffc36cc488c4fb Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Wed, 4 Jun 2025 08:39:17 +0100 Subject: [PATCH 20/38] fix error related to markdown linting --- docs/netplan_doc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/netplan_doc.md b/docs/netplan_doc.md index 3bef9d5c..f8eac4ac 100644 --- a/docs/netplan_doc.md +++ b/docs/netplan_doc.md @@ -256,7 +256,7 @@ ping -c 5 google.com If you see zero packet loss, all the 5 packet were transmitted and 5 packet received, then it means that the DNS (domain name system) is able to resolve -domain-name to IP address thus you are connected to the internet. +domain-name to IP address and you are connected to the internet. ## Configuring Network Interfaces Manually From 4ef4f0521bcfc7cb24e8c534323cd07cbb54ec93 Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Wed, 4 Jun 2025 09:26:46 +0100 Subject: [PATCH 21/38] fix error related to markdown linting --- docs/netplan_doc.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/netplan_doc.md b/docs/netplan_doc.md index f8eac4ac..66676470 100644 --- a/docs/netplan_doc.md +++ b/docs/netplan_doc.md @@ -109,7 +109,8 @@ network: Explanation: - network: Main block that contains all network configurations -- version: The version of the Netplan configuration file (currently it is version 2) +- version: The version of the Netplan configuration file +(currently it is version 2) - renderer: Defines which service manages network configuration. Here, networkd means that systemd-networkd is used. For a desktop environment, one can use NetworkManager From 736353b376ca87d37774874f6da721b568ee4e59 Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Wed, 4 Jun 2025 09:43:54 +0100 Subject: [PATCH 22/38] fix error related to markdown linting --- docs/netplan_doc.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/netplan_doc.md b/docs/netplan_doc.md index 66676470..05b7bd28 100644 --- a/docs/netplan_doc.md +++ b/docs/netplan_doc.md @@ -273,7 +273,7 @@ sudo nano /etc/netplan/50-cloud-init.yaml Then replace the configuration with any of the configurations above, depending on your choice. -2. To apply the changes, run the following command: +1. To apply the changes, run the following command: ```sh netplan generate @@ -296,7 +296,7 @@ sudo apt install -y build-essential libssl-dev libffi-dev python3-dev python3-pi python3 install ansible --user ``` -2. Create a playbook.yml file, copy and paste the following: +1. Create a playbook.yml file, copy and paste the following: ```yaml --- From 7acd360737f3d580eb36242eb0894460abc5053e Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Wed, 4 Jun 2025 10:13:07 +0100 Subject: [PATCH 23/38] fix error related to markdown linting --- docs/netplan_doc.md | 55 ++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/docs/netplan_doc.md b/docs/netplan_doc.md index 05b7bd28..5d624503 100644 --- a/docs/netplan_doc.md +++ b/docs/netplan_doc.md @@ -10,10 +10,10 @@ specific to the services used, like NetworkManager or systemd-networkd. With Netplan, these configurations are unified, providing a standard and accessible solution. -This guide is designed to show you how to use Netplan with ansible to efficiently +This guide is designed to show you how to use Netplan with Ansible to efficiently configure your network interfaces, whether you need to manage Ethernet connections, Wi-Fi, or even advanced configurations like VLANs and static routes, -alongside with ansible to automate all this tedious processes. +alongside with Ansible to automate all these tedious processes. ## WHY NETPLAN @@ -38,7 +38,7 @@ benefit from automated and more flexible network configuration. As mentioned above, Netplan acts as a unified configuration interface for two main network managers: NetworkManager and systemd-networkd. Both services play a -key role in managing network interfaces on Ubuntu distributions and its +key role in managing network interfaces on Ubuntu distributions and their derivatives, but they are not used in the same contexts. ### Network Manager @@ -108,15 +108,14 @@ network: Explanation: -- network: Main block that contains all network configurations -- version: The version of the Netplan configuration file -(currently it is version 2) +- network: Main block that contains all network configurations. +- version: The version of the Netplan configuration file (version 2). - renderer: Defines which service manages network configuration. Here, networkd means that systemd-networkd is used. For a desktop environment, one can use - NetworkManager + NetworkManager. - ethernets: This block contains the Ethernet interfaces. In this example, eth0 - is the interface being configured -- dhcp4: Enables DHCP for IPv4, which assigns an IP address automatically + is the interface being configured. +- dhcp4: Enables DHCP for IPv4, which assigns an IP address automatically. ## Typical Configurations with Netplan @@ -164,9 +163,9 @@ network: - 8.8.4.4 ``` -- addresses: Sets the static IP address with the subnet mask (/24) -- gateway4: specifies the default gateway -- nameservers: defines the DNS servers (here, those of Google) +- addresses: Sets the static IP address with the subnet mask (/24). +- gateway4: Specifies the default gateway. +- nameservers: Defines the DNS servers (here, those of Google). ### IPv6 Configuration with DHCP @@ -204,9 +203,9 @@ network: - 2001:4860:4860::8844 ``` -- addresses: specifies the static IPv6 address and its prefix (/64) -- gateway6: Sets the default gateway for IPv6 -- nameservers: Sets the DNS servers for IPv6 +- addresses: Specifies the static IPv6 address and its prefix (/64). +- gateway6: Sets the default gateway for IPv6. +- nameservers: Sets the DNS servers for IPv6. ### Wi-Fi Configuration @@ -227,15 +226,15 @@ network: In this example: -- wlan0 is the Wi-Fi interface -- access-points specifies the Wi-Fi network name (MonSSID) and its password -- dhcp4: true indicates that the Wi-Fi interface uses DHCP +- wlan0 is the Wi-Fi interface. +- access-points specifies the Wi-Fi network name (MonSSID) and its password. +- dhcp4: true indicates that the Wi-Fi interface uses DHCP. ## Checking Network Connectivity -If you have followed the Ubuntu server installation documentation, then no need of -configuring the network interface for Wi-Fi or ethernet manually, because it was -surely configured during the installation of Ubuntu server. You may use the +If you have followed the Ubuntu server installation documentation, then there is no +need to configure the network interface for Wi-Fi or ethernet manually, because it +was surely configured during the installation of Ubuntu server. You may use the following command to ensure that network connection is well configured: ```sh @@ -243,7 +242,7 @@ cat /etc/netplan/50-cloud-init.yaml ``` Also, you can use the following commands to check whether you are connected to -internet: +the internet: ```sh ping -c 5 8.8.8.8 @@ -255,9 +254,9 @@ OR ping -c 5 google.com ``` -If you see zero packet loss, all the 5 packet were transmitted and 5 packet -received, then it means that the DNS (domain name system) is able to resolve -domain-name to IP address and you are connected to the internet. +If you see zero packet loss, all 5 packets were transmitted and 5 packets +received, then it means that the DNS (Domain Name System) is able to resolve +domain names to IP addresses and you are connected to the internet. ## Configuring Network Interfaces Manually @@ -273,7 +272,7 @@ sudo nano /etc/netplan/50-cloud-init.yaml Then replace the configuration with any of the configurations above, depending on your choice. -1. To apply the changes, run the following command: +2. To apply the changes, run the following command: ```sh netplan generate @@ -296,7 +295,7 @@ sudo apt install -y build-essential libssl-dev libffi-dev python3-dev python3-pi python3 install ansible --user ``` -1. Create a playbook.yml file, copy and paste the following: +2. Create a playbook.yml file, copy and paste the following: ```yaml --- @@ -413,4 +412,4 @@ If your output looks like this: inet 192.168.1.100/24 brd 192.168.1.255 scope global wlan0 ``` -Then this indicates that your network interface "wlan0" has been configured. \ No newline at end of file +Then this indicates that your network interface "wlan0" has been configured. From e054d388772369a399c6f7a218a71f58f47fa4e1 Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Wed, 4 Jun 2025 11:02:25 +0100 Subject: [PATCH 24/38] fix error related to markdown linting --- docs/netplan_doc.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/netplan_doc.md b/docs/netplan_doc.md index 5d624503..c86ac5de 100644 --- a/docs/netplan_doc.md +++ b/docs/netplan_doc.md @@ -284,7 +284,7 @@ netplan apply To configure any of these network interfaces manually using Ansible script, do the following: -1. We need to install Ansible on our machine to be able to run Ansible scripts. +i. We need to install Ansible on our machine to be able to run Ansible scripts. Run the following command to install Ansible: ```sh @@ -295,7 +295,7 @@ sudo apt install -y build-essential libssl-dev libffi-dev python3-dev python3-pi python3 install ansible --user ``` -2. Create a playbook.yml file, copy and paste the following: +ii. Create a playbook.yml file, copy and paste the following: ```yaml --- @@ -341,7 +341,7 @@ python3 install ansible --user var: ip_result.stdout_lines ``` -3. To execute the Ansible code, run this command: +iii. To execute the Ansible code, run this command: ```sh sudo ansible-playbook -i host playbook.yaml From b2770b9376ef3a11ef7cdbf7945f281fd1ae3702 Mon Sep 17 00:00:00 2001 From: donemmanuelo Date: Wed, 4 Jun 2025 11:11:33 +0100 Subject: [PATCH 25/38] fix error related to markdown linting --- docs/netplan_doc.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/netplan_doc.md b/docs/netplan_doc.md index c86ac5de..af97a415 100644 --- a/docs/netplan_doc.md +++ b/docs/netplan_doc.md @@ -232,10 +232,10 @@ In this example: ## Checking Network Connectivity -If you have followed the Ubuntu server installation documentation, then there is no -need to configure the network interface for Wi-Fi or ethernet manually, because it -was surely configured during the installation of Ubuntu server. You may use the -following command to ensure that network connection is well configured: +If you have followed the Ubuntu server installation documentation, then there is +no need to configure the network interface for Wi-Fi or ethernet manually, +because it was surely configured during the installation of Ubuntu server. You may +use the following command to ensure that network connection is well configured: ```sh cat /etc/netplan/50-cloud-init.yaml @@ -263,7 +263,7 @@ domain names to IP addresses and you are connected to the internet. If you want to configure Wi-Fi, static IPv4, static IPv6, IPv4 with DHCP, or IPv6 with DHCP manually, do the following: -1. You need to: +1- You need to: ```sh sudo nano /etc/netplan/50-cloud-init.yaml @@ -272,7 +272,7 @@ sudo nano /etc/netplan/50-cloud-init.yaml Then replace the configuration with any of the configurations above, depending on your choice. -2. To apply the changes, run the following command: +2- To apply the changes, run the following command: ```sh netplan generate From f2b20c020b9c980e915680bc4a278e92c5634258 Mon Sep 17 00:00:00 2001 From: jagoum Date: Sat, 31 May 2025 09:55:13 +0100 Subject: [PATCH 26/38] fix(file structure): organised file system structure --- docs/tutorails/setupvswitch.md | 157 ---------------- scripts/ansible/create_lab.yml | 26 --- scripts/ansible/inventory.ini | 10 -- scripts/ansible/playbook1.yml | 93 ---------- scripts/ansible/vars.yml | 27 --- scripts/config_vlan.sh | 82 --------- scripts/config_vlan2.sh | 178 ------------------ scripts/data.txt | 10 -- scripts/minimal_kvm_setup.yml | 28 --- scripts/ntp_setup.yml | 9 - scripts/run.sh | 2 - scripts/setup_vswitch.sh | 31 ---- scripts/setup_vswitch.yml | 42 ----- tutorials/docs/boot_docs.md | 299 ------------------------------- tutorials/docs/images/image0.png | Bin 131166 -> 0 bytes tutorials/docs/images/image1.png | Bin 111891 -> 0 bytes tutorials/docs/images/image2.png | Bin 110758 -> 0 bytes tutorials/docs/images/image3.png | Bin 112147 -> 0 bytes tutorials/docs/images/image4.png | Bin 51145 -> 0 bytes tutorials/docs/images/img1.png | Bin 36984 -> 0 bytes tutorials/docs/images/img10.png | Bin 60200 -> 0 bytes tutorials/docs/images/img11.png | Bin 54305 -> 0 bytes tutorials/docs/images/img12.png | Bin 77187 -> 0 bytes tutorials/docs/images/img13.png | Bin 70009 -> 0 bytes tutorials/docs/images/img14.png | Bin 94426 -> 0 bytes tutorials/docs/images/img15.png | Bin 100015 -> 0 bytes tutorials/docs/images/img16.png | Bin 60047 -> 0 bytes tutorials/docs/images/img17.png | Bin 60965 -> 0 bytes tutorials/docs/images/img18.png | Bin 57542 -> 0 bytes tutorials/docs/images/img19.png | Bin 164551 -> 0 bytes tutorials/docs/images/img2.png | Bin 386511 -> 0 bytes tutorials/docs/images/img20.png | Bin 143563 -> 0 bytes tutorials/docs/images/img21.png | Bin 142226 -> 0 bytes tutorials/docs/images/img22.png | Bin 129583 -> 0 bytes tutorials/docs/images/img3.png | Bin 127327 -> 0 bytes tutorials/docs/images/img4.png | Bin 52803 -> 0 bytes tutorials/docs/images/img5.png | Bin 80133 -> 0 bytes tutorials/docs/images/img6.png | Bin 48722 -> 0 bytes tutorials/docs/images/img7.png | Bin 59303 -> 0 bytes tutorials/docs/images/img8.png | Bin 59866 -> 0 bytes tutorials/docs/images/img9.png | Bin 81319 -> 0 bytes 41 files changed, 994 deletions(-) delete mode 100644 docs/tutorails/setupvswitch.md delete mode 100644 scripts/ansible/create_lab.yml delete mode 100644 scripts/ansible/inventory.ini delete mode 100644 scripts/ansible/playbook1.yml delete mode 100644 scripts/ansible/vars.yml delete mode 100644 scripts/config_vlan.sh delete mode 100644 scripts/config_vlan2.sh delete mode 100644 scripts/data.txt delete mode 100644 scripts/minimal_kvm_setup.yml delete mode 100644 scripts/ntp_setup.yml delete mode 100644 scripts/run.sh delete mode 100644 scripts/setup_vswitch.sh delete mode 100644 scripts/setup_vswitch.yml delete mode 100644 tutorials/docs/boot_docs.md delete mode 100644 tutorials/docs/images/image0.png delete mode 100644 tutorials/docs/images/image1.png delete mode 100644 tutorials/docs/images/image2.png delete mode 100644 tutorials/docs/images/image3.png delete mode 100644 tutorials/docs/images/image4.png delete mode 100644 tutorials/docs/images/img1.png delete mode 100644 tutorials/docs/images/img10.png delete mode 100644 tutorials/docs/images/img11.png delete mode 100644 tutorials/docs/images/img12.png delete mode 100644 tutorials/docs/images/img13.png delete mode 100644 tutorials/docs/images/img14.png delete mode 100644 tutorials/docs/images/img15.png delete mode 100644 tutorials/docs/images/img16.png delete mode 100644 tutorials/docs/images/img17.png delete mode 100644 tutorials/docs/images/img18.png delete mode 100644 tutorials/docs/images/img19.png delete mode 100644 tutorials/docs/images/img2.png delete mode 100644 tutorials/docs/images/img20.png delete mode 100644 tutorials/docs/images/img21.png delete mode 100644 tutorials/docs/images/img22.png delete mode 100644 tutorials/docs/images/img3.png delete mode 100644 tutorials/docs/images/img4.png delete mode 100644 tutorials/docs/images/img5.png delete mode 100644 tutorials/docs/images/img6.png delete mode 100644 tutorials/docs/images/img7.png delete mode 100644 tutorials/docs/images/img8.png delete mode 100644 tutorials/docs/images/img9.png diff --git a/docs/tutorails/setupvswitch.md b/docs/tutorails/setupvswitch.md deleted file mode 100644 index 5c29359a..00000000 --- a/docs/tutorails/setupvswitch.md +++ /dev/null @@ -1,157 +0,0 @@ -# How to Set Up a Virtual Switch with Multipass - -In this tutorial, we will configure a virtual switch (vswitch) for Multipass instances and make them accessible over the network. - -## What is a Switch/Bridge and Why Do We Use It? - -A switch is a networking device that helps us connect different computers together using ethernet cables. The switch has a MAC table that it uses to determine which computer on the network it is supposed to send data packets to. It is also one of the major component devices of layer 2 of the OSI model. - -A bridge is a device that connects two or more local area networks (LANs) that use the same protocol. Bridges act the same way as switches (Virtual Switches in our case). - -We are using a bridge here because our VMs are isolated from our host and we need to connect them so that they can talk with each other. A bridge allows the VMs to talk to each other as if they were on the same network. - -## Main Functions of a Bridge - -- Combines multiple VMs/Containers into a single logical network -- Maintains MAC address table to intelligently forward frames -- Allows devices on the same bridge to communicate directly (except when separated by VLANs) - -## Network Topology Overview - -```mermaid -graph TD - subgraph Host - OVS[OVS Bridge: virt-bridge] - OVS_VLAN0[OVS VLAN0] - OVS_VLAN1[OVS VLAN1] - end - - VM1 -->|ens3| OVS_VLAN0 - VM2 -->|ens3| OVS_VLAN0 - VM3 -->|ens3| OVS_VLAN1 - VM4 -->|ens3| OVS_VLAN1 - - OVS_VLAN0 --> OVS - OVS_VLAN1 --> OVS -``` - -## Prerequisites - -To follow along in this course, you will need: - -- Ubuntu 22.04 LTS or Ubuntu 24.04 LTS -- [Multipass](https://canonical.com/multipass/install) installed -- Root permission or sudo if the user is in the sudoers group -- `ovs-vsctl` installed for creating bridges and adding ports - -The Open vSwitch (OVS) supports virtual LAN technology that helps us split our virtual network into smaller logical partitions for security enforcement: - -```sh -sudo apt install -y openvswitch-switch -``` - -## Creating a Virtual Network - -After putting in place all the requirements, let's dive in! - -### Setting Up the Virtual Switch - -First, we will create a Virtual Switch with VLAN support: - -```sh -# Create Open Virtual Switch (OVS) -sudo ovs-vsctl add-br virt-bridge -ip link set virt-bridge up # to make it known to your system - -# List available bridges -sudo ovs-vsctl list-br - -# Configure VLANs on the OVS -sudo ovs-vsctl set port virt-bridge vlan_mode=native-untagged -sudo ovs-vsctl set port virt-bridge trunks=0,1 # to allow VLAN0 and VLAN1 -``` - -### Creating the VMs - -Now let's create 4 VMs labeled test-vm1 through test-vm4: - -```sh -# Creating VMs with a simple script -for i in {1..4}; do - multipass launch --name test-vm$i --network name=virt-bridge --network name=default 24.04 -done -``` - -This creates 4 VMs running Ubuntu 24.04. - -### Configuring VLAN Tags - -Now we'll configure the VLAN tags. VLAN uses the 802.1Q standard, adding a 12-bit tag to L2 packets that can only be decrypted by machines on the same VLAN. - -1. First, check available interfaces in your VMs: - - ```sh - multipass exec "test-vm1" -- ip -o link show | awk -F ': ' '!/lo/ {print $2; exit}' - # Repeat for other VMs. Use your interface name if not ens3 - ``` - -2. Add machines to VLAN0: - - ```sh - multipass stop test-vm1 test-vm2 # stop VMs before adding ports - sudo ovs-vsctl set port test-vm2-ens3 tag=0 - sudo ovs-vsctl set port test-vm1-ens3 tag=0 - multipass start test-vm1 test-vm2 - ``` - -3. Add machines to VLAN1: - - ```sh - multipass stop test-vm3 test-vm4 - sudo ovs-vsctl set port test-vm3-ens3 tag=1 - sudo ovs-vsctl set port test-vm4-ens3 tag=1 - multipass start test-vm3 test-vm4 - ``` - -4. Verify port settings: - - ```sh - sudo ovs-vsctl show | grep -A 2 "Port" - ``` - -### Network Interface Configuration - -Now we'll configure static IPs for each VM: - -1. For VLAN0 (test-vm1 and test-vm2): - - ```sh - multipass exec test-vmX -- sudo ip link set ens3 up - sudo ip addr add 192.168.100.10X dev ens3 - ``` - -2. For VLAN1 (test-vm3 and test-vm4): - - ```sh - multipass exec test-vmX -- sudo ip link set ens3 up - sudo ip addr add 192.168.200.10X dev ens3 - ``` - -### Testing Connectivity - -Let's verify our network configuration: - -```sh -# Test connectivity -multipass exec test-vm1 -- ping -c 5 192.168.100.102 # Should work -multipass exec test-vm2 -- ping -c 5 192.168.200.103 # Should not work -``` - -## Summary - -In this tutorial, we have covered: - -- Creating a network bridge -- Adding VMs to a network/bridge (always stop instances before attaching) -- Creating and configuring VLANs -- Setting static IPv4 addresses for VM instances diff --git a/scripts/ansible/create_lab.yml b/scripts/ansible/create_lab.yml deleted file mode 100644 index 5f2fd337..00000000 --- a/scripts/ansible/create_lab.yml +++ /dev/null @@ -1,26 +0,0 @@ -- name: Create Multipass instances - hosts: localhost - connection: local - tasks: - - name: Launch control node - command: multipass launch --name ansible-vm1 --cpus 2 --mem 2G --disk 10G - - - name: Launch managed nodes - command: multipass launch --name {{ item }} --cpus 1 --mem 1G --disk 5G - loop: - - node1 - - node2 - -- name: Configure Ansible control node - hosts: ansible-vm1 - tasks: - - name: Install Ansible - apt: - name: ansible - state: present - update_cache: yes - - - name: Ensure Python is installed - apt: - name: python3 - state: present diff --git a/scripts/ansible/inventory.ini b/scripts/ansible/inventory.ini deleted file mode 100644 index 6dad638b..00000000 --- a/scripts/ansible/inventory.ini +++ /dev/null @@ -1,10 +0,0 @@ -[control] -localhost ansible_connection=local - -# this will be configured when the server is ok -[unconfigured_nodes] -future_node1 ansible_host=192.168.1.100 # -# The nodes will be configured as soon as the server is ready - -[multipass_vms:children] -unconfigured_nodes \ No newline at end of file diff --git a/scripts/ansible/playbook1.yml b/scripts/ansible/playbook1.yml deleted file mode 100644 index 6ee6ca7d..00000000 --- a/scripts/ansible/playbook1.yml +++ /dev/null @@ -1,93 +0,0 @@ ---- -- name: Setup OVS and Multipass VMs - hosts: control - become: true - vars_files: - - vars.yml - - tasks: - # This will install the packages wer needed - - name: Install required packages - apt: - name: - - openvswitch-switch - - openvswitch-common - - multipass - - bridge-utils - state: present - update_cache: yes - failed_when: false - register: pkg_status - changed_when: pkg_status.changed - - # Creating OVS bridge to act as vswitch - - name: Create OVS bridge - command: ovs-vsctl add-br {{ ovs_bridge }} - changed_when: false - register: ovs_bridge_create - failed_when: false - - # Setting the bridge up to connect different vms on it - - name: Bring up OVS bridge - command: ip link set {{ ovs_bridge }} up - changed_when: false - - # Creating different multipass vm - - name: Create Multipass instances - command: | - multipass launch --name {{ item.name }} \ - --cpus {{ item.cpus }} \ - --mem {{ item.mem }} \ - --disk {{ item.disk }} - loop: "{{ vlan_config.vlan100.vms + vlan_config.vlan200.vms }}" - register: multipass_launch - changed_when: multipass_launch.rc == 0 - - - name: Get Multipass instance network info - command: multipass info {{ item.name }} - loop: "{{ vlan_config.vlan100.vms + vlan_config.vlan200.vms }}" - register: multipass_info - - - name: Extract MAC addresses - set_fact: - vm_macs: | - {% set macs = {} %} - {% for info in multipass_info.results %} - {% set vm_name = info.item.name %} - {% set mac = info.stdout | regex_search('MAC:\s+([a-f0-9:]+)') %} - {% if mac %} - {% set _ = macs.update({vm_name: mac[1]}) %} - {% endif %} - {% endfor %} - {{ macs }} - changed_when: false - - - name: Create OVS ports with VLANs - command: | - ovs-vsctl add-port {{ ovs_bridge }} {{ item.name }}-port \ - tag={{ item.vlan }} \ - -- set interface {{ item.name }}-port \ - type=internal - loop: "{{ vlan_config.vlan100.vms + vlan_config.vlan200.vms }}" - - - name: Configure VLAN interfaces - command: | - ip link set {{ item.name }}-port up && \ - dhclient {{ item.name }}-port - loop: "{{ vlan_config.vlan100.vms + vlan_config.vlan200.vms }}" - - - name: Show final OVS configuration - command: ovs-vsctl show - register: ovs_show - - - name: Display OVS configuration - debug: - var: ovs_show.stdout - -- name: Configure future nodes (placeholder) - hosts: unconfigured_nodes - gather_facts: false - tasks: - - name: Placeholder for future node configuration - debug: - msg: "This node will be configured later - {{ inventory_hostname }}" diff --git a/scripts/ansible/vars.yml b/scripts/ansible/vars.yml deleted file mode 100644 index 2523eef8..00000000 --- a/scripts/ansible/vars.yml +++ /dev/null @@ -1,27 +0,0 @@ ---- -# OVS Configuration -ovs_bridge: ansible-ovs-br0 -vlan_ids: [100, 200, 300, 400] - -# Multipass Configuration -multipass_vms: - - name: ovs-vm1 - cpus: 1 - mem: 1G - disk: 5G - vlan: 100 - - name: ovs-vm2 - cpus: 1 - mem: 1G - disk: 5G - vlan: 200 - - name: ovs-vm3 - cpus: 1 - mem: 1G - disk: 5G - vlan: 300 - - name: ovs-vm4 - cpus: 1 - mem: 1G - disk: 5G - vlan: 400 diff --git a/scripts/config_vlan.sh b/scripts/config_vlan.sh deleted file mode 100644 index 26e0a746..00000000 --- a/scripts/config_vlan.sh +++ /dev/null @@ -1,82 +0,0 @@ -#!/bin/bash -sudo ovs-vsctl list-br - -vmbridge= - -echo "Do you want to use one of the existing or you want to creat your own bridge: choose [use/create]" -read option -if [[ "$option" == "create" ]]; then - read -p "Enter the bridge name: " brname - sudo ovs-vsctl add-br $brname # creating ovs - echo "$brname created successfully!!" - vmbridge=$brname -elif [[ "$option" == "use" ]] ; then - read -p "Enter bridge name: " brname - echo "You choosed $brname" - vmbridge=$brname -else - echo "Choose one of the above options" - exit 1 -fi - -## configuring VLANs -echo "Configuring VLAN ..." - -read -p "How many VLAN do you want to configure ?: " vlannum -sudo ovs-vsctl set port $brname vlan_mode=native-untagged -sudo ovs-vsctl set port $brname trunks="0,$(seq -s ',' 1 $($vlannum-1))" - -# checking if vlann has been configured successfully - -if [[ $? -eq 0 ]]; then - echo "VLANs configuration was not successful" -fi - -echo "Succcessfully set up VLANs" - - -## Create VMs base on the number of machines the user choose and the default name - -read -p "Enter the number of default name for you VMs: " vmname -read -p "Enter the number of VM you want to create: " vmnumber -read -p "Enter the disk size for each instance: " vmdisk -read -p "Enter the memory size for each instance: " vmmem -read -p "Enter the number of CPU for each instance: " vmcpu - -## Creating VM with the flavor precised by the user - -echo "Creating $vmnumber with default name $vmname, disk size $vmdisk, memory size $vmmem and number of CPUs $vmcpu" - -for i in {1..$vmnumber}; do - multipass launch --name $vmname$i --disk $vmdisk --memory $vmmem --cpus $vmcpu --network name=$vmbridge --network name=default -done - -## configuring VLAN tagging - -echo "Configuring VLAN tagging" - -for i in {0..$vlannum}; do - read -p "How many machines do you want on VLAN$i?: " group"$i"num - - for j in {0..$group"$i"num}; do - sudo ovs-vsctl set $vmname-eth0 tag=$i - done - -done - -## Configuring Network Interfaces In VMs - -echo "Configuring Network Interfaces In VMs" -for i in {1..$vmnumber}; do - multipass exec $vmname$i -- sudo ip link set eth0 up - multipass exec $vmname$i -- sudo ip addr add 192.168.$vlannum.10$i/24 dev eth0 -done - -## Verifying Configuration of OVS -echo "Checking OVS configuration " -sudo ovs-vsctl show -sudo ovs-vsctl list port - -## Test connectivity - -multipass exec $vmname1 -- ping -c 5 192.168.$vlannum.10$i diff --git a/scripts/config_vlan2.sh b/scripts/config_vlan2.sh deleted file mode 100644 index a7c05265..00000000 --- a/scripts/config_vlan2.sh +++ /dev/null @@ -1,178 +0,0 @@ -#!/bin/bash -# List available bridges -echo -e "Listing available bridges...\n" -sudo ovs-vsctl list-br - -vmbridge= - -echo -e "\nDo you want to use one of the existing or you want to create your own bridge: choose [use/create]" -read option -if [[ "$option" == "create" ]]; then - read -p "Enter the bridge name: " brname - if [[ -z "$brname" ]]; then - echo -e "Bridge name cannot be empty\n" - exit 1 - fi - echo -e "Creating bridge $brname...\n" - sudo ovs-vsctl add-br "$brname" # creatgit rebase -i HEAD~10ing ovs - if [[ $? -eq 0 ]]; then - echo -e "$brname created successfully!!\n" - vmbridge=$brname - multipass set local.bridged-network=$brnamegit rebase -i HEAD~10 - echo -e "Failed to create bridge $brname\n" - exit 1 - fi -elif [[ "$option" == "use" ]]; then - read -p "Enter bridge name: " brname - echo -e "You chose $brname\n" - multipass set local.bridged-network=$brname - vmbridge=$brname -else - echo -e "Choose one of the above options\n" - exit 1 -fi -sudo ip link set $brname up - -## Configuring VLANs -echo -e "\nConfiguring VLAN ...\n" - -read -p "How many VLANs do you want to configure?: " vlannum - -# Validate VLAN number -if ! [[ "$vlannum" =~ ^[0-9]+$ ]] || [ "$vlannum" -lt 1 ]; then - echo -e "Please enter a valid number of VLANs\n" - exit 1 -fi - -echo -e "Setting VLAN mode to native-untagged...\n" -if ! sudo ovs-vsctl set port "$brname" vlan_mode=native-untagged; then - echo -e "Failed to set VLAN mode\n" - exitgit rebase -i HEAD~10 1 -fi - -echo -e "Configuring VLAN trunks...\n" -if ! sudo ovs-vsctl set port "$brname" trunks="0,$(seq -s ',' 1 $((vlannum - 1)))"; then - echo -e "Failed to configure VLAN trunks\n" - exit 1 -fi - -echo -e "Successfully set up VLANs\n" - -## Create VMs based on user specifications -read -p "Enter the default name prefix for your VMs: " vmname -read -p "Enter the number of VMs you want to create: " vmnumber -read -p "Enter the disk size for each instance (e.g., 10G): " vmdisk -read -p "Enter the memory size for each instance (e.g., 2G): " vmmem -read -p "Enter the number of CPUs for each instance: " vmcpu - -echo -e "\nCreating $vmnumber VMs with:\n" -echo -e "- Name prefix: $vmname" -echo -e "- Disk size: $vmdisk" -echo -e "- Memory size: $vmmem" -echo -e "- CPUs: $vmcpu\n" - -# Create VMs with NAT only first -for ((i = 1; i <= vmnumber; i++)); do - echo -e "Creating VM $vmname$i...\n" - multipass launch --name "$vmname$i" --disk "$vmdisk" --memory "$vmmem" --cpus "$vmcpu" --network virbr0 24.04 - if [[ $? -ne 0 ]]; then - echo -e "Failed to create VM $vmname$i\n" - exit 1 - fi - # Stop VM and attach to OVS bridge - multipass stop "$vmname$i" - # MODIFIED: Get actual interface name dynamically - interface_name=$(multipass exec "$vmname$i" -- ip -o link show | awk -F': ' '!/lo/ {print $2; exit}') - if [[ -z "$interface_name" ]]; then - echo -e "Error: Could not determine interface for $vmname$i\n" - exit 1 - fi - sudo ovs-vsctl add-port "$vmbridge" "$interface_name" -done - -## MODIFIED: VLAN tagging with name input instead of count -echo -e "\nConfiguring VLAN tagging...\n" - -for ((i = 0; i < vlannum; i++)); do - read -p "Enter VM names for VLAN$i (space-separated): " -a vm_names - echo -e "Configuring VLAN $i for VMs: ${vm_names[*]}...\n" - - for vm in "${vm_names[@]}"; do - if ! multipass list | grep -q "$vm"; then - echo -e "Error: VM $vm not found! Skipping...\n" - continue - fi - - # Get the actual interface name - interface_name=$(multipass exec "$vm" -- ip -o link show | awk -F': ' '!/lo/ {print $2; exit}') - - if [[ -z "$interface_name" ]]; then - echo -e "Error: Could not determine interface for $vm\n" - continue - fi - - echo -e "Setting VLAN $i for $vm (interface: $interface_name)...\n" - multipass stop "$vm" - sudo ovs-vsctl set port "${vm}-${interface_name}" tag=$i - multipass start "$vm" - done -done - -## Optimized Network Configuration -echo -e "\nConfiguring Network Interfaces In VMs...\n" - -for ((i = 1; i <= vmnumber; i++)); do - vm="$vmname$i" - echo -e "Configuring network for $vm...\n" - - # Fast interface detection (limited to common virtual NIC patterns) - interface_name=$(multipass exec "$vm" -- ls /sys/class/net/ | grep -E '^e(n|th)[a-z0-9]+$' | head -1) - - # Fallback to ens3 if detection fails - [[ -z "$interface_name" ]] && interface_name="ens3" - - # Get VLAN tag (with caching) - vlan_tag=$(sudo ovs-vsctl get port "$interface_name" tag 2>/dev/null || echo "1") - - # Atomic configuration - if multipass exec "$vm" -- sudo bash -c " - ip link set $interface_name up - ip addr flush dev $interface_name 2>/dev/null - ip addr add 192.168.$vlan_tag.$((10 + i))/24 dev $interface_name - ip route add default via 192.168.$vlan_tag.1 - " >/dev/null 2>&1; then - echo -e "Success: $vm ($interface_name) → 192.168.$vlan_tag.$((10 + i))/24\n" - else - echo -e "Error: Failed to configure $vm\n" - echo -e "Debug Info:" - multipass exec "$vm" -- ip addr show 2>/dev/null || echo "Cannot connect to VM" - continue - fi -done - -## Verifying Configuration of OVS -echo -e "\nChecking OVS configuration...\n" -sudo ovs-vsctl show -sudo ovs-vsctl list port - -## Test connectivity between VMs in same VLAN -echo -e "\nTesting connectivity between VMs in the same VLAN...\n" -for ((i = 0; i < vlannum; i++)); do - echo -e "Testing connectivity in VLAN $i...\n" - vms_in_vlan=($(sudo ovs-vsctl list port | awk -v tag="$i" '/tag:/ && $2 == tag {print $1}')) - - if [[ ${#vms_in_vlan[@]} -ge 2 ]]; then - first_vm=$(multipass list | awk -v iface="${vms_in_vlan[0]}" '$6 == iface {print $1}') - second_vm=$(multipass list | awk -v iface="${vms_in_vlan[1]}" '$6 == iface {print $1}') - - if [[ -n "$first_vm" && -n "$second_vm" ]]; then - target_ip="192.168.$i.$((10 + $(echo $second_vm | sed 's/[^0-9]//g')))" - echo -e "Testing ping from $first_vm to $second_vm ($target_ip)...\n" - multipass exec "$first_vm" -- ping -c 3 "$target_ip" - fi - else - echo -e "Not enough VMs in VLAN $i for testing\n" - fi -done - -echo -e "\nConfiguration Completed successfully !!!\n" diff --git a/scripts/data.txt b/scripts/data.txt deleted file mode 100644 index e388a16b..00000000 --- a/scripts/data.txt +++ /dev/null @@ -1,10 +0,0 @@ -use -virt-bridge -2 -test-vm -4 -4G -1G -1 -2 -2 \ No newline at end of file diff --git a/scripts/minimal_kvm_setup.yml b/scripts/minimal_kvm_setup.yml deleted file mode 100644 index b8c1a654..00000000 --- a/scripts/minimal_kvm_setup.yml +++ /dev/null @@ -1,28 +0,0 @@ ---- -- name: Install QEMU, KVM, and Libvirt on Ubuntu Server - hosts: kvm_hosts - become: true - tasks: - - name: Install required packages - apt: - name: - - qemu-kvm - - libvirt-daemon-system - - libvirt-clients - - bridge-utils - - virtinst - - virt-manager - state: present - update_cache: true - - - name: Ensure libvirtd service is running and enabled - systemd: - name: libvirtd - enabled: true - state: started - - - name: Add current user to libvirt and kvm groups - user: - name: "{{ ansible_user }}" - groups: libvirt,kvm - append: yes diff --git a/scripts/ntp_setup.yml b/scripts/ntp_setup.yml deleted file mode 100644 index d7bf0b38..00000000 --- a/scripts/ntp_setup.yml +++ /dev/null @@ -1,9 +0,0 @@ -- name: Install Ntp using ansible playbook - hosts: all - become: yes - tasks: - - name: install ntp package - apt: - name: ntp - state: present - update_cache: yes diff --git a/scripts/run.sh b/scripts/run.sh deleted file mode 100644 index ff3f43e3..00000000 --- a/scripts/run.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -cat ~/Projects/openstack/scripts/data.txt | source ~/Projects/openstack/scripts/config_vlan2.sh \ No newline at end of file diff --git a/scripts/setup_vswitch.sh b/scripts/setup_vswitch.sh deleted file mode 100644 index 2186b070..00000000 --- a/scripts/setup_vswitch.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -# Define variables -BRIDGE_NAME="br0" -VM1="test-vm1" -VM2="test-vm2" -SUBNET="192.168.100.0/24" - -# Create a bridge (if it doesn’t exist) -if ! ip link show $BRIDGE_NAME &> /dev/null; then - sudo ip link add $BRIDGE_NAME type bridge - sudo ip link set $BRIDGE_NAME up - sudo ip addr add 192.168.100.1/24 dev $BRIDGE_NAME -fi - -# Stop VMs to attach the bridge -multipass stop $VM1 $VM2 - -# Attach each VM to the bridge -for VM in $VM1 $VM2; do - multipass set local.$VM.network.bridge=$BRIDGE_NAME -done - -# Start VMs -multipass start $VM1 $VM2 - -# Assign static IPs inside VMs (optional) -multipass exec $VM1 -- sudo ip addr add 192.168.100.2/24 dev enp0s1 -multipass exec $VM2 -- sudo ip addr add 192.168.100.3/24 dev enp0s1 - -echo "Bridge $BRIDGE_NAME created. VMs $VM1 and $VM2 are connected!" diff --git a/scripts/setup_vswitch.yml b/scripts/setup_vswitch.yml deleted file mode 100644 index 68e1e503..00000000 --- a/scripts/setup_vswitch.yml +++ /dev/null @@ -1,42 +0,0 @@ ---- -- name: Create a vswitch and connect Multipass VMs - hosts: localhost - connection: local - vars: - bridge_name: "multipass_br0" - vm1: "test-vm1" - vm2: "test-vm2" - subnet: "192.168.100.0/24" - vm1_ip: "192.168.100.2" - vm2_ip: "192.168.100.3" - - tasks: - - name: Create a virtual bridge (vswitch) - ansible.builtin.command: "brctl addbr {{ bridge_name }}" - changed_when: false - ignore_errors: true # In case bridge already exists - - - name: Bring up the bridge - ansible.builtin.command: "ip link set {{ bridge_name }} up" - - - name: Assign IP to bridge (optional) - ansible.builtin.command: "ip addr add {{ subnet | replace('0/24', '1/24') }} dev {{ bridge_name }}" - - - name: Stop VMs to modify network settings - ansible.builtin.command: "multipass stop {{ item }}" - loop: "{{ [vm1, vm2] }}" - - - name: Attach VMs to the bridge - ansible.builtin.command: "multipass set local.{{ item }}.network.bridge={{ bridge_name }}" - loop: "{{ [vm1, vm2] }}" - - - name: Start VMs - ansible.builtin.command: "multipass start {{ item }}" - loop: "{{ [vm1, vm2] }}" - - - name: Configure static IPs inside VMs (optional) - ansible.builtin.command: | - multipass exec {{ item.vm }} -- sudo ip addr add {{ item.ip }}/24 dev eth0 - loop: - - { vm: "{{ vm1 }}", ip: "{{ vm1_ip }}" } - - { vm: "{{ vm2 }}", ip: "{{ vm2_ip }}" } diff --git a/tutorials/docs/boot_docs.md b/tutorials/docs/boot_docs.md deleted file mode 100644 index 6a021a39..00000000 --- a/tutorials/docs/boot_docs.md +++ /dev/null @@ -1,299 +0,0 @@ -# HOW TO INSTALL A UBUNTU SERVER 24.04 STEP-BY STEP - -## Overview - -**What is Ubuntu** - -Ubuntu is one of the most widely used and popular Linux distributions, that comes in multiple editions including Ubuntu Desktop, Ubuntu Server, and Ubuntu Core to mention a few. - -**Why Ubuntu servers** - -Ubuntu Server is built for server environments, which is a lightweight and minimal version that is stripped off of any GUI applications and elements to enhance the speed and performance of running production-grade applications. It can serve as a web server, file server, development server, and DNS server to mention a few use cases. - -# Ubuntu Server vs Other Server OS/Distros - -| **Aspect** | **Ubuntu Server** | **Debian** | **CentOS / RHEL** | **Windows Server** | -|-----------------|------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------|------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------| -| **Ability** | Full-featured Linux server OS; supports wide range of services and apps | Highly capable, but less user-friendly out of the box | Enterprise-focused capabilities; stable environments | Supports many enterprise tools, Active Directory, .NET, etc. | -| **Capacity** | Easily supports heavy workloads with proper configuration | Handles large workloads, but tuning may require more expertise | Designed for enterprise-scale operations | Capable of high capacity but with more resource overhead | -| **Performance** | Lightweight by default; minimal system load; high efficiency | Very lightweight; excellent performance, especially on older hardware | Moderate; built for stability over raw performance | Heavier footprint; performance affected by GUI and background services | -| **Safety** | Strong package integrity checks; frequent security patches | Conservative approach ensures safety, but slower update cycle | SELinux integration improves isolation and safety | Closed-source; safety reliant on Microsoft’s update cycle | -| **Security** | AppArmor, UFW firewall, automatic security updates available | Manual setup required for many security features | SELinux is powerful but complex; good enterprise controls | Proprietary model limits transparency; patching is slower | -| **Scalability** | Well-suited for cloud environments, containers, and large-scale deployments | Scalable, but lacks vendor-optimized tools for automation | Highly scalable; used in many large enterprise networks | Scales in enterprise settings but with higher resource and license costs | -**Prerequisites** -- Minimal 4 GB of RAM -- 2 GHz dual-core processor -- 25 GB disk space -- Internet Connectivity (Optional) -- Installation Media (bootable USB or DVD). - -**What you'll learn** - -How you will make a Ubuntu server bootable key and also how to install Ubuntu server 24.04 on a computer. - -## Get started - -1. **Download the Ubuntu Server ISO Image** - -The first step is to download the Ubuntu server 24.04 ISO image. So, head over to the official Ubuntu download page (https://ubuntu.com/download/server) and download the ISO file. -With the ISO file at hand, prepare the installation media by burning the ISO file into USB. You can use a software utility such as Rufus if you are running Windows or UNetbootin or balenaEtcher for Linux, macOS, and Windows. In this tutor we'll use balenaEtcher, get to the balenaEtcher page (https://etcher-docs.balena.io/) to download balenaEtcher, here are the steps to burn the ISO image: - - -i. launch balenaEtcher - - click on the "balenaEtcher" icon to start balenaEtcher. -![image0](./images/image0.png) - -ii. locating the image file - - click on "flash from file" to select your image file. -![image1](./images/image1.png) - -iii. choosing the storage device - - click on "select target" to select your storage device. -![image2](./images/image2.png) - -iv. flash the USB drive - - click on "flash" to make the bootable flash. -![image3](./images/image3.png) - - - - -2. **Start Ubuntu Server Installation** - -With the USB boot medium in place, plug it into the system you want to install the Ubuntu server OS and reboot. Be sure to configure your bootable medium to take the highest boot priority in the BIOS and continue booting. - -Upon booting, you will see the GRUB menu with two options: “Try or Install Ubuntu Server” and “Test memory“. The first option comes pre-selected. This is what we want. So just hit ENTER to proceed. - -![text](./images/img1.png) - -You will see some boot messages on the screen for a few seconds. - -![text](./images/img2.png) - -3. **Choose your language** - -Once the system has finished booting, select your preferred installation language. By default, this is set to English. This looks good for our case, so hit ENTER to proceed to the next step -![text](./images/img3.png) - -4. **Select Keyboard Layout** - -Next, select your preferred layout. The default selection for the layout and variant is English (US). Feel free to select your preferred option, select `Done` with your arrow key, and hit ENTER to proceed to the next step. -![text](./images/img4.png) - -5. **Choose the Type of Installation** - -The next step will require you to select your preferred installation type. By default, the “Ubuntu Server” option is selected. In addition to that, you can also choose the “Ubuntu Server (“minimized”) option which is a version customized to have a small footprint in environments that do not require login by users. - -In this guide, we will go with the “Ubuntu Server” option. -So we will hit ENTER. - -![text](./images/img5.png) - -6. **configure network** - -In this step, you need to configure at least one active interface for network and internet connection. Active connections will be displayed with corresponding IPv4 addresses since DHCP is selected by default. - -![text](./images/img6.png) - -In our setup, “enp0s3” is the only active network interface. Instead of DHCP, we will configure a static IP address since the instance will act as a server. - -So, ensure your active interface is selected, then hit the arrow-right key on the keyboard, and on the menu that appears, select `Edit IPv4` using the arrow-down key. - -![text](./images/img7.png) - -On the pop-up CLI that appears, select the `Manual` option and hit ENTER. - -![text](./images/img8.png) - -Be sure to fill in the IP details, i.e. Subnet, IP address, gateway, Nameservers, and Search domains, if any. Then select `Save` and hit ENTER. - -![text](./images/img9.png) - -Next, select `Done` and hit ENTER. - -![text](./images/img10.png) - -7. **Configure Proxy** - -If you intend to connect to a Proxy server, here’s the chance to provide your Proxy server address. If you are not running a proxy server, leave it blank and hit `Done`. - -![text](./images/img11.png) - -The installer will perform a mirror test by updating the package index. The default mirror address is http://archive.ubuntu.com/ubuntu/ which is just fine. You can also provide an alternative mirror instead of the default one. - -Once the mirror test is complete, select `Done` and hit ENTER. - -![text](./images/img12.png) - -In this step, you will be required to configure disk partitions. By default, guided storage is selected. This auto-partitions your hard drive using the most recommended settings based on the size of your drive. - -The other option – “Custom storage layout” – lets you manually specify the partitions including the partition type and size. - -For simplicity, we will go with the first option – “Guided storage layout“. With this option selected, installer will intelligently partition the disk for you and allocate space for swap, /boot, and / ( root ) partitions. - -Select `Done` and hit ENTER. - -![text](./images/img13.png) - -The partition table will be displayed next. If all looks good, select `Done` and hit ENTER. Otherwise, if you need to make some changes, select `Reset` and hit ENTER to head back and make the needed adjustment. - -![text](./images/img14.png) - -On the pop-up window that appears, select `Continue` and hit ENTER to write the changes to disk. - -![text](./images/img15.png) - -9. **Create a User Account** - -Next, you will be required to create a user account. So, provide the required details including your name, the server’s name, username, and password, and hit ENTER to move to the next step. - -![text](./images/img16.png) - -10. **Select whether to enable Ubuntu Pro** - -Ubuntu Pro is an additional service on top of Ubuntu that provides extended support and maintenance including compliance for your OS. It provides 10 years of paid support and you can use up to 5 devices free for personal use. This, however, requires a Ubuntu One account. - -For now, we will skip this – You can enable it later. So hit `Continue`. - -![text](./images/img17.png) - -11. **Select Whether to install the OpenSSH server & additional software** - -Next, select whether you want to install the OpenSSH server which will allow remote login to the server. In our case, we will select to install it. Once selected, select `Done` and hit ENTER. - -![text](./images/img18.png) - -Next, you will be required to select whether to install some featured applications in the form of snaps. So go through the list and enable your preferred snap. Alternatively, you can skip and install them later. - -For now, we will not install snaps. So select `Done` and hit ENTER. - -![text](./images/img19.png) - -12. **Finish the Installation and Reboot** - -From here, the installer will copy all the files from the bootable medium install them on your hard drive, and configure all the required settings. - -![text](./images/img20.png) - -Finally, select `Done` and hit ENTER to reboot. - -![text](./images/img21.png) - -Once the system has rebooted, provide your user account’s password and hit ENTER to log in. - -![text](./images/img22.png) - -From now you can enjoy your Ubuntu server 24.04 LTS installation. -If you are new to Ubuntu server, we'd recommend reading the [server guide](https://documentation.ubuntu.com/server/) - -## Security measures - When installing an Ubuntu Server, several security considerations are important to ensure the system's safety. some steps are as follows: - - 1. Ensuring that the system is updated regularly to apply the latest security patches and bug fixes. - 2. Using a firewall, such as Uncomplicated Firewall(ufw), to only allow necessary ports is also essential. - 3. securing shared memory by adding specific configurations to /etc/fstab can improve security. - 4. securing SSH service. - 5. Lastly, it is recommended to install security tools like Fail2ban to monitor and block malicious login attempts and to use security-enhancing features like AppArmor to restrict application permissions. - -## Troubleshooting partition issues - -If by the end while terminating the installation you get any error, then it means that you have a partition issue, and this is how you can resolve it: - -1- Download the Ubuntu 24.04 ISO image from the official Ubuntu website. - -2- Write the ISO image to a USB stick using a tool like balenaEtcher or the Startup Disk Creator. - -3- Boot your machine from the USB stick. You may need to enter the boot menu (commonly accessed with F12, Escape, F2, or F10) to select the USB device as the boot device. - -4- Once the USB boots, select the "Try Ubuntu" option from the GRUB bootloader. - -5- Choose your language and follow the installation wizard's instructions. If you encounter issues with graphics, select "safe graphics" mode. - -After your desktop environment has been setup, press "Ctrl + alt + t" to open a new terminal session. - -1- Identify the target disk - -Run: - -```sh -lsblk -``` - -Example output: - -``` -NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT -sda 8:0 0 500G 0 disk -├─sda1 8:1 0 100G 0 part / -├─sda2 8:2 0 400G 0 part /home -sdb 8:16 0 250G 0 disk -``` - -Suppose `sdb` is the disk you want to wipe and repartition. - ---- - -### Using `fdisk` (for MBR/GPT) - -#### 2. Launch `fdisk` - -```bash -sudo fdisk /dev/sdb -``` - ---- - -#### 3. Inside `fdisk` (interactive mode) - -Press keys as prompted: - -1. **Type `g`** to create a new GPT partition table (or `o` for MBR). -2. **Type `d`** to delete partitions (repeat until they're all gone). -3. **Type `n`** to create a new partition. -4. **Type `w`** to write changes and exit. - -Sample flow: - -``` -Command (m for help): g -Created a new GPT disklabel. - -Command (m for help): d -(No partition is currently defined, skip if none) - -Command (m for help): n -Partition number (1-128, default 1): -First sector (2048-...), default 2048: -Last sector, +sectors or +size{K,M,G,T,P}: - -Command (m for help): w -``` - ---- - -#### 4. Format the new partition - -Assuming it created `/dev/sdb1`, format it: - -```bash -sudo mkfs.ext4 /dev/sdb1 -``` - -(Use `mkfs.xfs` or `mkfs.ntfs` if you prefer other filesystems.) - ---- - -#### 5. Mount it (optional) - -```bash -sudo mkdir /mnt/newdisk -sudo mount /dev/sdb1 /mnt/newdisk -``` - -To mount it automatically at boot, you'd edit `/etc/fstab`. - - diff --git a/tutorials/docs/images/image0.png b/tutorials/docs/images/image0.png deleted file mode 100644 index 679fda2ffaefa71d186db94f0a9f3e3a594d719f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131166 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�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à({~f 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

%ptZSqb%A|wveIAjJ^{!o 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