Aller au contenu principal

Installation manuelle de Semaphore


Sommaire :


Cette documentation détaille la configuration de Semaphore lorsque vous utilisez les méthodes d'installation suivantes :

Le paquet logiciel Semaphore n'est qu'une partie de l'ensemble du système nécessaire pour exécuter Ansible avec succès.

L'environnement d'exécution Python3 et Ansible est tout aussi important !

REMARQUE : il existe des rôles Ansible Galaxy qui gèrent cette logique de configuration pour vous, ou qui peuvent servir de modèle de base pour votre propre rôle Ansible !


Utilisateur de service

Semaphore n'a pas besoin d'être exécuté en tant qu'utilisateur root ; vous ne devriez donc pas le faire.

Avantages d'un utilisateur de service :

  • Il dispose de sa propre configuration utilisateur
  • Il dispose de son propre environnement
  • Ses processus sont facilement identifiables
  • Sécurité du système renforcée

Vous pouvez créer un utilisateur système soit manuellement avec adduser, soit avec le module ansible.builtin.user.

Dans cette documentation, nous supposerons que :

  • l'utilisateur de service créé s'appelle semaphore
  • son shell est /bin/bash
  • son répertoire personnel est /home/semaphore

Dépannage

Si l'exécution d'Ansible par Semaphore échoue, vous devrez effectuer le dépannage dans le contexte de l'utilisateur de service.

Vous disposez de plusieurs options pour cela :

  • Basculer l'ensemble de votre session shell dans le contexte de l'utilisateur :

    sudo su --login semaphore
  • Exécuter une seule commande dans le contexte de l'utilisateur :

    sudo --login -u semaphore <command>

Python3

Ansible est développé avec le langage de programmation Python3.

Une installation propre de celui-ci est donc essentielle au bon fonctionnement d'Ansible.

Tout d'abord, assurez-vous que les paquets python3 et python3-pip sont installés sur votre système !

Vous disposez de plusieurs options pour installer les modules Python requis :

  • Les installer dans le contexte de l'utilisateur de service
  • Les installer dans un environnement virtuel dédié au service

Prérequis

Dans les deux cas, il est recommandé d'utiliser un fichier requirements.txt pour spécifier les modules à installer.

Nous supposerons que le fichier /home/semaphore/requirements.txt est utilisé.

Voici un exemple de son contenu :

ansible
# for common jinja-filters
netaddr
jmespath
# for common modules
pywinrm
passlib
requests
docker

REMARQUE : vous devriez également mettre à jour ces dépendances de temps en temps !

Une option pour le faire automatiquement est également présentée dans l'exemple de service ci-dessous.

Modules dans le contexte utilisateur

Manuellement :

sudo --login -u semaphore python3 -m pip install --user --upgrade -r /home/semaphore/requirements.txt

Avec Ansible :

- name: Install requirements
ansible.builtin.pip:
requirements: '/home/semaphore/requirements.txt'
extra_args: '--user --upgrade'
become_user: 'semaphore'

Modules dans un virtualenv

Nous supposerons que le virtualenv est créé dans /home/semaphore/venv

Assurez-vous que l'environnement virtuel est activé dans le service ! Cela est également illustré dans l'exemple de service ci-dessous.

Manuellement :

sudo su --login semaphore
python3 -m pip install --user virtualenv
python3 -m venv /home/semaphore/venv
# activate the context of the virtual environment
source /home/semaphore/venv/bin/activate
# verify we are using python3 from inside the venv
which python3
> /home/semaphore/venv/bin/python3
python3 -m pip install --upgrade -r /home/semaphore/requirements.txt
# disable the context to the virtual environment
deactivate

Avec Ansible :

- name: Create virtual environment and install requirements into it
ansible.builtin.pip:
requirements: '/home/semaphore/requirements.txt'
virtualenv: '/home/semaphore/venv'
state: present # or 'latest' to upgrade the requirements

