Installation¶
Une fois les prérequis en place (Ansible, Docker Swarm et initialisation du cluster), il est possible de personnaliser le déploiement de INFRA à l’aide de variables Ansible. Ces options permettent notamment de configurer la gestion des portails utilisateurs, de la base de données, des serveurs signaux, des certificats SSL etc.
Tip
La configuration des paramètres d’installation doit être définie avant l’exécution de la commande d’installation finale.
Important
Création d’un playbook minimal¶
Pour la suite de l’installation, il est nécessaire de créer un playbook qui sera nommé reemo-infra.yml dans le reste de cette documentation.
- name: Installation Reemo Infra Server
hosts: infra_manager
gather_facts: yes
roles:
- reemo-infra
Fichier inventaire minimal¶
Pour la suite de l’installation, il est nécessaire d’avoir créé un inventaire qui sera nommé inventory.yml dans le reste de cette documentation.
Ce fichier minimal est décrit dans la page Prérequis de l’environnement INFRA.
Il contient la description de l’infrastructure des serveurs ainsi que la clé de licence Reemo au format base64.
Exemple sur un seul server:
all:
vars:
API_LICENSE: "ewogICAg ... Uw5NXhGVDF0NFU2TkxOdjQvZU53PT0iCiAgICC9Cn0="
infra_manager:
hosts:
infra_manager1:
ansible_host: "10.0.0.1"
Certificats SSL¶
Toutes les connexions utilisateurs passent par un service Traefik. L’infrastructure utilise des certificats SSL pour l’exposition du Portail à travers Traefik ainsi que pour les communications internes de la plateforme des différents services.
Important
Il est conseillé d’utiliser une PKI différente pour les communications internes de celle utilisée pour Traefik.
Traefik¶
Trois modes sont disponibles :
Certificat par défaut¶
Par défaut, un certificat autosigné est généré automatiquement lors de la création du conteneur Traefik. Ce mode est adapté pour des environnements de test, mais il n’est pas recommandé en production.
Certificat local¶
Vous pouvez fournir un certificat et une clé stockés sur la machine Ansible. Le rôle reemo-infra se charge de déployer ces fichiers sur les serveurs hébergeant Traefik.
Exemple d’inventaire :
TRAEFIK_SSL_CERTS:
- cert_file: "/localpath/to/cert.crt"
key_file: "/localpath/to/key.key"
Certificat déjà présent sur le serveur¶
Si les certificats sont déjà installés sur les serveurs cibles, vous pouvez indiquer leurs chemins locaux. Ils seront ensuite montés directement dans le conteneur Traefik.
Exemple d’inventaire :
TRAEFIK_SSL_CERTS_REMOTE:
- cert_file_remotepath: "/remotepath/to/cert.crt"
key_file_remotepath: "/remotepath/to/key.key"
Communication internes¶
PKI par défaut¶
Le rôle Ansible reemo-infra embarque une PKI dédiée complète et prête à l’emploi. Elle permet un déploiement simple avec des communications internes chiffrées et authentifiées.
CA générée automatiquement¶
Il est possible d’utiliser une autorité de certification (CA) générée automatiquement lors de l’exécution du rôle reemo-infra.
Étapes à suivre :
Créer un répertoire local sur la machine Ansible, accessible en écriture par l’utilisateur exécutant Ansible.
Ajouter dans le fichier d’inventaire les options nécessaires pour activer cette fonctionnalité.
all:
vars:
LOCAL_PATH: "/opt/reemo/ssl"
INITCA_ENABLE: "true"
infra_manager:
hosts:
infra_manager1:
ansible_host: "10.0.0.1"
infra_manager2:
ansible_host: "10.0.0.2"
infra_manager3:
ansible_host: "10.0.0.3"
Lors du lancement du rôle, une CA sera créée automatiquement dans ce répertoire. Les clés et certificats associés seront ensuite exportés vers le cluster Docker Swarm sous forme de Secrets et montés dans les différents conteneurs qui en ont besoin.
Configuration manuelle¶
Il est aussi possible de générer soi-même les certificats SSL pour les URLs :
reemo_portalreemo_portaladminreemo_apireemo_proapireemo_signalreemo_provisionreemo_prorelayapireemo_procloudapireemo_relayws
Il faut ensuite renseigner dans l’inventaire Ansible les chemins locaux des clés et certificats. Ils seront copiés automatiquement vers le cluster Docker Swarm par le rôle reemo-infra.
Exemple :
all:
vars:
API_LICENSE: "ewogICAg ... Uw5NXhGVDF0NFU2TkxOdjQvZU53PT0iCiAgICC9Cn0="
...
infra_manager:
hosts:
infra_manager1:
ansible_host: "10.0.0.1"
infra_manager2:
ansible_host: "10.0.0.2"
infra_manager3:
ansible_host: "10.0.0.3"
vars:
CA_SSL_CRT_LOCALPATH: "/local/path/ca.crt"
API_SSL_CRT_LOCALPATH: "/local/path/reemo_api.crt"
API_SSL_KEY_LOCALPATH: "/local/path/reemo_api.key"
PROAPI_SSL_CRT_LOCALPATH: "/local/path/reemo_proapi.crt"
PROAPI_SSL_KEY_LOCALPATH: "/local/path/reemo_proapi.key"
PRORELAYAPI_SSL_CRT_LOCALPATH: "/local/path/reemo_prorelayapi.crt"
PRORELAYAPI_SSL_KEY_LOCALPATH: "/local/path/reemo_prorelayapi.key"
SIGNAL_SSL_CRT_LOCALPATH: "/local/path/reemo_signal.crt"
SIGNAL_SSL_KEY_LOCALPATH: "/local/path/reemo_signal.key"
PORTAL_SSL_CRT_LOCALPATH: "/local/path/reemo_portal.crt"
PORTAL_SSL_KEY_LOCALPATH: "/local/path/reemo_portal.key"
TRAEFIK_SSL_CERTS:
- cert_file: "/local/path/domain.crt"
key_file: "/local/path/domain.key"
Gestion du Portail Utilisateur et Administrateur¶
URL des Portails¶
Par défaut les serveurs Infra et Portal répondent sur toutes les requêtes avec un certificat autosigné.
Si vous avec besoin de paramètrer une URL spécifique pour le Portail utilisateur, il faut utiliser la variable suivante:
all:
vars:
API_LICENSE: "ewogICAg ... Uw5NXhGVDF0NFU2TkxOdjQvZU53PT0iCiAgICC9Cn0="
...
infra_manager:
vars:
PORTAL_URL: "url.domain.tld"
hosts:
infra_manager1:
ansible_host: "10.0.0.1"
infra_manager2:
ansible_host: "10.0.0.2"
infra_manager3:
ansible_host: "10.0.0.3"
Si vous avec besoin de paramètrer une URL spécifique pour le Portail administrateur, il faut utiliser la variable suivante:
all:
vars:
API_LICENSE: "ewogICAg ... Uw5NXhGVDF0NFU2TkxOdjQvZU53PT0iCiAgICC9Cn0="
...
infra_manager:
vars:
PORTAL_URL: "url.domain.tld"
PORTALADMIN_URL: "urladmin.domain.ltd"
hosts:
infra_manager1:
ansible_host: "10.0.0.1"
infra_manager2:
ansible_host: "10.0.0.2"
infra_manager3:
ansible_host: "10.0.0.3"
Important
Il est recommandé de ne pas exposer le Portail Administrateur vers un réseau externe. Ce portail est destiné à être utilisé dans votre réseau interne.
Warning
Avec PORTALADMIN_URL activé, les administrateurs ne peuvent plus se connecter via l’URL du portail utilisateur.
Filtrage IP¶
Il est possible d’activer le filtrage sur IP des portails utilisateurs et administrateurs.
all:
vars:
API_LICENSE: "ewogICAg ... Uw5NXhGVDF0NFU2TkxOdjQvZU53PT0iCiAgICC9Cn0="
...
infra_manager:
vars:
PORTAL_URL: "url.domain.tld"
PORTAL_URL_RESTRICT_IP: "10.1.1.1,10.2.2.0/24"
PORTALADMIN_URL: "urladmin.domain.ltd"
PORTALADMIN_URL_RESTRICT_IP: "10.3.1.2,10.3.2.0/24"
hosts:
infra_manager1:
ansible_host: "10.0.0.1"
infra_manager2:
ansible_host: "10.0.0.2"
infra_manager3:
ansible_host: "10.0.0.3"
Gestion des Ports¶
Par défaut le Portail utilisateurs répond sur le port 443 avec une redirection automatique du port 80 vers le port 443 en SSL.
Pour le Portail administrateurs il est possible de spécifier le port:
PORTALADMIN_URL_PORT: "8444"
Warning
Le port doit être différent de 80, 443 et 8443 qui sont déja utilisés pour d’autres services
Séparation physique des Portails¶
Le rôle Ansible reemo-infra vous permet de séparer physiquement le Portail Utilisateurs et le Portail Administrateurs.
Portail dédié aux administrateurs d’instance¶
Pour cela il vous suffit de créer un fichier inventaire en remplacant le groupe infra_manager par 2 groupes api_manager et portal_manager.
Note
Il vous faudra renseigner dans les variables un HMACSECRET qui sera partagé entre les 2 portails et l’API. Ce secret est utilisé pour signer les requêtes en provenance des portails vers l’API.
all:
vars:
API_LICENSE: "ewogICAg ... Uw5NXhGVDF0NFU2TkxOdjQvZU53PT0iCiAgICC9Cn0="
HMACSECRET: "U6US67D70409RFAGQH5ZIWBFV8HX0UCZ"
portal_manager:
children:
portaluser_manager:
vars:
PORTAL_URL: "url.domain.tld"
TRAEFIK_SSL_CERTS:
- cert_file: "/localpath/to/cert.crt"
key_file: "/localpath/to/key.key"
API_IP:
- ip: "10.3.1.1"
- ip: "10.3.1.2"
- ip: "10.3.1.3"
hosts:
portaluser1:
ansible_host: "10.0.0.1"
portaluser2:
ansible_host: "10.0.0.2"
portaluser3:
ansible_host: "10.0.0.3"
portaladmin_manager:
vars:
PORTAL_URL: "admin.domain.tld"
TRAEFIK_SSL_CERTS:
- cert_file: "/localpath/to/cert.crt"
key_file: "/localpath/to/key.key"
API_IP:
- ip: "10.3.1.1"
- ip: "10.3.1.2"
- ip: "10.3.1.3"
hosts:
portaladmin1:
ansible_host: "10.0.0.4"
portaladmin2:
ansible_host: "10.0.0.5"
portaladmin3:
ansible_host: "10.0.0.6"
api_manager:
hosts:
api1:
ansible_host: "10.3.1.1"
api2:
ansible_host: "10.3.1.2"
api3:
ansible_host: "10.3.1.3"^
Warning
Il est important de noter que dans l’exemple ci-dessus, les URLs renseignées utilisent la variable PORTAL_URL et ce même pour le portail administrateur. C’est la valeur à utiliser lorsqu’un seul portail est déclaré sur un serveur particulier.
Portail dédié à un SSO¶
En plus d’une séparation physique vous pouvez aussi restreindre les connecteurs SSO par portail.
Lors de la creation d’un connecteur vous obtenez un GUID qu’il faut ensuite renseigner dans le fichier inventaire dans la section du portal ciblé avec une variable nommée PORTAL_LDAP_CONNECTORS pour les connecteurs LDAP et PORTAL_SAML_CONNECTORS pour les connecteurs SAML
all:
vars:
API_LICENSE: "ewogICAg ... Uw5NXhGVDF0NFU2TkxOdjQvZU53PT0iCiAgICC9Cn0="
HMACSECRET: "..."
portal_manager:
children:
portalsso_manager:
vars:
PORTAL_URL: "urlldap.domain.tld"
TRAEFIK_SSL_CERTS:
- cert_file: "/localpath/to/cert.crt"
key_file: "/localpath/to/key.key"
PORTAL_LDAP_CONNECTORS:
- ldapid: "3182932d-9ee1-4c06-a4cf-c13c25f2ee93"
PORTAL_SAML_CONNECTORS:
- samlid: "692469bd-cb28-8332-aa65-9c95451c1a0e"
hosts:
portalsso1:
ansible_host: "10.0.0.7"
portalsso2:
ansible_host: "10.0.0.8"
portalsso3:
ansible_host: "10.0.0.9"
Si vous avez plusieurs connecteurs à renseigner sur un meme portail, rajouter autant de ligne avec ldapid ou samlid
all:
vars:
API_LICENSE: "ewogICAg ... Uw5NXhGVDF0NFU2TkxOdjQvZU53PT0iCiAgICC9Cn0="
HMACSECRET: "..."
portal_manager:
children:
portalsso_manager:
vars:
PORTAL_URL: "urlsso.domain.tld"
TRAEFIK_SSL_CERTS:
- cert_file: "/localpath/to/cert.crt"
key_file: "/localpath/to/key.key"
PORTAL_LDAP_CONNECTORS:
- ldapid: "3182932d-9ee1-4c06-a4cf-c13c25f2ee93"
- ldapid: "9c713681-b758-4179-b9a2-13618a7b804e"
PORTAL_SAML_CONNECTORS:
- samlid: "692469bd-cb28-8332-aa65-9c95451c1a0e"
- samlid: "4418cfb9-52c5-4d7c-88d1-7660e7809d23"
hosts:
portalsso1:
ansible_host: "10.0.0.7"
portalsso2:
ansible_host: "10.0.0.8"
portalsso3:
ansible_host: "10.0.0.9"
Serveur Signal par Portail¶
Afin de séparer complètement les portails, vous avez la possibilité de leur assigner des serveurs Signaux spécifiques qui seront utilisés par les conteneurs lancés depuis ces portails.
portal_manager:
vars:
API_IP:
- ip: "10.0.0.1"
children:
portal1_user:
hosts:
portal1_user1:
ansible_host: "10.0.0.2"
PORTAL_URL: "portal1.domain.tld"
PROVISION_SIGNAL_IP:
- ip: "10.0.0.2"
portal2_user:
hosts:
portal2_user1:
ansible_host: "10.0.0.3"
PORTAL_URL: "portal2.domain.tld"
PROVISION_SIGNAL_IP:
- ip: "10.0.0.3"
Filtrage des roles utilisateurs sur un Portail¶
Vous pouvez restreindre le type d’utilisateurs autorisés à se connecter à un portail particulier. Le filtrage s’effecture sur le rôle des utilisateurs.
Administrateur d’instance
Administrateur d’organisation
Membre d’une organisation
Portail Principal¶
Par défaut, tous les utilisateurs peuvent s’authentifier sur un portail, mais avec l’option PORTAL_TYPE il est possible d’en restreindre l’accès à un type d’utilisateur.
PORTAL_TYPE |
par défaut |
user |
admin |
orgadmin |
instadmin |
orguser |
|---|---|---|---|---|---|---|
Administrateur d’instance |
||||||
Administrateur d’organisation |
||||||
Membre d’une organisation |
Portail Admin¶
Le portail secondaire est configuré par défaut comme un portail dédié aux administrateurs. Vous pouvez spécifier quels types d’administrateurs peuvent se connecter en utilisant la variable PORTALADMIN_TYPE.
PORTALADMIN_TYPE |
par défaut |
orgadmin |
instadmin |
|---|---|---|---|
Administrateur d’instance |
|||
Administrateur d’organisation |
|||
Membre d’une organisation |
Exemple avec un portail dédié aux utilisateurs et le portail administrateur dédié uniquement aux administrateurs d’instance:
all:
vars:
API_LICENSE: "ewogICAg ... Uw5NXhGVDF0NFU2TkxOdjQvZU53PT0iCiAgICC9Cn0="
HMACSECRET: "..."
portal_manager:
children:
portaluser_manager:
vars:
PORTAL_URL: "url.domain.tld"
PORTAL_TYPE: "user"
TRAEFIK_SSL_CERTS:
- cert_file: "/localpath/to/cert.crt"
key_file: "/localpath/to/key.key"
hosts:
portaluser1:
ansible_host: "10.0.0.1"
portaluser2:
ansible_host: "10.0.0.2"
portaluser3:
ansible_host: "10.0.0.3"
portaladmin_manager:
vars:
PORTAL_URL: "admin.domain.tld"
PORTAL_TYPE: "instadmin"
TRAEFIK_SSL_CERTS:
- cert_file: "/localpath/to/cert.crt"
key_file: "/localpath/to/key.key"
hosts:
portaladmin1:
ansible_host: "10.0.0.4"
portaladmin2:
ansible_host: "10.0.0.5"
portaladmin3:
ansible_host: "10.0.0.6"
api_manager:
hosts:
api1:
ansible_host: "10.3.1.1"
api2:
ansible_host: "10.3.1.2"
api3:
ansible_host: "10.3.1.3"
Services de Signalisation¶
Les services de Signalisation sont utilisés pour l’enregistrement des Agents Reemo sur la plateforme, mais aussi pour l’échange d’informations nécessaires à l’établissement d’une connexion entre l’utilisateur et ses ressources. Ces services ont la particularité d’être unique et dans un environnement Docker Swarm vous verrez apparaitre en fonction de votre architecture plusieurs services de Signalisation avec toujours un seul replica.
Exemple:
ID NAME MODE REPLICAS IMAGE
...
g8hmzpicyq2o reemo_signal1 replicated 1/1 registry.reemo.io/reemoinfrasignal
s105if31h6l0 reemo_signal2 replicated 1/1 registry.reemo.io/reemoinfrasignal
Tip
Les services de Signalisation seront toujours nommés reemo_signal suivi d’un chiffre.
Ports¶
Par défaut les services de Signalisation écoutent sur le port 8443 à travers service Traefik qui portera le certificat SSL. Ce port sera accessible par les Agents Reemo. Les utilisateurs le contacteront par le service Portal sur le port 443
SSL¶
Les certificats sont gérés de la même façon que pour les portails, un premier certificat pour le Traefik, un second pour la communication entre Traefik/Portal et les services de Signalisation.
Multi-signal¶
Dans une installation classique, les agents Reemo viennent s’enregistrer sur les services de signalisation qui sont partagés par les différents portails d’accès utilisateurs. Pour une séparation complète des portails et des agents, il est possible de configurer une installation multi-signal. Chaque portails et environnements de provisioning utiliseront leurs propres services de signalisation pour garantir une séparation complète des environnements utilisateurs.
all:
vars:
API_LICENSE: "ewogICAg ... Uw5NXhGVDF0NFU2TkxOdjQvZU53PT0iCiAgICC9Cn0="
HMACSECRET: "..."
portal_manager:
vars:
API_IP:
- ip: "10.0.0.3"
children:
portal1_user:
hosts:
portal1_user1:
ansible_host: "10.0.0.1"
PORTAL_URL: "portal1.domain.tld"
PROVISION_SIGNAL_IP:
- ip: "10.0.0.1"
portal2_user:
hosts:
portal2_user1:
ansible_host: "10.0.0.2"
PORTAL_URL: "portal2.domain.tld"
PROVISION_SIGNAL_IP:
- ip: "10.0.0.2"
CRON¶
Plusieurs services CRON sont utilisés dans une plateforme Reemo.
Important
Il est impératif que ces services soient unique. Dans le cas de l’utilisation de plusieurs serveurs/clusters infra ou api, il faut choisir le serveur/cluster devant prendre en charge ces services et les désactiver dans les autres par l’option CRON_ENABLE: “false”.
APICRON¶
Ce service est responsable de la gestion générale des tâches de la plateforme.
Option disponible:
API_cronGhostContainersMinutes: permet de régler le temps d’expiration des conteneurs qui continuent à être UP dans l’environnement PROVISION mais qui n’ont plus d’existence connue par l’interface aussi appelés Conteneurs fantômes.
APICRONLOG¶
Service permettant la suppression programmée des logs et évènements qui dépassent la période de rétention configurée.
Options disponibles:
API_CRONLOG_INTERVAL: Intervalle entre 2 requetes de suppression de logs en heure (24 heures par défaut)
API_CRONLOG_RETENTION: Temps de rétention des logs en mois (12 mois par défaut)
APICRONLDAP¶
Service permettant la synchronisation avec un serveur LDAP.
Option disponible:
API_CRONLDAP_INTERVAL: Intervalle en minutes entre chaque synchronisation avec le serveur LDAP (60 minutes par défaut)
Base de données¶
L’environnement INFRA nécessite une base de données qui peut être interne ou externe à Docker Swarm
Base de données externe¶
Pour configurer l’accès à une base de données externe, vous pouvez renseigner les variables suivantes en fonction du moteur de la base:
MySQL¶
DB_USER: "< Utilisateur pour s'authentifier sur la base de données >"
DB_USER_PASSWORD: "< Mot de passe pour s'authentifier sur la base de données >"
DB_NAME: "< Nom de la base de données >"
DB_HOST: "< IP >"
DB_DIALECT: "mysql"
PostgreSQL¶
DB_USER: "< Utilisateur pour s'authentifier sur la base de données >"
DB_USER_PASSWORD: "< Mot de passe pour s'authentifier sur la base de données >"
DB_NAME: "< Nom de la base de données >"
DB_HOST: "< IP >"
DB_DIALECT: "postgresql"
Ajout du support SSL¶
Pour ajouter le support SSL pour la connexion à la base de données, vous pouvez utiliser les options suivantes, à rajouter dans le fichier inventaire d’Ansible
DB_SSL_REQUIRE: "true"
DB_SSL_CERT_LOCALPATH: "/local/path/cert.crt"
DB_SSL_KEY_LOCALPATH: "/local/path/key.key"
DB_SSL_CA_LOCALPATH: "/local/path/ca.crt"
Base de données interne¶
Par défaut un serveur MySQL est présent dans le rôle reemo-infra, il sera déployé et configuré automatiquement si une base de données externe n’est pas renseignée.
MySQL¶
Par défaut une base de données MySQL est déployée dans l’environnement Docker Swarm.
Sur une architecture à un seul serveur, le répertoire local /opt/reemo sera monté dans le conteneur MySQL pour y installer la base de données.
Warning
Si vous ne souhaitez pas utiliser MySQL NDBCLUSTER, il faut prévoir une réplication entre les répertoires /opt/reemo pour que le conteneur MySQL puisse se relancer
sur un autre noeud en cas d’arrêt et conserver l’ensemble de ces données de la base existante.
MySQL NDBCLUSTER¶
Pour activer l’utilisation d’une base de données MySQL NDBCLUSTER, ajouter l’option DB_DIALECT=NDBCLUSTER dans le fichier inventaire, et les noms des différents hostnames composant votre cluster Swarm:
all:
vars:
API_LICENSE: "ewogICAg ... Uw5NXhGVDF0NFU2TkxOdjQvZU53PT0iCiAgICC9Cn0="
infra_manager:
vars:
DB_DIALECT: "NDBCLUSTER"
MYSQL_CLUSTER_DataMemory: 2G # permet d'augmenter la mémoire de la base de données (par défaut 2G)
MYSQL_CLUSTER_PATH: "/data/mysqlcluster" # Chemin où seront stockés les informations des différents services NDBCLUSTER (par défaut "/data/mysqlcluster")
MYSQL_NODE_HOSTNAME_DB1: "infra1"
MYSQL_NODE_HOSTNAME_DB2: "infra2"
MYSQL_NODE_HOSTNAME_DB3: "infra3"
hosts:
infra_manager1:
ansible_host: "10.0.0.1"
infra_manager2:
ansible_host: "10.0.0.2"
infra_manager3:
ansible_host: "10.0.0.3"
Tip
NDBCLUSTER requiert un minimum de 8 Go de RAM par noeud.
Warning
La latence recommandée est de l’ordre de moins de 1 ms entre les noeuds, entre 1 et 5 ms les performances peuvent chuter, au dessus de 5 ms risque de ralentissements et d’instabilités
Initialisation de la base de données¶
Voici les variables par défaut qu’il est possible de configurer à l’initialisation de la base de données:
INIT_MINIMUM_PASSWORD_LENGTH: "8"
INIT_PASSWORD_REQUIRE_LETTERS: "false"
INIT_PASSWORD_REQUIRE_DIGITS: "false"
INIT_PASSWORD_REQUIRE_SPECIALCHAR: "false"
L’initialisation de la base de données se fait lors de l’installation finale en utilisant la variable INIT_DB=true
Note
L’initialisation de la base de données n’est à exécuter qu’une seule fois.
Installation finale¶
Une fois votre inventaire terminé, vous pouvez effectuer l’installation finale de l’environnement INFRA et l’initialisation de la base de données avec le rôle Ansible reemo-infra.
ansible-playbook -i inventory.yml playbooks/reemo-infra.yml --extra-vars "INIT_DB=true"
Warning
Cette commande installe l’environnement et initialise la base de données. Elle n’est à exécuter qu’une seule fois.