Installazione di Ansible, Semaphore UI, Code Server e Cockpit su AlmaLinux

Indice dei contenuti

Prerequisiti

  • Un server con AlmaLinux 9.5 installato (installazione minimale).
  • Utente con privilegi sudo.
  • Accesso ssh
  • Una connessione internet funzionante.


Preparazione del sistema

Rete

Impostazione parametri di rete statici

Durante l’installazione di AlmaLinux, è opportuno impostare dei parametri di rete statici per permettere l’accesso ssh/http(s).

E’ possibile impostare i parametri di rete dopo l’installazione con il tool interattivo:

sudo nmtui

o tramite il comando nmcli:

sudo nmcli con mod enp1s0 \
ipv4.addresses 172.10.0.10/24 \
ipv4.gateway 172.10.0.1 \
ipv4.dns 172.10.0.1 \
ipv4.dns-search acme.internal \
ipv4.method manual \
ipv6.method disabled

Note:

  • Sostituire i parametri di rete per adeguarli al proprio contesto
  • Sostituire, se necessario, il nome dell’interfaccia di rete (enp1s0) sulla base dell’output del comando nmcli

Dopo la modifica dei parametri, riavviare i servizi di rete:

sudo nmcli con reload

Attenzione! Se si sta modificando la configurazione da remoto via SSH, è consigliabile eseguire un riavvio del sistema (sudo reboot) invece di ricaricare la connessione (nmcli con reload), per evitare di perdere la connessione SSH a causa del cambio di IP.
Per maggiore sicurezza, prima del riavvio, verificare che i nuovi parametri di rete siano corretti con il comando nmcli con show enp1s0 (adeguare il nome dell’interfaccia di rete enp1s0 se necessario)

Impostazione dell’hostname (opzionale ma consigliato)

sudo hostnamectl set-hostname wile.acme.internal

Nota: sostituire il nome host wile.acme.internal per adeguarlo al proprio contesto

Aggiornamenti

Abilitare il repository EPEL (Extra Packages for Enterprise Linux):

sudo dnf install -y epel-release

Assicurarsi che il sistema sia aggiornato:

sudo dnf update -y

Se necessario, riavviare

sudo reboot

Installazione software necessario e di utilità generale

Installare utility comunemente utilizzate dagli amministratori di sistema per semplificare la gestione del server, alcuni dei quali richiesti nei passaggi successivi:

sudo dnf install -y tar vim nmap btop htop wget curl net-tools dhcping rsync tree tmux git jq unzip iftop ncdu netcat tcpdump mc ipcalc iotop-c bzip2 whois pwgen bind-utils nano bash-completion policycoreutils-python-utils sshpass argon2 neovim wol libcap

Ambiente operativo

Variabili d’ambiente

Per aggiungere il percorso “/usr/local/bin” al PATH per tutti gli utenti, creare il file /etc/profile.d/custom_path.sh con i privilegi di amministratore (sudo)

sudo nano /etc/profile.d/custom_path.sh

Contenuto del file

export PATH="/usr/local/bin:$PATH"

Ottimizzazione shell.

Installare starship, un prompt di shell moderno e personalizzabile.

wget -P /tmp https://starship.rs/install.sh && chmod +x /tmp/install.sh && /tmp/install.sh -y && rm -f /tmp/install.sh

Attivare Starship per tutti gli utenti

Creare il file /etc/profile.d/starship.sh con i privilegi di amministratore (sudo)

sudo nano /etc/profile.d/starship.sh

Contenuto del file

if command -v starship > /dev/null 2>&1; then
    export STARSHIP_CONFIG=/etc/starship.toml
    eval "$(starship init bash)"
fi

Impostare una configurazione di Starship per tutti gli utenti

Creare il file /etc/starship.toml con i privilegi di amministratore (sudo)

sudo nano /etc/starship.toml

Contenuto del file

# /etc/starship.toml
# https://starship.rs/config/

format = '''
[┌](bright-blue)[\[](bright-blue)$all[\]](bright-blue)
[└>](bright-blue) '''

[line_break]
disabled = true

[character]
disabled = true

