Installazione di Ansible, Semaphore UI, Code Server e Cockpit su AlmaLinux
Indice dei contenuti
- Indice dei contenuti
- Prerequisiti
- Preparazione del sistema
- Installazione di Nginx e Configurazione del Reverse Proxy
- Installazione della Web Console Cockpit
- Installazione di Ansible
- Installazione di Semaphore UI
- Installazione di Code-Server
- Chrony
- Installazione di OpenSSH su Windows 11
- Playbook di verifica
- Eseguire il Playbook
- Linkografia essenziale
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 comandonmcli
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 comandonmcli con show enp1s0
(adeguare il nome dell’interfaccia di reteenp1s0
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
e172.10.0.10
con i parametri utilizzati. La direttivaUrlRoot
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, sostituireYipe!!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:
- La connessione SSH con PowerShell funzioni.
- 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.