Publié le: 2021-12-18

Utiliser Ansible à distance sur des jails FreeBSD

Introduction

Ansible dispose d’un connecteur de jails natif. Malheureusement celui-ci ne permet pas de se connecter à des jails distances, uniquement localement.

Solution

En cherchant un peu sur le net, Austin Hyde a produit un plugin Ansible pour se connecter à des jails over SSH.

Seul bémol, le plugin est assez ancien, il ne fonctionnera pas sur des versions récentes d’Ansible et nativement il y a un bug dedans avec la fonction become. J’ai proposé une Pull Request à l’auteur qui corrige ce souci, en ajoutant les paramètres manquants ajoutés en Ansible 2.12 et corrigeant un appel become forcé par erreur.

Ce plugin est réellement bien conçu en terme de design. Il implémente juste la partie connexion à la jail encapsulée sur le module python natif de connexion SSH Ansible, il ne réinvente donc pas la roue, et c’est top !

Implémentation

Pour implémenter ce module de connexion Ansible rien de très sorcier. Tout d’abord on créé un répertoire pour nos plugins de connexion à la racine de notre repo Ansible, si on n’en a pas:

~/ansible> mkdir -p plugins/connection

Ensuite on édite le fichier de configuration ansible.cfg de notre repository (ou ailleurs, tout dépend de votre setup), afin de lire les plugins de connexion:

connection_plugins = ./plugins/connection

Enfin on peut désormais se connecter à notre jail FreeBSD en la déclarant de la manière suivante dans notre inventaire:

[jails]
jail01@jailhost.example.org ansible_connection=sshjail ansible_ssh_user=root
jail02@jailhost.example.org ansible_connection=sshjail ansible_ssh_user=nonpriv ansible_become=yes

Ci-dessus vous avez les 2 méthodes pour vous connecter au host jailhost, via l’utilisateur root ou non.

Résultat

Jouons maintenant le playbook suivant:

---
- hosts: jails
  tasks:
    - debug: var=ansible_hostname

Voici le résultat:

ansible-playbook -i test_inventory playbooks/testjail.yml -D  -v
Using ~/ansible/ansible.cfg as config file

PLAY [jails] ********************************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************************************************************************************************************************************
[WARNING]: Platform freebsd on host jail01@jailhost.example.org is using the discovered Python interpreter at /usr/local/bin/python3.8, but future installation of another Python interpreter could change the meaning of that path. See
https://docs.ansible.com/ansible-core/2.12/reference_appendices/interpreter_discovery.html for more information.
ok: [nsd01@jailhost.example.org]

TASK [debug] **************************************************************************************************************************************************************************************************************************************************
ok: [jail01@jailhost.example.org] => {
    "ansible_hostname": "jail01"
}

PLAY RECAP ****************************************************************************************************************************************************************************************************************************************************
jail01@jailhost.example.org         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Nous pouvons désormais gérer nos jails FreeBSD à distance. Bien entendu vous devez installer le package python sur les jails sinon Ansible ne fonctionnera pas.