[username]
show_always = true
format = '[$user]($style) on '

[hostname]
ssh_only = false

Nota: E’ possibile personalizzare starship secondo la documentazione ufficiale su https://starship.rs/config/

Installazione di Nginx e Configurazione del Reverse Proxy

Gestiamo l’accesso a Cockpit (Pannello di Controllo), Semaphore UI e Code Server tramite un reverse proxy con Nginx:

Generare un certificato auto-firmato

sudo mkdir -p /etc/ssl/private && \
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/nginx-selfsigned.key \
-out /etc/ssl/certs/nginx-selfsigned.crt \
-subj "/C=US/ST=New Mexico/L=Truth or Consequences/O=ACME Corporation/CN=acme.internal"

Installare Nginx

sudo dnf install -y nginx

Creare il file di configurazione di Nginx

sudo nano /etc/nginx/conf.d/reverse-proxy.conf

Contenuto del file:

server {
    listen 80 default_server;

    # Reindirizza tutte le richieste su HTTPS

    location / {
        return 301 https://$host$request_uri;
    }

}

server {
    listen 443 ssl default_server;

    ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
    ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;

    # Imposta la directory root per servire la pagina statica
    root /usr/share/testpage;
    index index.html;

    # Comportamento predefinito: Servire index.html
    location / {
        try_files $uri /index.html;
    }

    # Configurazione per cockpit
    location /pit/ {
        # Required to proxy the connection to Cockpit
        proxy_pass https://127.0.0.1:9090/pit/;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;

        # Required for web sockets to function
        proxy_http_version 1.1;
        proxy_buffering off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # Pass ETag header from Cockpit to clients.
        # See: https://github.com/cockpit-project/cockpit/issues/5239
        gzip off;
    }

    # Configurazione per Semaphore UI
    location /sem/ {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_http_version 1.1;
        proxy_read_timeout 86400; # Timeout per connessioni WebSocket
    }

    # Configurazione per Code Server
    location /code/ {
        proxy_pass http://127.0.0.1:8080/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_http_version 1.1;
        proxy_read_timeout 86400; # Timeout per connessioni WebSocket
    }

}

Verificare la configurazione

sudo nginx -t

Impostare la pagina indice

Fai una copia di backup della pagina attuale:

sudo mv /usr/share/testpage/index.html /usr/share/testpage/index.html.dist

Crea la nuova pagina contenente i link di accesso ai servizi:

sudo nano /usr/share/testpage/index.html

Contenuto del file:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Index</title>
    <style>
        /* Stile predefinito (tema chiaro) */
        body {
            font-family: Arial, sans-serif;
            text-align: center;
            padding: 50px;
            background-color: #f4f4f9;
            color: #333;
        }

        h1 {
            font-size: 2.5rem;
            margin-bottom: 20px;
        }

        p {
            font-size: 1.2rem;
            margin-bottom: 30px;
        }

        .button {
            display: inline-block;
            margin: 10px;
            padding: 15px 30px;
            font-size: 20px;
            color: #fff;
            background-color: #007BFF;
            border: none;
            border-radius: 5px;
            text-decoration: none;
            cursor: pointer;
            transition: background-color 0.3s ease, transform 0.2s ease;
        }

        .button:hover {
            background-color: #0056b3;
            transform: scale(1.05);
        }

        .button:active {
            transform: scale(0.95);
        }

        /* Stile per il tema scuro */
        @media (prefers-color-scheme: dark) {
            body {
                background-color: #121212;
                color: #e0e0e0;
            }

            .button {
                background-color: #1a73e8;
            }

            .button:hover {
                background-color: #1669c1;
            }
        }

        /* Responsive adjustments */
        @media (max-width: 600px) {
            .button {
                width: 80%;
                font-size: 18px;
                padding: 15px 20px;
            }
        }
    </style>
</head>

<body>
    <!-- Buttons for navigation -->
    <a href="/pit/" target="_blank" class="button">Web Console</a>
    <a href="/sem/" target="_blank" class="button">Semaphore UI</a>
    <a href="/code/" target="_blank" class="button">Code Server</a>
</body>

</html>

Assicurarsi che proprietario e permessi siano corretti

