\documentclass{article}

\usepackage[a4paper, margin=2cm]{geometry}
\usepackage[italian]{babel}

\title{Installazione di OpenStack Kolla-Ansible su multi-nodo}
\author{Alessandro Iezzi}
\date{Luglio 2025}


\begin{document}

\maketitle

\begin{abstract}
L'Installazione di OpenStack Kolla-Ansible su multi-nodo ci si riferisce al
processo di installazione dei servizi OpenStack su nodi multipli fisici o
virtuali usando Kolla-Ansible.

Questo approccio permette la distribuzione di vari componenti OpenStack (come
\emph{Compute}, \emph{Networking} e \emph{Storage}) su differenti nodi,
migliorando la scalabilità, ridondanza e le performance. Quindi è indicato per
quegli ambienti di produzione dove tali caratteristiche sono prioritarie.
\end{abstract}

\section{Architettura all-in-one con Kolla-Ansible}
In questa sezione si illustra il processo di installazione di OpenStack
Kolla-Ansible su singolo nodo. Tale procedura è da usare solo per test e
sviluppo, non è assolutamente consigliato in ambiente di produzione, anche se
molti dei passaggi qui descritti verranno utilizzati anche per l'installazione
su multi-nodo.

\subsection{Introduzione}
Per procedere all'installazione è necessaria una macchina fisica o virtuale
con:
\begin{itemize}
    \item 4 CPU/Core
    \item 8 GB di RAM
    \item 60 GB di HDD
    \item 2 interfacce di rete
\end{itemize}
Una delle due interfacce dovrà essere connessa a internet e serve per eseguire
correttamente l'installazione del sistema operativo e i software necessari.

Se si vuole lavorare su ambiente virtualizzato, si consiglia un'interfaccia di
rete "bridged" e una "host".

\emph{Si consiglia di lavorare su un'installazione pulita di Ubuntu Server 24.04
LTS}.

\subsection{Installazione dei pacchetti necessari}
\paragraph{Preparazione del sistema operativo} Vengono installati i software
necessari per ospitare Kolla-Ansible.
\begin{verbatim}
$ sudo apt-get update
$ sudo apt-get install git \
                       python3-dev \
                       libffi-dev \
                       gcc \
                       libssl-dev \
                       python3-venv \
                       bridge-utils
\end{verbatim}

\paragraph{Preparazione della rete} Questa configurazione è solo un punto di
partenza. Bisogna adattarlo alle proprie esigenze e ai nomi che il sistema
operativo ha dato ad ogni interfaccia. L'esempio che segue, mostra una
configurazione con tre interfacce, la prima è una NAT, e le altre due sono
reti host.

\begin{verbatim}
network:
  version: 2
  renderer: networkd
  ethernets:
    ens3:
      dhcp4: no
    ens4:
      dhcp4: no
    ens5:
      dhcp4: no
      addresses: [192.168.200.10/24]
      routes:
        - to: 192.168.200.0/24
          via: 192.168.200.1
          metric: 100

  bridges:
    br-nat:
      interfaces: [ens3]
      dhcp4: true
      dhcp4-overrides:
        route-metric: 50
      nameservers:
        addresses: [8.8.8.8, 1.1.1.1]
      routes:
        - to: default
          via: 10.0.2.2

    br-host:
      interfaces: [ens4]
      addresses: [192.168.100.10/24]
      nameservers:
        addresses: [8.8.8.8]
      routes:
        - to: 192.168.100.0/24
          via: 192.168.100.1
          metric: 100
\end{verbatim}
Per applicare la configurazione di rete:
\begin{verbatim}
sudo netplan generate
sudo netplan apply
\end{verbatim}

Se l'ambiente prevede più schede di rete, delle quali una sola esce su
internet, bisonga fare in modo che il sistema esca sempre con quella. Quindi,
bisognerebbe togliere il default, ad esempio, alla scheda solo host:
\begin{verbatim}
sudo ip route del default via 192.168.100.1
\end{verbatim}
O impostare una metrica più alta:
\begin{verbatim}
sudo ip route del default via 192.168.100.1
sudo ip route replace default via 192.168.100.1 dev ens4 metric 150
\end{verbatim}

