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