sudo chown root:root /usr/share/testpage/index.html && sudo chmod 755 /usr/share/testpage/index.html

Configurare il firewall

Aggiungere permanentemente la regola per consentire il traffico HTTP (porta 80).

sudo firewall-cmd --permanent --add-service=http

Aggiungere permanentemente la regola per consentire il traffico HTTPS (porta 443).

sudo firewall-cmd --permanent --add-service=https

Ricaricare la configurazione del firewall per applicare le modifiche permanenti effettuate.

sudo firewall-cmd --reload

Configurazione di SELinux

sudo setsebool -P httpd_can_network_connect on

Nota:

Se SELinux è in modalità enforcing, questo passaggio è necessario affinché il reverse proxy funzioni correttamente.

Abilitare e avvia Nginx

sudo systemctl enable --now nginx

Verificare lo stato di nginx

sudo systemctl status nginx

Installazione della Web Console Cockpit

Installazione dei pacchetti

sudo dnf install -y cockpit

Configurazione di cockpit

sudo systemctl stop cockpit.socket

Assicurarsi che il servizio sia fermo

sudo nano /etc/cockpit/cockpit.conf

Contenuto del file

[WebService]
Origins = https://wile.acme.internal wss://wile.acme.internal https://172.10.0.10 wss://172.10.0.10
ProtocolHeader = X-Forwarded-Proto
UrlRoot=/pit/

Nota: Sostituire wile.acme.internal e 172.10.0.10 con i parametri utilizzati. La direttiva UrlRoot deve corrispondere a quanto definito nella configurazione di nginx

Abilitare il servizio

sudo systemctl enable --now cockpit.socket

Controllo dello stato del servizio

sudo systemctl status cockpit.socket

Installazione di Ansible

Installare Python3.12

sudo dnf install -y python3.12

Creare un utente dedicato

Creare l’utente ansible

sudo useradd --shell /bin/bash --create-home --home-dir /home/ansible ansible

Impostare la password per l’utente ansible

sudo passwd ansible

Eseguire l’accesso con l’utente ansible

sudo -u ansible -i

Virtual Environment python

Creazione del Virtual Environment nella home dell’utente ansible

python3.12 -m venv ~/

Attivazione del Virtual Environment

source ~/bin/activate

Verificare la versione di pythone e di pip

python --version; pip --version

Attivazione dell’ambiente virtuale python ad ogni accesso dell’utente ansible:

Adeguare il file che contiene i comandi di inizializzazione della shell

nano ~/.bashrc

Aggiungere alla fine del file le seguenti istruzioni

# Python VEnv Activation
if [ -f ~/bin/activate ]; then
    source ~/bin/activate;
fi

Installazione di Ansible

pip install ansible ansible-lint ansible-creator

Verifica l’installazione:

ansible --version

Terminata la configurazione dell’ambiente virtuale, chiudere la sessione dell’utente ansible

exit

Nota: riaprire una sessione dell’account ansible per verificare l’attivazione dell’ambiente virtuale python


Installazione di Semaphore UI

Prerequisiti

Installazione Database

sudo dnf install -y mariadb mariadb-server

Configurazione di MariaDB

Avvia e abilita il servizio MariaDB
sudo systemctl enable --now mariadb
Configurazioni iniziali di MariaDB
sudo mysql_secure_installation

Durante il processo:

  • Impostare una password per l’utente root di MariaDB.
  • Rimuovere utenti anonimi.
  • Disabilitare il login remoto per l’utente root (se non necessario).
  • Eliminare il database di test.
Creare un database e un utente per Semaphore:
mysql -u root -p << EOF
CREATE DATABASE semaphore;
CREATE USER 'semaphore'@'localhost' IDENTIFIED BY 'Yipe!!47';
GRANT ALL PRIVILEGES ON semaphore.* TO 'semaphore'@'localhost';
FLUSH PRIVILEGES;
EOF

Nota: verrà chiesta la password dell’utente root di MariaDB precedentemente impostata.
Attenzione: in ambiente di produzione, sostituire Yipe!!47 con una password sicura

Installazione

