Aller au contenu

🚀 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 :

Dans une console en tant que root :
apt install bash && apt install postgresql -y

# Se connecter en tant que postgres puis lancer lancer la console PSQL
su - postgres
psql
Changement du mot de pase de postgres
ALTER USER postgres WITH password 'unmotdepasse';
Création de la base de donnée
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.
  1. 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