Ansible dans un conteneur LXC sans ssh sur un serveur distant
Notes
- C'est un raté, rien ne fonctionne réellement ProxyJump ne lance aucunes commandes
Questionnement
Je ne souhaite pas installer openssh-server sur tous mes conteneurs LXC, mais j'aimerais pouvoir exécuter mes playbook ansible à l'intérieur. Comment m'y connecter sachant que:
- L'hôte contenant les conteneurs LXC est accessible via SSH.
- Le connecteur LXC d'Ansible pourrait fonctionner mais ne fonctionne pas à travers SSH.
- Il existe un connecteur LXC-SSH, mais sa fiabilité n'est pas confirmée, il n'a pas non plus subit de mise à jours depuis plusieurs mois.
- le module lxc_container d'ansible permet de passer des commandes dans un conteneur mais pas de jouer un playbook.
Solution
La solution se trouve via la configuration du fichier ~/.ssh/config de l'utilisateur des scripts ansible.
Et demande deux bloc de configuration par conteneur:
Host _hote_service_XXX
Hostname X.X.X.X
User ansible
IdentityFile ~/.ssh/ansible_ed25519
RequestTTY yes
RemoteCommand sudo su - root -c 'lxc-attach service_XXX'
Ce premier bloc permet plusieurs choses:
- Il se connecte au serveur distant à l'adresse
Hostname
avec l'utilisateurUser
et sa clé sshIdentityFile
- Il demande l'ouverture d'une session TTY via
RequestTTY
pour avoir un terminal dédié à l'arrivé - Il execute la commande contenu dans
RemoteCommand
à la connexion- Celle-ci permet en première étape de devenir root, puis directement de se connecter au conteneur
service_XXX
- Celle-ci permet en première étape de devenir root, puis directement de se connecter au conteneur
Utiliser manuellement la commande ssh _hote_service_XXX
permet de se connecter de façon directe à l'intérieur du conteneur service_XXX
.
Bien que ça semble suffisant pour connecter Ansible en lui donnant _hote_service_XXX
dans son inventory, cette configuration est bloquante car elle empèche Ansible d'executer ses commande avec ssh indiquant qu'il est impossible de mélanger l'appel à RemoteCommand
et le passage de commandes en même temps.
Il est possible de tester ça en faisant:
$ ssh _hote_service_XXX -t 'echo test'
Qui répondra avec Cannot execute command-line and remote command.
La solution est d'utiliser la commande ProxyJump
disponible dans la configuration de ssh pour lui dire d'utiliser _hote_service_XXX
, ça permettra de retirer le blocage lié à l'execution de commandes distantes:
Host CT-service_XXX
Hostname X.X.X.X
User ansible
IdentityFile ~/.ssh/ansible_ed25519
ProxyJump _hote_service_XXX
La configuration de CT-service_XXX
est au final bien plus classique et ressemble à une configuration de connexion normale, la seule différence est l'ajout de ProxyJump
qui demande à ssh de passer par _hote_service_XXX
pour initier sa connexion.
Le fait de rajouter cette configuration permet un fonctionnement normal d'Ansible tout comme du passage de commandes via ssh.
$ ssh _hote_service_XXX -t 'echo test'
test