Docker
Esegui le immagini dell’app e dell’RTE di AnsibleForms con Docker o Podman, accanto a un tuo server MySQL
Puoi eseguire AnsibleForms con Docker o Podman come due container, l’app e l’RTE che esegue i playbook, collegati a un database MySQL.
Prerequisiti
Prima di iniziare ti servono:
- Docker o Podman : uno dei due installato e in esecuzione
- MySQL : installato e in esecuzione
Installa MySQL
Installa MySQL 8+, o MariaDB, su un server Linux raggiungibile dal container:
Ubuntu include MySQL 8:
sudo apt-get update
sudo apt-get install -y mysql-server
sudo systemctl enable --now mysql
sudo mysql_secure_installation
Debian include MariaDB al posto di MySQL, supportato anch’esso da AnsibleForms:
sudo apt-get update
sudo apt-get install -y mariadb-server
sudo systemctl enable --now mariadb
sudo mariadb-secure-installation
RHEL 8 e successivi, e le sue ricompilazioni, includono MySQL 8 in AppStream:
sudo dnf install -y mysql-server
sudo systemctl enable --now mysqld
sudo mysql_secure_installation
AnsibleForms si connette al database tramite la rete, come DB_USER con DB_PASSWORD. Dagli un utente tutto suo, con diritti solo sullo schema AnsibleForms, non root:
CREATE USER 'ansibleforms'@'%' IDENTIFIED BY '<password>';
GRANT ALL PRIVILEGES ON `AnsibleForms`.* TO 'ansibleforms'@'%';
È tutto ciò che serve ad AnsibleForms: con questo crea e aggiorna il suo schema e fa i suoi backup. La pagina Stato e il log avvisano quando l’utente ha diritti su tutti i database. Su Ubuntu e Debian il server ascolta solo su localhost: imposta bind-address nella sua configurazione in modo che i container possano raggiungerlo.
Prepara le cartelle
AnsibleForms 7 gira in due container: l’app, e l’RTE (ambiente di runtime) che esegue i playbook. Entrambi montano una cartella per il tuo config.yaml, moduli, playbook, log e certificati, e una cartella per la chiave SSH. Le immagini girano come utente node (uid 1000), quindi assegna a quell’utente entrambe le cartelle:
sudo mkdir -p /srv/apps/ansibleforms/persistent /srv/apps/ansibleforms/ssh
sudo chown -R 1000:1000 /srv/apps/ansibleforms/persistent /srv/apps/ansibleforms/ssh
Metti le impostazioni dell’app in un file di ambiente: la connessione al database, ENCRYPTION_SECRET prima di salvare qualsiasi credenziale, il token che l’app e l’RTE condividono (RTE_TOKEN, almeno 16 caratteri) e il config seed che dichiara l’RTE:
sudo tee /srv/apps/ansibleforms/ansibleforms.env > /dev/null <<'END'
DB_HOST=192.168.0.1
DB_PORT=3306
DB_USER=ansibleforms
DB_PASSWORD=<password>
ENCRYPTION_SECRET=<a long random string>
RTE_TOKEN=<at least 16 characters>
CONFIG_SEED_PATH=/app/dist/persistent/seed.yaml
END
sudo chmod 600 /srv/apps/ansibleforms/ansibleforms.env
L’RTE riceve un file tutto suo, senza le impostazioni del database: dalla 7.3.0 l’app lo contatta e tiene aperto un WebSocket (RTE_MODE=inbound, vedi Modalità), ed esegue i playbook dalle stesse cartelle (RTE_FILES=local):
sudo tee /srv/apps/ansibleforms/rte.env > /dev/null <<'END'
RTE_MODE=inbound
RTE_TOKEN=<the same token>
RTE_FILES=local
PORT=8000
HTTPS=0
END
sudo chmod 600 /srv/apps/ansibleforms/rte.env
Il config seed dichiara una credenziale RTE con l’indirizzo dell’RTE e il suo token, e il runner predefinito rte che accede con essa:
sudo tee /srv/apps/ansibleforms/persistent/seed.yaml > /dev/null <<'END'
version: 1
credentials:
items:
- name: rte
credential_type: rte
url: http://rte:8000
password: ${RTE_TOKEN}
runners:
items:
- name: rte
type: rte
rte_mode: inbound
credential: rte
is_default: true
END
sudo chown 1000:1000 /srv/apps/ansibleforms/persistent/seed.yaml
Avvia i container
Esegui le immagini pubblicate sul GitHub Container Registry (vedi Tag delle immagini): ghcr.io/ansibleforms/ansibleforms per l’app e ghcr.io/ansibleforms/ansibleforms-rte-full per l’RTE.
Il seed aggiunge l’RTE in Connessioni > Runner come runner rte, quello predefinito, così i moduli playbook vengono eseguiti su di esso senza altra configurazione. L’app crea lo schema al primo avvio, e contatta l’RTE quando entrambi sono in esecuzione (un config.yaml di esempio si trova nel progetto docker-compose):
docker network create ansibleforms
docker run -d --name ansibleforms --network ansibleforms -p 8000:8000 --restart unless-stopped \
--env-file /srv/apps/ansibleforms/ansibleforms.env \
-v /srv/apps/ansibleforms/persistent:/app/dist/persistent \
-v /srv/apps/ansibleforms/ssh:/home/node/.ssh \
ghcr.io/ansibleforms/ansibleforms:7
docker run -d --name rte --network ansibleforms --restart unless-stopped --stop-timeout 30 \
--env-file /srv/apps/ansibleforms/rte.env \
-v /srv/apps/ansibleforms/persistent:/app/dist/persistent \
-v /srv/apps/ansibleforms/ssh:/home/node/.ssh \
ghcr.io/ansibleforms/ansibleforms-rte-full:7
Una volta avviati, entrambi i container compaiono nell’elenco:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c0e2a91d7f4 ghcr.io/ansibleforms/ansibleforms-rte-full:7 "/usr/bin/tini -- no…" 10 seconds ago Up 9 seconds (healthy) rte
d91f7b05b67e ghcr.io/ansibleforms/ansibleforms:7 "/usr/bin/tini -- no…" 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:8000->8000/tcp ansibleforms
Podman accetta le stesse opzioni e non richiede un servizio:
podman network create ansibleforms
podman run -d --name ansibleforms --network ansibleforms -p 8000:8000 --restart unless-stopped \
--env-file /srv/apps/ansibleforms/ansibleforms.env \
-v /srv/apps/ansibleforms/persistent:/app/dist/persistent \
-v /srv/apps/ansibleforms/ssh:/home/node/.ssh \
ghcr.io/ansibleforms/ansibleforms:7
podman run -d --name rte --network ansibleforms --restart unless-stopped --stop-timeout 30 \
--env-file /srv/apps/ansibleforms/rte.env \
-v /srv/apps/ansibleforms/persistent:/app/dist/persistent \
-v /srv/apps/ansibleforms/ssh:/home/node/.ssh \
ghcr.io/ansibleforms/ansibleforms-rte-full:7
Una volta avviati, entrambi i container compaiono nell’elenco:
podman ps
L’app ascolta sulla porta 8000, in HTTP a meno che tu non imposti HTTPS=1. L’RTE non è pubblicato sull’host: solo l’app lo contatta, dentro la rete. --stop-timeout 30 dà all’RTE il tempo di lasciar terminare i playbook in esecuzione durante uno stop (vedi Eseguire un RTE per le impostazioni dell’RTE e per creare un tuo RTE).
Prova l’applicazione
Una volta avviati i container, apri AnsibleForms in un browser:
- Apri
http://your_ip:8000(o HTTPS, se hai impostatoHTTPS=1) - Accedi come
admin/AnsibleForms!123(o con la password che hai impostato conADMIN_PASSWORD), e scegli una nuova password - Controlla in Connessioni > Runner che l’RTE sia elencato come
rte, il runner predefinito, e che la sua pagina mostri la sua Connessione come Connesso - Prossimi passi:
- Crea moduli aggiungendo file YAML alla cartella
formso usando il designer integrato - Aggiungi i tuoi playbook alla cartella
playbooksdella cartella persistente montata - Aggiungi una connessione LDAP
- Aggiungi utenti e gruppi
- Aggiungi runner per i moduli template: AWX, AAP o Ascender, Semaphore, Rundeck o Jenkins
- Aggiungi credenziali per connessioni esterne, come altri server MySQL o API REST, o da passare ai playbook Ansible
- Crea moduli aggiungendo file YAML alla cartella