🚀 Installation de Sempahore UI
Choix du type d'installation
Il existe 3 façons d'installer Semaphore :
- Snap : pratique pour une première prise en main mais peut s'avérer vite limitée notamment lors de l'utilisation de librairies Python. J'avais démarré avec ce mode d'installation, mais j'ai eu un blocage avec la librairie Python Kerberos utilisé avec mes hôtes cibles Windows.
- Docker : Je n'ai pas testé.
- Paquet : C'est sur ce modèle que j'ai choisi d'installer Semaphore UI.
Préparation de l'environnement
Environnement utilisé
VM Debian 12 virtualisée sur Promox VE.
Gitea pour le dépôt Git.
Installation et configuration de PostgreSQL
Nous nous servirons de Postgresql comme backend de configuration.
Sur notre serveur dédié à Semaphore :
apt install bash && apt install postgresql -y
# Se connecter en tant que postgres puis lancer lancer la console PSQL
su - postgres
psql
create database semaphoredb;
create user semaphore with encrypted password 'unautremotdepasse';
grant all privileges on database semaphoredb to semaphore;
ALTER DATABASE semaphoredb OWNER TO semaphore;
GRANT USAGE, CREATE ON SCHEMA PUBLIC TO semaphore;
Installation d'Ansible
apt install gpg
UBUNTU_CODENAME=jammy
wget -O- "https://keyserver.ubuntu.com/pks/lookup?fingerprint=on&op=get&search=0x6125E2A8C77F2818FB7BD15B93C4A3FD7BB9C367" | sudo gpg --dearmour -o /usr/share/keyrings/ansible-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/ansible-archive-keyring.gpg] http://ppa.launchpad.net/ansible/ansible/ubuntu $UBUNTU_CODENAME main" | sudo tee /etc/apt/sources.list.d/ansible.list
sudo apt update && sudo apt install ansible
Création d'un utilisateur
Sur le serveur créez un utilisateur standard qui nous servira pour le service Semaphore. Le mien sera "semuser01" avec comme groupe "semuser01"
Installation et configuration de Sémaphore
Installation
apt install curl git -y
vim /root/semaphore_latest.sh
#!/bin/bash
VER=$(curl -s https://api.github.com/repos/ansible-semaphore/semaphore/releases/latest|grep tag_name | cut -d '"' -f 4|sed 's/v//g')
wget -q https://github.com/ansible-semaphore/semaphore/releases/download/v${VER}/semaphore_${VER}_linux_amd64.deb
dpkg -i semaphore_${VER}_linux_amd64.deb
./semaphore_latest.sh
Configuration globale
mkdir /etc/semaphore/
chown -R semuser01:semuser01 /etc/semaphore/
semaphore setup
Hello! You will now be guided through a setup to:
1. Set up configuration for a MySQL/MariaDB database
2. Set up a path for your playbooks (auto-created)
3. Run database Migrations
4. Set up initial semaphore user & password
What database to use:
1 - MySQL
2 - BoltDB
3 - PostgreSQL
(default 1): 3
db Hostname (default 127.0.0.1:5432):
db User (default root): semaphore
db Password: LEPASSWORD
db Name (default semaphore): semaphoredb
Playbook path (default /tmp/semaphore):
Public URL (optional, example: https://example.com/semaphore):
Enable email alerts? (yes/no) (default no):
Enable telegram alerts? (yes/no) (default no):
Enable slack alerts? (yes/no) (default no):
Enable LDAP authentication? (yes/no) (default no):
Config output directory (default /root): /etc/semaphore/
Running: mkdir -p /etc/semaphore/..
Configuration written to /etc/semaphore/config.json..
Pinging db..
Running db Migrations..
Executing migration v0.0.0 (at 2024-01-06 13:46:12.504720912 +0100 CET m=+60.655151485)...
Creating migrations table
(...)
Migrations Finished
> Username: semuser01 # (1)
> Email: semuser01@domain.tld
> Your name: semuser01
> Password: UNPASSWORD
You are all setup semuser01
Re-launch this program pointing to the configuration file
./semaphore server --config /etc/semaphore/config.json
To run as daemon:
nohup ./semaphore server --config /etc/semaphore/config.json &
You can login with semuser01@domain.tld or semuser01.
- Ici j'ai de nouveau créé un utilisateur semuser01 mais il n'est pas lié au compte créé précédemment sur le serveur.
Il ne reste plus qu'à configurer le service.
vim /etc/systemd/system/semaphore.service
[Unit]
Description=Semaphore Ansible
Documentation=https://github.com/ansible-semaphore/semaphore
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=semuser01
Group=semuser01
ExecReload=/bin/kill -HUP $MAINPID
ExecStart=/usr/bin/semaphore service --config=/etc/semaphore/config.json
SyslogIdentifier=semaphore
Restart=always
[Install]
WantedBy=multi-user.target
root@srv-semaphore:~# systemctl daemon-reload
root@srv-semaphore:~# systemctl enable semaphore.service
Created symlink /etc/systemd/system/multi-user.target.wants/semaphore.service → /etc/systemd/system/semaphore.service.
root@srv-semaphore:~# systemctl start semaphore.service
Connectez-vous sur http://IP:3000 et authentifiez vous avec le user semuser01
créé lors du setup de Semaphore.
Note
Les données sensibles sont stockées et chiffrées dans la base de données. Vous devez définir l'option de configuration access_key_encryption dans le fichier de configuration /etc/semaphore/config.json pour activer le chiffrement des clés d'accès. Cette clé est générée automatiquement lors du setup.
Configuration de Nginx en tant que reverse-proxy
Façon de se connecter de manière sécurisée à Semaphore, j'ai utilisé ma PKI locale pour créer un certificat serveur puis j'ai configuré mon reverse-proxy Nginx :
upstream srvsem {
server IPSEMAPHORESRV:3000;
keepalive 64;
}
server {
listen 80;
server_name sem.domain.tld;
return 301 https://$host$request_uri;
}
server {
server_name sem.domain.tld;
listen 443 ssl http2;
# Other SSL stuff goes here
ssl_certificate /etc/nginx/ssl/sem.crt;
ssl_certificate_key /etc/nginx/ssl/sem.key;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
add_header X-XSS-Protection "1; mode=block";
add_header X-Frame-Options "DENY";
add_header X-Content-Type-Options "nosniff";
more_set_headers "Server: My server";
add_header X-Powered-By "Love";
add_header Referrer-Policy "no-referrer";
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_set_header X-NginX-Proxy true;
proxy_buffering off;
proxy_request_buffering off;
proxy_pass http://srvsem/;
}
location /api/ws {
proxy_pass http://srvsem/api/ws;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Origin "";
}
access_log /var/log/nginx/sem.access.log;
error_log /var/log/nginx/sem.error.log;
}
Testez la connexion en vous rendant maintenant sur https://sem.domain.tld