Dépannage

Si vous rencontrez des problèmes avec Python3 en utilisant un environnement virtuel, vous devrez basculer dans son contexte pour les diagnostiquer :

sudo su --login semaphore
source /home/semaphore/venv/bin/activate
# verify we are using python3 from inside the venv
which python3
> /home/semaphore/venv/bin/python3

# troubleshooting

deactivate

Il arrive aussi qu'un environnement virtuel soit cassé par une mise à niveau du système. Dans ce cas, il suffit généralement de supprimer l'environnement existant et de le recréer.


Collections et rôles Ansible

Vous pouvez préinstaller les modules et rôles Ansible afin qu'ils n'aient pas à être installés à chaque exécution d'une tâche !

Prérequis

Il est recommandé d'utiliser un fichier requirements.yml pour spécifier les modules à installer.

Nous supposerons que le fichier /home/semaphore/requirements.yml est utilisé.

Voici un exemple de son contenu :

---

collections:
- 'namespace.collection'
# for common collections:
- 'community.general'
- 'ansible.posix'
- 'community.mysql'
- 'community.crypto'

roles:
- src: 'namespace.role'

Voir aussi : Installation de collections, Installation de rôles

REMARQUE : vous devriez également mettre à jour ces dépendances de temps en temps !

Une option pour le faire automatiquement est également présentée dans l'exemple de service ci-dessous.

Installation dans le contexte utilisateur

Manuellement :

sudo su --login semaphore
ansible-galaxy collection install --upgrade -r /home/semaphore/requirements.yml
ansible-galaxy role install --force -r /home/semaphore/requirements.yml

Installation avec un virtualenv

Manuellement :

sudo su --login semaphore
source /home/semaphore/venv/bin/activate
# verify we are using python3 from inside the venv
which python3
> /home/semaphore/venv/bin/python3

ansible-galaxy collection install --upgrade -r /home/semaphore/requirements.yml
ansible-galaxy role install --force -r /home/semaphore/requirements.yml

deactivate

Proxy inverse

Voir : Sécurité - Connexion chiffrée


Service Systemd étendu

Voici le modèle de base du service systemd.

Ajoutez les paramètres supplémentaires sous leur section [PART] respective

Base

[Unit]
Description=Semaphore UI
Documentation=https://semaphoreui.com/docs
Wants=network-online.target
After=network-online.target
ConditionPathExists=/usr/bin/semaphore
ConditionPathExists=/etc/semaphore/config.json

[Service]
ExecStart=/usr/bin/semaphore server --config /etc/semaphore/config.json
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
RestartSec=10s

[Install]
WantedBy=multi-user.target

Utilisateur de service

[Service]
User=semaphore
Group=semaphore

Modules Python

Dans le contexte utilisateur

[Service]
# to auto-upgrade python modules at service startup
ExecStartPre=/bin/bash -c 'python3 -m pip install --upgrade --user -r /home/semaphore/requirements.txt'

# so the executables are found
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/semaphore/.local/bin"
# set the correct python path. You can get the correct path with: python3 -c "import site; print(site.USER_SITE)"
Environment="PYTHONPATH=/home/semaphore/.local/lib/python3.10/site-packages"

Dans un virtualenv

[Service]
# to auto-upgrade python modules at service startup
ExecStartPre=/bin/bash -c 'source /home/semaphore/venv/bin/activate \
&& python3 -m pip install --upgrade -r /home/semaphore/requirements.txt'

# REPLACE THE EXISTING 'ExecStart'
ExecStart=/bin/bash -c 'source /home/semaphore/venv/bin/activate \
&& /usr/bin/semaphore server --config /etc/semaphore/config.json'

Collections et rôles Ansible

Si Python3 est utilisé dans le contexte utilisateur

