Skip to main content

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'utilisateur User et sa clé ssh IdentityFile
  • 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

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