\paragraph{Preparazione dell'ambiente Python} Il software Ansible e
Kolla-Ansible sono scritti in Python, quindi, è necessario creare un ambiente
nel quale verranno installati.
\begin{verbatim}
$ python3 -m venv $HOME/python-env
$ source $HOME/python-env/bin/activate
$ pip install -U pip
\end{verbatim}

\paragraph{Installazione di Ansible}
\begin{verbatim}
(python-env)$ pip install ansible-core >=2.15
\end{verbatim}
\paragraph{Installazione di Kolla-Ansible} Ora si può procedere
all'installazione di \emph{Kolla-Ansible}. Per farlo, è necessario installarlo
dai sorgenti da \emph{opendev.org}.

Segue il comando per installare la versione più aggiornata:
\begin{verbatim}
(python-env)$ pip install git+https://opendev.org/openstack/kolla-ansible@master
\end{verbatim}

Segue il comando per installare la versione stabile:
\begin{verbatim}
(python-env)$ pip install git+https://opendev.org/openstack/kolla-ansible@stable/2025.1
\end{verbatim}

\subsection{Preparazione di Kolla-Ansible}
\begin{verbatim}
(python-env)$ sudo mkdir -p /etc/kolla
(python-env)$ sudo chown $USER:$USER /etc/kolla

(python-env)$ cp -r $HOME/python-env/share/kolla-ansible/etc_examples/kolla/* /etc/kolla/

(python-env)$ kolla-ansible install-deps
(python-env)$ kolla-genpwd
\end{verbatim}

\subsection{Configurazione di Kolla}
\begin{verbatim}
$ nano /etc/kolla/globals.yml
\end{verbatim}
In questo file, si vano a cambiare alcune configurazioni:
\begin{verbatim}
kolla_base_distro: "ubuntu"
network_interface: "br-nat"                  # la rete NAT
neutron_external_interface: "br-host"        # la rete host (non deve avere una rotta che la farebbe uscire su internet, io ho rimosso il default)
kolla_internal_vip_address: "10.0.2.100"
\end{verbatim}
Poi, creare il file \verb|~/.ansible.cfg|:
\begin{verbatim}
$ touch ~/.ansible.cfg
\end{verbatim}
Ed inserire le seguenti configurazioni che serviranno a far chiedere la
password quando Ansible cercherà di fare \verb|sudo|:
\begin{verbatim}
[privilege_escalation]
become = True
become_method = sudo
become_ask_pass = True
\end{verbatim}
A questo punto è consigliabile eseguire uno snapshot.

\subsection{Deploy all-in-one}
Eseguire i seguenti comandi per installare docker:
\begin{verbatim}
(python-env)$ pip install docker
(python-env)$ sudo apt-get install libdbus-1-dev libdbus-glib-1-dev pkg-config
(python-env)$ pip install dbus-python
\end{verbatim}
Successivamente, eseguire i seguenti comandi per completare l'installazione:
\begin{verbatim}
(python-env)$ kolla-ansible bootstrap-servers \
                  -i $HOME/python-env/share/kolla-ansible/ansible/inventory/all-in-one

(python-env)$ kolla-ansible prechecks \
                  -i $HOME/python-env/share/kolla-ansible/ansible/inventory/all-in-one

(python-env)$ kolla-ansible deploy \
                  -i $HOME/python-env/share/kolla-ansible/ansible/inventory/all-in-one
\end{verbatim}
Eseguire un ulteriore snapshot.

\subsection{Installazione di OpenStack CLI}
\begin{verbatim}
(python-env)$ pip install python-openstackclient -c https://releases.openstack.org/constraints/upper/master
\end{verbatim}

\subsection{Accesso all'interfaccia Horizon}
Nel caso in cui si utilizza un NAT, per accedere all'interfaccia horizon è
necessario fare port forwarding su qemu.

\begin{verbatim}
URL:      http://localhost
username: admin
pasword:  vedere /etc/kolla/passwords.yml

$ grep 'keystone_admin_password' /etc/kolla/passwords.yml
\end{verbatim}

\section{Architettura multi-nodo con Kolla-Ansible}

\end{document}
