Un RTE dans un autre datacenter
D’un hôte nu dans un second datacenter à un RTE sortant qui exécute son premier playbook
- Le résultat
- 0. Avant de commencer
- 1. Préparer l’hôte
- 2. Réseau et pare-feu
- 3. Dossiers
- 4. L’image
- 5. Paramètres
- 6. Le démarrer
- 7. Le vérifier sur l’hôte
- 8. L’approuver
- 9. Le vérifier dans AnsibleForms
- 10. Un premier job
- 11. Lui envoyer les formulaires
- Quand quelque chose échoue
- Le mettre à jour
- Revenir en arrière
- Plus de capacité dans le datacenter 2
- Un RTE en mode base de données
Pour les administrateurs : quand les hôtes gérés d’un second datacenter doivent être joints depuis un RTE de ce datacenter, et non depuis le premier.
La voie facile. L’installeur réalise toutes les étapes ci-dessous sur l’hôte du RTE en une seule commande :
curl -fsSL https://ansibleforms.com/install | sh -s -- install --role runner, avec--join afj_...pour le faire approuver immédiatement. Ce runbook fait la même chose à la main, avec Docker ou Podman, pour que vous puissiez voir et adapter chaque partie.
Le résultat
L’application, son worker et sa base de données restent où ils sont, dans le datacenter 1. Le datacenter 2 reçoit un hôte qui exécute un conteneur RTE en mode sortant (RTE_MODE=outbound, voir Modes) : il contacte l’application en HTTPS et garde un WebSocket ouvert, rejoint comme runner à part entière, et exécute les playbooks des formulaires qui le nomment sur les hôtes gérés du datacenter 2.
| Où | Ce qui y tourne | Parle à |
|---|---|---|
| Datacenter 1 | Les nœuds d’application, le worker, la base de données (comme aujourd’hui) | Rien de nouveau : il accepte le socket du RTE sur son adresse HTTPS habituelle |
| Datacenter 2, l’hôte du RTE | Docker ou Podman, et le conteneur RTE | L’application à APP_URL en HTTPS, et les hôtes gérés du datacenter 2 |
Le RTE ne détient aucun identifiant de base de données ni ENCRYPTION_SECRET, seulement un jeton à lui. Rien ne s’y connecte, il n’a donc besoin d’aucun port ouvert, d’aucun nom DNS ni d’aucun certificat. L’application envoie les playbooks et les inventaires avec chaque job (RTE_FILES=transfer, la valeur par défaut), le RTE n’a donc besoin ni d’en avoir une copie ni d’un disque partagé.
Toutes les commandes ci-dessous s’exécutent dans un terminal sur l’hôte du RTE, en tant qu’utilisateur disposant de sudo, sauf indication contraire. Comptez environ 20 minutes, dont la plupart à attendre l’image.
0. Avant de commencer
Rassemblez ceci :
| Quoi | D’où cela vient |
|---|---|
| L’adresse de l’application | APP_URL : l’adresse que les gens ouvrent dans un navigateur, comme https://forms.example.com, avec son chemin de base s’il en a un |
| Le certificat de l’application | Signé par une CA publique, une CA privée (il vous faut son certificat, étape 6), ou auto-signé |
| Un proxy | Le HTTPS_PROXY qu’utilise ce datacenter pour joindre le datacenter 1, s’il y en a un |
| Le nom du RTE | Le nom de son runner dans Connexions > Runners, que les formulaires nomment avec runner:, comme rte-dc2 : lettres, chiffres et _ . : @ - |
| Un jeton d’adhésion | Facultatif : un jeton d’adhésion (afj_...) approuve le RTE immédiatement. Sans lui, un admin l’approuve (étape 8) |
| La clé ssh | La clé privée qu’utilisent les playbooks pour joindre les hôtes gérés, ou le droit d’en créer une |
L’application doit être en 7.3.0 ou ultérieure. Pour créer un jeton d’adhésion pour ce seul RTE, un admin appelle l’API une fois (voir Jetons d’adhésion) :
curl -X POST https://forms.example.com/api/v2/runner/jointoken \
-H "Authorization: Bearer <an admin's token>" -H "Content-Type: application/json" \
-d '{ "name": "rte-dc2", "expiresInHours": 24, "maxUses": 1 }'
1. Préparer l’hôte
Le RTE est un conteneur, l’hôte n’a donc besoin que d’un moteur de conteneurs : Node.js, python et ansible sont dans l’image.
| Besoin | Pourquoi |
|---|---|
| Linux sur x86_64 (amd64) | Les images RTE ne sont publiées que pour amd64 |
| 2 CPU et 4 Go de mémoire, ou plus | Un RTE exécute jusqu’à RTE_MAX_JOBS playbooks à la fois (10), chacun avec ses forks : dimensionnez-le en conséquence |
| 20 Go d’espace disque libre | L’image -rte-full fait environ 3,3 Go, plus une image pendant les mises à jour, les fichiers de job qu’envoie l’application et les fichiers temporaires des jobs |
| Docker, ou Podman avec podman-compose | Pour tirer et exécuter l’image |
| L’heure réglée par NTP | Les heures des jobs sont comparées à celles de l’application |
Docker, sur Ubuntu ou Debian (autres distributions : docs.docker.com/engine/install) :
sudo apt-get update && sudo apt-get install -y ca-certificates curl chrony
curl -fsSL https://get.docker.com | sudo sh
sudo systemctl enable --now docker chrony
sudo usermod -aG docker $USER # log out and in again, so docker works without sudo
docker run --rm hello-world
docker compose version
Podman, sur RHEL, Rocky ou Alma Linux :
sudo dnf install -y podman podman-compose chrony
sudo systemctl enable --now chronyd
podman run --rm quay.io/podman/hello
Avec Podman, écrivez podman au lieu de docker et podman-compose au lieu de docker compose dans toutes les commandes ci-dessous.
2. Réseau et pare-feu
Le RTE ouvre lui-même chaque connexion. Rien ne l’atteint depuis l’extérieur :
| De | Vers | Port | Pourquoi |
|---|---|---|---|
| L’hôte du RTE | L’application, à APP_URL (via HTTPS_PROXY s’il est défini) | Le port de l’application, 443 derrière la plupart des proxies | Le socket par lequel passent les jobs, leurs fichiers et leur sortie |
| L’hôte du RTE | Les hôtes gérés du datacenter 2 | ssh (22), WinRM, leurs API | Les playbooks s’exécutent d’ici |
| L’hôte du RTE | ghcr.io | 443 | Pour tirer l’image, sauf si elle vient de votre propre registre ou d’un fichier (étape 4) |
N’ouvrez aucun port entrant pour le RTE. Son PORT (8000) ne sert que /live, /ready et /metrics, pour les sondes sur cet hôte.
Le RTE contacte APP_URL suivi de /api/v2/rte/socket, en WebSocket. Un reverse proxy devant l’application doit transmettre l’upgrade pour ce chemin (voir WebSockets des runners). Vérifiez d’ici que l’application répond :
curl -sS https://forms.example.com/api/v2/version
3. Dossiers
Tout se trouve sous /opt/af-rte. Le RTE tourne en tant qu’utilisateur node (uid 1000), ses données appartiennent donc à cet uid :
sudo mkdir -p /opt/af-rte/data/{ssh,certificates,ansible/roles,ansible/collections,git}
sudo touch /opt/af-rte/data/ansible/ansible.cfg /opt/af-rte/data/git/.gitconfig
| Dossier | Dans le conteneur | Contient |
|---|---|---|
data/ | /app/dist/persistent | Le spool (rte-spool : la sortie et la fin de chaque job jusqu’à ce que l’application les ait enregistrées), les fichiers de job qu’a envoyés l’application (rte-files), une CA privée, les bibliothèques python qu’installe un playbook |
data/ssh/ | /home/node/.ssh | La clé ssh et le known_hosts des playbooks |
data/ansible/ | /etc/ansible/... | Un ansible.cfg, des rôles et des collections à vous, montés au lieu d’être intégrés |
Gardez data/ sur l’hôte : un RTE redémarré envoie encore ce que l’application n’avait pas enregistré, et garde son cache de fichiers de job.
Clé ssh. Copiez la clé qu’utilisent les playbooks dans le datacenter 1, ou créez-en une pour ce datacenter et donnez sa partie publique aux hôtes gérés :
sudo ssh-keygen -t ed25519 -N "" -C "ansibleforms-rte-dc2" -f /opt/af-rte/data/ssh/id_ed25519
sudo cat /opt/af-rte/data/ssh/id_ed25519.pub # add it to ~/.ssh/authorized_keys of the managed user on each host
sudo sh -c 'ssh-keyscan host1.dc2.example.com host2.dc2.example.com >> /opt/af-rte/data/ssh/known_hosts'
Donnez ensuite tout à l’uid 1000, avec la clé lisible par son seul propriétaire :
sudo chown -R 1000:1000 /opt/af-rte/data
sudo chmod 700 /opt/af-rte/data/ssh && sudo chmod 600 /opt/af-rte/data/ssh/id_*
4. L’image
Choisissez l’une des deux.
Option A : l’image officielle
Les images publiées se trouvent sur le GitHub Container Registry, publiques, sans connexion nécessaire (voir Images pour les trois couches). Prenez la même couche que dans le datacenter 1. :7 suit la dernière version 7, comme le fait le :7 de l’application :
docker pull ghcr.io/ansibleforms/ansibleforms-rte-full:7
Un hôte sans accès à internet obtient l’image depuis un hôte qui en a un :
# on a host with internet
docker pull ghcr.io/ansibleforms/ansibleforms-rte-full:7
docker save ghcr.io/ansibleforms/ansibleforms-rte-full:7 | gzip > rte-full-7.tar.gz
# copy the file to the RTE host, then there
docker load < rte-full-7.tar.gz
Ou poussez-la une fois vers votre propre registre (docker tag et docker push), et utilisez ce nom dans les étapes suivantes.
Option B : votre propre image
Quand les playbooks du datacenter 2 ont besoin de collections ou de bibliothèques python absentes de l’image officielle (celles de VMware pour le vCenter de ce datacenter, par exemple), partez de ansibleforms-rte-core :
sudo mkdir -p /opt/af-rte/build
sudo tee /opt/af-rte/build/Dockerfile >/dev/null <<'EOF'
FROM ghcr.io/ansibleforms/ansibleforms-rte-core:7
# the collections and python libraries these playbooks use : no root needed, both belong to node
RUN ansible-galaxy collection install community.vmware -p /usr/share/ansible/collections \
&& pip install --no-cache-dir pyvmomi
EOF
docker build --pull -t af-rte-dc2 /opt/af-rte/build
Reconstruisez-la à chaque nouvelle version de l’application (voir Construire votre propre RTE). Avec plusieurs hôtes RTE, construisez une fois et poussez vers votre propre registre. Hors ligne, faites docker save et docker load de l’image construite comme dans l’option A.
5. Paramètres
Un nouveau RTE_TOKEN qui lui est propre, d’au moins 16 caractères. C’est le mot de passe de ce RTE : l’application le conserve dans l’identifiant RTE du runner, et scelle avec lui les secrets de chaque job.
openssl rand -base64 24
sudo tee /opt/af-rte/rte.env >/dev/null <<'EOF'
RTE_MODE=outbound
APP_URL=https://forms.example.com
RTE_NAME=rte-dc2
RTE_TOKEN=<the new token>
# optional, the first time only : approved at once instead of waiting for an admin
RTE_JOIN_TOKEN=<afj_..., or remove this line>
PORT=8000
PYTHONPATH=/app/dist/persistent/python/lib
EOF
sudo chmod 600 /opt/af-rte/rte.env
| Variable | Signification |
|---|---|
RTE_MODE | outbound : le RTE contacte l’application. Sans elle, le RTE démarre dans le mode base de données déprécié |
APP_URL | L’adresse de l’application, http:// ou https://, avec son chemin de base s’il y en a un |
RTE_NAME | Le nom de son runner. Non définie : son id de nœud, rte-<hostname>-<port>, qui change avec le conteneur |
RTE_TOKEN | Son propre jeton, d’au moins 16 caractères. Gardez-le : le runner se connecte avec lui à partir de maintenant |
RTE_JOIN_TOKEN | Facultative : un jeton d’adhésion, utilisé uniquement tant que son runner n’existe pas encore ou attend l’approbation |
Ajoutez celles-ci quand le réseau l’exige :
| Variable | Quand |
|---|---|
HTTPS_PROXY, NO_PROXY | Le RTE joint l’application via un proxy : HTTPS_PROXY=http://proxy.dc2.example.com:3128. Un hôte listé dans NO_PROXY (séparé par des virgules, .example.com pour un domaine) est contacté directement |
NODE_EXTRA_CA_CERTS | Le certificat de l’application provient d’une CA privée : placez le certificat de la CA dans /opt/af-rte/data/certificates/ca.pem et définissez NODE_EXTRA_CA_CERTS=/app/dist/persistent/certificates/ca.pem |
APP_TLS_VERIFY | 0 accepte n’importe quel certificat de l’application, y compris un certificat auto-signé. Uniquement à l’intérieur d’un réseau de confiance : préférez NODE_EXTRA_CA_CERTS |
RTE_FILES | transfer (par défaut) reçoit les playbooks et les inventaires avec chaque job. Laissez-la, sauf si vous les montez vous-même sur le RTE (local) |
Les autres paramètres que lit un RTE sont sur Exécuter un RTE. RTE_MAX_JOBS, RTE_CACHE_MB, RTE_FILES et RTE_DRAIN_SECONDS peuvent aussi être définies plus tard sur sa page de runner, qui l’emporte sur la variable (voir Les paramètres d’un RTE).
6. Le démarrer
Un fichier compose garde toute la définition au même endroit, à côté des paramètres. Mettez l’image de l’étape 4 dans image: :
sudo tee /opt/af-rte/compose.yml >/dev/null <<'EOF'
services:
rte:
image: ghcr.io/ansibleforms/ansibleforms-rte-full:7 # or af-rte-dc2, the image you built
container_name: af_rte_dc2
restart: unless-stopped
# the running playbooks get RTE_DRAIN_SECONDS (25) to finish when the container stops
stop_grace_period: 40s
env_file: rte.env
# the probes, on this host only : nothing connects to an outbound RTE
ports:
- "127.0.0.1:8000:8000"
healthcheck:
test: ["CMD", "node", "./healthcheck.js"]
interval: 10s
timeout: 5s
retries: 30
start_period: 30s
volumes:
- ./data:/app/dist/persistent
- ./data/ssh:/home/node/.ssh
- ./data/git/.gitconfig:/home/node/.gitconfig
- ./data/ansible/ansible.cfg:/etc/ansible/ansible.cfg
- ./data/ansible/roles:/etc/ansible/roles
- ./data/ansible/collections:/etc/ansible/collections
EOF
cd /opt/af-rte && docker compose up -d
Docker le redémarre après un reboot (unless-stopped). Podman n’a pas de démon pour cela : activez podman-restart.service (sudo systemctl enable --now podman-restart), ou exécutez le conteneur comme service systemd avec un fichier Quadlet. Sur un hôte avec SELinux en mode enforcing, ajoutez :Z à chaque volume (./data:/app/dist/persistent:Z).
Sans compose, le même conteneur en une seule commande :
docker run -d --name af_rte_dc2 --restart unless-stopped --stop-timeout 40 \
--env-file /opt/af-rte/rte.env -p 127.0.0.1:8000:8000 \
-v /opt/af-rte/data:/app/dist/persistent \
-v /opt/af-rte/data/ssh:/home/node/.ssh \
-v /opt/af-rte/data/git/.gitconfig:/home/node/.gitconfig \
-v /opt/af-rte/data/ansible/ansible.cfg:/etc/ansible/ansible.cfg \
-v /opt/af-rte/data/ansible/roles:/etc/ansible/roles \
-v /opt/af-rte/data/ansible/collections:/etc/ansible/collections \
ghcr.io/ansibleforms/ansibleforms-rte-full:7
7. Le vérifier sur l’hôte
docker ps --filter name=af_rte_dc2 # STATUS ends in (healthy): the process listens
docker logs -f af_rte_dc2 # Ctrl+C to stop following
curl -s http://127.0.0.1:8000/ready # {"status":"ready"} once the socket to the app is open
Le journal montre le RTE démarrer, contacter l’application et se connecter :
RTE 'rte-dc2' 7.3.0 (outbound, files transfer) listening on http port 8000, token fingerprint abcd-ef12
RTE 'rte-dc2': dialing the app at wss://forms.example.com/api/v2/rte/socket
RTE 'rte-dc2': connected to the app (node af-app1-8000)
Sans jeton d’adhésion, une ligne de plus indique qu’il attend : RTE 'rte-dc2': waiting for an admin to approve it under Connections > Runners (fingerprint abcd-ef12). Notez l’empreinte.
/ready répond 503 avec not connected to the app tant que le socket n’est pas ouvert. Le healthcheck indique seulement que le processus écoute.
8. L’approuver
Sans jeton d’adhésion, le RTE a demandé à rejoindre : Connexions > Runners affiche un avis orange au-dessus de la liste, 1 Runner attend l’approbation. Ouvrez-le, vérifiez que l’Empreinte est celle du journal du RTE et que Mode indique Sortant, puis Approuver (voir Approuver un RTE). Seul un admin approuve. Une demande que personne ne traite dans les 24 heures est supprimée, et le RTE redemande à son prochain contact avec l’application.
Avec un jeton d’adhésion, le runner est approuvé immédiatement et sa description nomme le jeton d’adhésion. Dans les deux cas, l’application conserve le jeton du RTE dans un nouvel identifiant RTE, rte-dc2-rte, et le RTE se connecte avec son propre RTE_TOKEN à partir de là : RTE_JOIN_TOKEN n’est plus utilisé, et vous pouvez le retirer de rte.env.
9. Le vérifier dans AnsibleForms
- Connexions > Runners liste le runner
rte-dc2, de type RTE. Activez Colonnes > Connexion pour voir Connecté dans la liste - Ouvrez-le. Son onglet RTE montre Mode Sortant et le badge Connexion Connecté ; au survol, il nomme le nœud d’application qui détient le socket, la version du RTE et combien de ses jobs tournent
- Cliquez sur Tester la connexion : il indique Runner connection is OK. Il n’appelle rien : il lit quel nœud d’application détient le socket du RTE (
runner_leases) et vérifie le contrat qu’a parlé le RTE à sa connexion - Donnez-lui une description, comme Datacenter 2
- Laissez Par défaut sur le runner du datacenter 1, sauf si chaque formulaire de playbook sans
runner:doit s’exécuter dans le datacenter 2
La page Statut liste le nouveau RTE avec sa version, à côté des autres.
10. Un premier job
Prouvez tout le chemin avec un playbook qui ne change rien. Dans les playbooks de l’application (son dossier ou son dépôt de playbooks, comme dans le datacenter 1), ajoutez ping-dc2.yaml :
- name: Reach the hosts of datacenter 2
hosts: all
gather_facts: false
tasks:
- name: Ping
ansible.builtin.ping:
Ajoutez ensuite dans le concepteur un formulaire qui nomme le nouveau runner :
name: Ping datacenter 2
type: ansible
playbook: ping-dc2.yaml
runner: rte-dc2
inventory: <an inventory with the hosts of datacenter 2>
roles:
- admin
categories:
- Default
fields: []
Lancez-le. L’application envoie le dossier des playbooks et l’inventaire avec le job, et le RTE les conserve par leur hash, si bien qu’un dossier inchangé n’est jamais envoyé deux fois. La sortie commence par Running on RTE rte-dc2 (outbound), montre pong pour chaque hôte, et le job se termine en succès. Un dossier plus gros que RTE_FILES_MAX_MB (512 par défaut) n’est pas envoyé : le job échoue et l’indique.
11. Lui envoyer les formulaires
Un formulaire s’exécute sur le RTE qu’il nomme, ajoutez donc la même ligne à chaque formulaire destiné au datacenter 2 :
runner: rte-dc2
Voir Runners pour le runner par défaut et les autres types de runners.
Quand quelque chose échoue
Le RTE écrit dans docker logs à partir de notice. Une connexion qui échoue avant l’ouverture du socket (un nom DNS, un port refusé, un certificat) n’apparaît que sous la forme RTE: dialing the app again in <n> seconds, au niveau info : définissez LOG_CONSOLE_LEVEL=debug dans rte.env et redémarrez-le pour voir RTE: socket to wss://...: <the error>.
| Ce que vous voyez | Où | Que faire |
|---|---|---|
RTE: set RTE_TOKEN (at least 16 characters) ; refusing to start | docker logs | RTE_TOKEN manque ou est trop court dans rte.env |
RTE: RTE_MODE=outbound needs APP_URL, the app's address (https://forms.example.com) ; refusing to start | docker logs | Définissez APP_URL dans rte.env |
RTE: APP_URL must be an http or https address, not ... ; refusing to start | docker logs | APP_URL doit commencer par https:// (ou http://) |
[DEPRECATED] This RTE runs in database mode (RTE_MODE is not set) | docker logs | RTE_MODE=outbound manque dans rte.env |
Aucune ligne connected to the app, /ready reste à 503 | docker logs, /ready | Le réseau de l’étape 2 : faites un curl de l’application depuis cet hôte, le proxy (HTTPS_PROXY, NO_PROXY), le certificat de l’application (NODE_EXTRA_CA_CERTS, étape 5). Définissez LOG_CONSOLE_LEVEL=debug pour voir l’erreur |
the app refused the socket (404) ou un autre statut que 401, 403 et 409 | docker logs | Un reverse proxy ne transmet pas le WebSocket sur /api/v2/rte/socket, ou il manque à APP_URL le chemin de base de l’application |
the app refused the socket (401): ... the token of RTE 'rte-dc2' is not the one stored for its runner: check its RTE_TOKEN | docker logs | Un runner rte-dc2 existe avec un autre jeton. Donnez ce jeton au RTE (le mot de passe de l’identifiant du runner), ou supprimez le runner pour qu’il demande à rejoindre |
the app refused the socket (401): ... the join token (RTE_JOIN_TOKEN) is unknown, revoked, expired or used up | docker logs | Créez un nouveau jeton d’adhésion, ou retirez RTE_JOIN_TOKEN et approuvez le RTE (étape 8) |
the app refused the socket (409): ... runner 'rte-dc2' exists and is approved: a join token cannot give it a new token ... | docker logs | Le RTE a été réinstallé avec un nouveau jeton : utilisez le jeton de l’identifiant de son runner, ou faites-le changer par un admin |
the app refused this RTE (401): dialing again in 10 minutes, or restart it once an admin acted | docker logs | Suit un refus. Corrigez-en la cause, puis faites docker restart af_rte_dc2 au lieu d’attendre |
waiting for an admin to approve it under Connections > Runners | docker logs | Approuvez-le (étape 8). Il est connecté, mais ne prend aucun job d’ici là |
the app speaks another contract (an upgrade in progress?): dialing again in 60 seconds | docker logs | L’application et le RTE exécutent des versions d’un autre contrat : mettez le RTE à la version de l’application (voir Le mettre à jour) |
| Non connecté, ou Tester la connexion indique the RTE ‘rte-dc2’ (outbound) is not connected: it has not dialed the app | L’application | Aucun nœud d’application ne détient son socket : le RTE est arrêté, ou ne peut pas joindre l’application. Lisez ses docker logs |
| Un job attend, puis échoue avec no app node holds a socket to RTE ‘rte-dc2’ and it took no job for 60 minutes (RTE_QUEUE_MINUTES): is it connected? | La sortie du job | Le RTE n’était pas connecté pendant l’attente du job |
Permission denied sur la clé ssh | La sortie du job | Les fichiers de data/ doivent appartenir à l’uid 1000 (étape 3) |
UNREACHABLE pour les hôtes gérés | La sortie du job | Le ssh depuis cet hôte : la clé, known_hosts, et le pare-feu vers les hôtes |
Côté application, un RTE refusé apparaît dans le journal de l’application sous la forme Refused an RTE socket from <address>: <why>.
Le mettre à jour
Quand l’application passe à une nouvelle version, suivez-la aussi sur cet hôte. Un RTE du même contrat continue de fonctionner entre-temps ; quand une version change le contrat, ses notes de version l’indiquent (voir Le contrat). Avec :7 dans compose.yml, ou dans le FROM de votre Dockerfile :
cd /opt/af-rte
docker compose pull # option A; for option B: docker build --pull -t af-rte-dc2 build
docker compose up -d
docker image prune -f # removes the image it no longer uses
Mettez-le à jour quand aucun playbook n’y tourne : un arrêt attend RTE_DRAIN_SECONDS (25) pour les playbooks en cours, et ceux qui tournent encore se terminent alors comme abandonnés. Ce qu’ils ont affiché avant l’arrêt est conservé dans le spool et envoyé une fois le RTE revenu. Hors ligne, faites docker load de la nouvelle image (étape 4) avant docker compose up -d.
Revenir en arrière
cd /opt/af-rte && docker compose down # or: docker rm -f af_rte_dc2
Le socket se ferme, et le runner affiche immédiatement Non connecté : plus aucun nœud d’application ne détient son socket (runner_leases). Un hôte qui disparaît sans le fermer affiche Non connecté en environ une minute, une fois que le nœud d’application n’entend plus rien sur le socket. Le runner reste : un runner qui a rejoint via un socket n’est jamais supprimé de lui-même. Supprimez-le dans Connexions > Runners, et son identifiant rte-dc2-rte dans Connexions > Identifiants. Retirez d’abord la ligne runner: des formulaires qui le nommaient : d’ici là, leurs jobs attendent le RTE, jusqu’à RTE_QUEUE_MINUTES, et échouent.
Plus de capacité dans le datacenter 2
Répétez les étapes 1 à 9 sur d’autres hôtes du datacenter 2, chacun avec son propre RTE_NAME et son propre RTE_TOKEN, comme rte-dc2-b : chacun rejoint comme runner à part entière et prend jusqu’à RTE_MAX_JOBS playbooks. Un formulaire en choisit un avec runner:. Deux RTE avec le même RTE_NAME ne se partagent pas le travail : le second reprend le socket au premier (voir Plusieurs RTE).
Un RTE en mode base de données
Avant la 7.3.0, ce runbook mettait en place un RTE en mode base de données : il détenait les identifiants de la base de données (DB_*, ENCRYPTION_SECRET), se connectait à la base de données du datacenter 1 sur le port 3306, et l’application l’appelait sur son port 8000. Ce mode est déprécié depuis la 7.3.0 et sera supprimé dans la 8.0.0. Pour passer un tel RTE en sortant sans nouveau runner, définissez sur lui RTE_MODE=outbound, APP_URL et RTE_NAME (le nom de son runner), gardez son RTE_TOKEN, et retirez DB_*, ENCRYPTION_SECRET et RTE_REGISTER : voir Base de données (obsolète). Fermez ensuite le port 8000 et le port de la base de données dont il n’a plus besoin.