Scaricare il pacchetto RPM dell’ultima versione stabile (https://github.com/semaphoreui/semaphore/releases).

wget -P /tmp https://github.com/semaphoreui/semaphore/releases/download/v2.14.6/semaphore_2.14.6_linux_amd64.rpm

Installare il pacchetto RPM.

sudo dnf install -y /tmp/semaphore_2.14.6_linux_amd64.rpm

Rimuovere il file di installazione.

rm -f /tmp/semaphore_2.14.6_linux_amd64.rpm

Configurazione Semaphore

Preparare la directory per il file di configurazione, impostare correttamente permessi e proprietario

sudo mkdir -p /home/ansible/.config/semaphore
sudo chmod 700 /home/ansible/.config/semaphore
sudo chown ansible:ansible /home/ansible/.config/semaphore

Avviare il processo di configurazione per generare il database e il file di configurazione.Il proprietario del processo deve essere l’utente ansible.

sudo -u ansible -i semaphore setup --config=/home/ansible/.config/semaphore/config.json

Durante la configurazione:

  • What database to use: 1 – MySQL
  • db Hostname: 127.0.0.1:3306
  • db User: semaphore
  • db Password: Yipe!!47
  • db Name: semaphore
  • Playbook path: /home/ansible
  • Public URL: /sem
  • […]
  • Configurare l’utente amministratore di Semaphore.

Nota: in ambiente di produzione, sostituire Yipe!!47 con la password sicura specificata nel passaggio precedente

Assicurarsi che il file di configurazione abbia i permessi e il proprietario corretti:

sudo chmod 600 /home/ansible/.config/semaphore/config.json
sudo chown ansible:ansible /home/ansible/.config/semaphore/config.json

Gestire Semaphore UI con Systemd

Creare un file di servizio:

sudo nano /etc/systemd/system/semaphore-server@.service

Contenuto del file:

[Unit]
Description=Semaphore Ansible
Documentation=https://github.com/semaphoreui/semaphore
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
ExecReload=/bin/kill -HUP $MAINPID
ExecStart=/bin/bash -c 'source /home/%i/bin/activate && /usr/bin/semaphore server --config /home/%i/.config/semaphore/config.json'
SyslogIdentifier=semaphore
Restart=always
RestartSec=10s
User=%i
Group=%i

[Install]
WantedBy=multi-user.target

Abilitare il servizio

Ricarica i file di configurazione dei servizi systemd

sudo systemctl daemon-reload

Abilita e avvia immediatamente il servizio semaphore-server istanziato per ansible

sudo systemctl enable --now semaphore-server@ansible

Mostra lo stato corrente del servizio semaphore-server@ansible.

sudo systemctl status semaphore-server@ansible

Aggiornare Semaphore UI

Verificare la presenza versioni più recenti su GitHub: https://github.com/semaphoreui/semaphore/releases.

Fermare il servizio

sudo systemctl stop semaphore-server@ansible

Ripetere i passaggi descritti in Installazione di Semaphore sostituendo il file con la versione più recente.

Scaricare il pacchetto di installazione

wget -P /tmp https://github.com/semaphoreui/semaphore/releases/download/vx.x.x/semaphore_x.x.x_linux_amd64.rpm

Nota: sostituire x.x.x con la versione più recente, assicurarsi che il pacchetto sia compatibile con AlmaLinux: “…linux_amd64.rpm

Aggiornare il pacchetto

sudo dnf install -y /tmp/semaphore_x.x.x_linux_amd64.rpm

Rimuovere i file di installazione

rm -f /tmp/semaphore_x.x.x_linux_amd64.rpm

Avviare il servizio

sudo systemctl start semaphore-server@ansible

Verificare lo stato del servizio

sudo systemctl status semaphore-server@ansible

Installazione di Code-Server

Installare l’ultima versione di code-server

curl -fsSL https://code-server.dev/install.sh | sh

Generare, con argon2, un hash per la password da utilizzare nel file di configurazione di code-server

echo -n 'Yipe!!47' | argon2 --encode

Nota: sostituire Yipe!!47 con una password sicura

Avremo un output come questo:

Type: Argon2i
Iterations: 3
Memory: 4096 KiB
Parallelism: 1
Hash: adf24cec5716c03e4e706ad27f46bd10731f3a941397f653f344df02923d6ff7
Encoded: $argon2i$v=19$m=4096,t=3,p=1$LS1lbmNvZGU$rfJM7FcWwD5OcGrSf0a9EHMfOpQTl/ZT80TfApI9b/c
0.012 seconds
Verification ok

Nota: Utilizzeremo il valore del campo `Encoded`

Preparare il file di configurazione di code-server

Creare la directory per la configurazione di code-server e impostare i permessi e il proprietario

sudo mkdir -p /home/ansible/.config/code-server && sudo chown ansible:ansible /home/ansible/.config/code-server && sudo chmod 700 /home/ansible/.config/code-server

Creare il file di configurazione di code-server e impostare i permessi e il proprietario

sudo touch /home/ansible/.config/code-server/config.yaml && sudo chown ansible:ansible /home/ansible/.config/code-server/config.yaml && sudo chmod 600 /home/ansible/.config/code-server/config.yaml

Modificare il file di configurazione

sudo nano /home/ansible/.config/code-server/config.yaml

Impostare il contenuto e sostituire il valore di `hashed-password` con la stringa precedentemente generata con ‘argon2`:

bind-addr: 127.0.0.1:8080
auth: password
hashed-password: "$argon2i$v=19$m=4096,t=3,p=1$LS1lbmNvZGU$rfJM7FcWwD5OcGrSf0a9EHMfOpQTl/ZT80TfApI9b/c"

Abilitare e avviare il servizio

sudo systemctl enable --now code-server@ansible

Verificare lo stato del servizio

sudo systemctl status code-server@ansible

Aggiornare Code-Server

Fermare il servizio

sudo systemctl stop code-server@ansible

Avviare lo script di installazione/aggiornamento

curl -fsSL https://code-server.dev/install.sh | sh

Avviare il servizio

sudo systemctl start code-server@ansible

Verificare lo stato

sudo systemctl status code-server@ansible

Chrony

Assicurarsi che il servizio sia installato

sudo dnf install -y chrony

Assicurarsi che il servizio sia fermo

sudo systemctl stop chronyd.service

Effettuare una copia di backup del file di configurazione originale

sudo cp /etc/chrony.conf /etc/chrony.conf.dist
sudo nano /etc/chrony.conf

Opzionale, se si dispone di un server NTP locale aggiungere la seguente direttiva

server 172.10.0.1 iburst prefer

Nota: sostituire 172.10.0.1 con l’indirizzo del server locale o con altro servizio NTP preferenziale, se è già presente una o più direttive server, valutare se lasciarle o meno

Aggiungere, se non presente, un pool da usare se il server locale / preferenziale non dovesse rispondere

pool 0.it.pool.ntp.org iburst

Aggiungere, infine, la seguente direttiva per permettere di interrogare il servizio dall’host locale

allow 127.0.0.1

Assicurarsi che il servizio sia abilitato e attivo

sudo systemctl enable --now chronyd.service

Verificare lo stato del servizio

sudo systemctl status chronyd.service

Verificare la configurazione

chronyc sources -v

Installazione di OpenSSH su Windows 11

Aprire un editor di testo (Blocco note) e copiare il seguente codice:

@ECHO off
@setlocal EnableDelayedExpansion

@NET SESSION >nul 2>&1 || (echo Esecuzione con privilegi di amministratore richiesta. Riavvio... & powershell -NoProfile -ExecutionPolicy Bypass -Command "Start-Process cmd -ArgumentList '/c \"%~f0\"' -Verb RunAs" & exit /b)

@set LF=^


@SET command=#
@FOR /F "tokens=*" %%i in ('findstr -bv @ "%~f0"') DO SET command=!command!!LF!%%i
@powershell -NoProfile -NoExit -Command !command! & goto:eof


# *** POWERSHELL CODE STARTS HERE *** #

# Controlla se OpenSSH Server e' installato
$ssh = Get-WindowsCapability -Name OpenSSH.Server* -Online

if ($ssh.State -ne 'Installed') {
    Write-Host 'Installazione di OpenSSH.Server in corso...' -ForegroundColor Green
    $installazione = $ssh | Add-WindowsCapability -Online

    # Controllo se l'installazione e' andata a buon fine
    $sshAggiornato = Get-WindowsCapability -Name OpenSSH.Server* -Online
    if ($sshAggiornato.State -eq 'Installed') {
        Write-Host 'Installazione completata con successo.' -ForegroundColor Green
    } else {
        Write-Host 'Errore: Installazione di OpenSSH.Server fallita.' -ForegroundColor Red
        exit 1
    }
} else {
    Write-Host 'OpenSSH Server presente. Nessuna operazione necessaria.' -ForegroundColor Yellow
}


Set-Service -Name sshd -StartupType Automatic -Status Running

# Controlla se la regola esiste
if (-not (Get-NetFirewallRule -Name 'sshd-server-in-tcp' -ErrorAction SilentlyContinue)) {
    $firewallParams = @{
        Name        = 'sshd-server-in-tcp'
        DisplayName = 'Inbound rule for OpenSSH Server (sshd) on TCP port 22'
        Action      = 'Allow'
        Direction   = 'Inbound'
        Enabled     = 'True'  # This is not a boolean but an enum
        Profile     = 'Any'
        Protocol    = 'TCP'
        LocalPort   = 22
    }
    New-NetFirewallRule @firewallParams
    Write-Host 'Creazione regola firewall per OpenSSH.Server' -Fore Green
} else {
    Write-Host 'Regola firewall per OpenSSH.Server presente' -Fore Yellow
}

# Definizione dei parametri per il valore di DefaultShell
$shellParams = @{
    Path         = 'HKLM:\SOFTWARE\OpenSSH'
    Name         = 'DefaultShell'
    Value        = 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe'
    PropertyType = 'String'
    Force        = $true
}

$currentValue = Get-ItemProperty -Path $shellParams.Path -Name $shellParams.Name -ErrorAction SilentlyContinue

if ($null -eq $currentValue -or $currentValue.$($shellParams.Name) -ne $shellParams.Value) {
    New-ItemProperty @shellParams
    Write-Host 'Powershell impostato come DefaultShell per OpenSSH' -Fore Green
} else {
    Write-Host 'Powershell impostato come DefaultShell per OpenSSH' -Fore Yellow
}

Salvare il file con il nome:

install-ssh.cmd

Attenzione: nel salvare lo script, assicurarsi che l’estensione sia “.cmd” e non “.txt”, per ottenere ciò, nel blocco note, deselezionare dall’apposito campo l’estensione predefinita “.txt”

Eseguire lo script e attendere l’installazione/configurazione dei servizi

Fonti per la realizzazione di questo script:

Playbook di verifica

Per testare il funzionamento della piattaforma, autenticarsi su code-server all’indirizzo
https://<ip-o-nome-server>/code.
Dopo aver aperto la directory di lavoro o averne creata una (in /home/ansible), è possibile scrivere i file inventory e playbook ed eseguirli dal terminale integrato

Inventory (INI)

Nota: il seguente inventory ha uno scopo puramente esemplificativo e va adattato al proprio contesto. Modificare l’inventory impostando il nome e l’ip dei PC da gestire nella sezione [windows11] e adeguare le credenziali dell’utente amministrativo, presenti nella sezione [windows11:vars]

Creare un file per l’inventario, ad es. test-inventory.ini, e copiare il seguente contenuto. Quindi adattarlo al proprio contesto.

# Gruppo chiamato 'windows11' che include due host Windows
[windows11]
PC01 ansible_host=172.10.1.101
PC02 ansible_host=172.10.1.102

# Variabili specifiche per il gruppo 'windows11'
[windows11:vars]
# Si usa SSH come metodo di connessione
ansible_connection=ssh
# Specifica che la shell remota è PowerShell
ansible_shell_type=powershell
# Percorso temporaneo per i file usati da Ansible sul target
ansible_remote_tmp=C:\Windows\Temp\Ansible
# Nome utente usato per l'autenticazione SSH
ansible_user=maint
# Password dell'utente per l'autenticazione SSH
ansible_password=Yipe!!47

# Variabili valide per tutti gli host (gruppo 'all')
[all:vars]
# Disabilita il controllo dell'autenticità della chiave host SSH (utile in ambienti test, sconsigliato in ambiente di produzione)
ansible_ssh_common_args='-o StrictHostKeyChecking=no'

Playbook

Test 1 – Ping

Creare un file per l’inventario, ad es. test1.ansible.yaml, e copiare il seguente contenuto.

---
# Nome del playbook, utile per la leggibilità dell'output
- name: Playbook di test 1
  # Specifica il gruppo di host target definiti nell'inventory
  hosts: windows11
  # Inizio della lista dei task da eseguire sugli host target
  tasks:
    # Nome descrittivo del task, appare nell'output di Ansible
    - name: Ping
      # Modulo Ansible specifico per Windows che verifica la raggiungibilità
      # e la corretta configurazione dell'host (non usa ICMP ma un controllo logico)
      ansible.windows.win_ping:
      # Registra il risultato del modulo nella variabile 'ping_result'
      register: ping_result
    # Task per mostrare a video il contenuto della variabile 'ping_result'
    - name: Debug
      # Modulo di debug integrato in Ansible, utile per il troubleshooting
      ansible.builtin.debug:
        var: ping_result

Questo playbook è il più semplice possibile: serve unicamente a testare che:

  1. La connessione SSH con PowerShell funzioni.
  2. Il target abbia una configurazione minima corretta per eseguire moduli Ansible.

Se win_ping restituisce "pong", significa che siamo pronti a procedere con task più complessi.

Test 2 – Imposta il nome del PC

Creare un file per l’inventario, ad es. test2.ansible.yaml, e copiare il seguente contenuto.

---
# Nome del playbook, utile per l'identificazione nell'output
- name: Playbook di test 2
  # Gruppo di host su cui eseguire il playbook (definito nell'inventory)
  hosts: windows11
  # Elenco dei task da eseguire sugli host target
  tasks:
    # Nome descrittivo del task che cambia l'hostname
    - name: Assegna hostname
      # Modulo Ansible per modificare il nome del computer Windows
      ansible.windows.win_hostname:
        # Usa il nome dell'host definito nell'inventory come nuovo hostname
        name: "{{ inventory_hostname }}"
      # Se il nome è cambiato, attiva l'handler di riavvio
      notify: Riavvio se necessario
  # Sezione degli handler, eseguiti solo quando notificati da un task
  handlers:
    # Handler per riavviare il sistema se richiesto (dopo cambio hostname)
    - name: Riavvio se necessario
      # Modulo Ansible per riavviare una macchina Windows
      ansible.windows.win_reboot:

Questo playbook cambia il nome del computer Windows in base al nome usato nell’inventory (es. PC01), e riavvia il sistema solo se il nome è stato effettivamente modificato.

Eseguire il Playbook

Esempi di come eseguire un playbook da riga di comando:

ansible-playbook -i test-inventory.ini test1.ansible.yaml

Esegue il playbook ‘test1.ansible.yaml’ usando il file ‘test-inventory.ini’ come inventory.
Questo playbook esegue un semplice ‘win_ping’ per verificare che Ansible possa connettersi e comunicare correttamente con gli host Windows target.

ansible-playbook -i test-inventory.ini test2.ansible.yaml --check

Esegue il playbook ‘test2.ansible.yaml’ in modalità “check”, detta anche “dry run”.
Ansible simula le modifiche e mostra cosa cambierebbe, ma senza applicare nulla.
Utile per verificare se un host richiede modifiche (es. cambio hostname).
Attenzione: non tutti i moduli supportano completamente l’opzione –check.

ansible-playbook -i test-inventory.ini test2.ansible.yaml -v

Mostra informazioni più dettagliate (-v) sull’esecuzione e sull’interazione con gli host.
Aumentando i ‘v’ (fino a -vvvv) si ottengono livelli crescenti di dettaglio, fino a includere i comandi eseguiti e l’output grezzo ricevuto dal target.

Linkografia essenziale