[Service]
# to auto-upgrade ansible collections and roles at service startup
ExecStartPre=/bin/bash -c 'ansible-galaxy collection install --upgrade -r /home/semaphore/requirements.yml'
ExecStartPre=/bin/bash -c 'ansible-galaxy role install --force -r /home/semaphore/requirements.yml'

Si Python3 est utilisé dans un virtualenv

# to auto-upgrade ansible collections and roles at service startup
ExecStartPre=/bin/bash -c 'source /home/semaphore/venv/bin/activate \
&& ansible-galaxy collection install --upgrade -r /home/semaphore/requirements.yml \
&& ansible-galaxy role install --force -r /home/semaphore/requirements.yml'

Autres cas d'utilisation

Utilisation d'un MariaDB local

[Unit]
Requires=mariadb.service

Utilisation d'un Nginx local

[Unit]
Wants=nginx.service

Envoi des journaux vers syslog

[Service]
StandardOutput=journal
StandardError=journal
SyslogIdentifier=semaphore

Exemples complets

Modules Python dans le contexte utilisateur

[Unit]
Description=Semaphore UI
Documentation=https://semaphoreui.com/docs
Wants=network-online.target
After=network-online.target
ConditionPathExists=/usr/bin/semaphore
ConditionPathExists=/etc/semaphore/config.json

[Service]
User=semaphore
Group=semaphore
Restart=always
RestartSec=10s
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:~/.local/bin"

ExecStartPre=/bin/bash -c 'ansible-galaxy collection install --upgrade -r /home/semaphore/requirements.yml'
ExecStartPre=/bin/bash -c 'ansible-galaxy role install --force -r /home/semaphore/requirements.yml'
ExecStartPre=/bin/bash -c 'python3 -m pip install --upgrade --user -r /home/semaphore/requirements.txt'

ExecStart=/usr/bin/semaphore server --config /etc/semaphore/config.json
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

Modules Python dans un virtualenv

[Unit]
Description=Semaphore UI
Documentation=https://semaphoreui.com/docs
Wants=network-online.target
After=network-online.target
ConditionPathExists=/usr/bin/semaphore
ConditionPathExists=/etc/semaphore/config.json

[Service]
User=semaphore
Group=semaphore
Restart=always
RestartSec=10s

ExecStartPre=/bin/bash -c 'source /home/semaphore/venv/bin/activate \
&& python3 -m pip install --upgrade -r /home/semaphore/requirements.txt'
ExecStartPre=/bin/bash -c 'source /home/semaphore/venv/bin/activate \
&& ansible-galaxy collection install --upgrade -r /home/semaphore/requirements.yml \
&& ansible-galaxy role install --force -r /home/semaphore/requirements.yml'

ExecStart=/bin/bash -c 'source /home/semaphore/venv/bin/activate \
&& /usr/bin/semaphore server --config /etc/semaphore/config.json'
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

Correctifs

Si une langue système personnalisée est définie, vous pourriez rencontrer des problèmes qui peuvent être résolus en mettant à jour les variables d'environnement associées :

[Service]
Environment=LANG="en_US.UTF-8"
Environment=LC_ALL="en_US.UTF-8"

Dépannage

Si un problème survient lors de l'exécution d'une tâche, il peut s'agir d'un problème d'environnement lié à votre installation, et non d'un problème de Semaphore lui-même !

Veuillez suivre ces étapes pour vérifier si le problème se produit en dehors de Semaphore :

  • Basculez dans le contexte de l'utilisateur :

    sudo su --login semaphore
  • Basculez dans le contexte du virtualenv si vous en utilisez un :

    source /home/semaphore/venv/bin/activate
    # verify we are using python3 from inside the venv
    which python3
    > /home/semaphore/venv/bin/python3

    # troubleshooting

    deactivate
  • Exécutez le playbook Ansible manuellement

    • S'il échoue => il y a un problème avec votre environnement
    • S'il fonctionne :
      • Revérifiez votre configuration dans Semaphore
      • Il peut s'agir d'un problème de Semaphore