tech:ansible_inventory_script_-_inventaire_dynamique
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| tech:ansible_inventory_script_-_inventaire_dynamique [2025/10/07 23:24] – Jean-Baptiste | tech:ansible_inventory_script_-_inventaire_dynamique [2026/06/16 15:21] (Version actuelle) – Jean-Baptiste | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | < | ||
| + | {{tag> | ||
| + | |||
| + | # Ansible inventory script - inventaire dynamique 1 | ||
| + | |||
| + | Voir : | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | |||
| + | Voir aussi : | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | |||
| + | In Ansible 2.10 and later, inventory scripts moved to their associated collections. Many are now in the [ansible-community/ | ||
| + | |||
| + | Source : https:// | ||
| + | |||
| + | |||
| + | Nous allons coder un inventory script en bash en mode "hello world" | ||
| + | |||
| + | Voici le script bash avec des données codés en dures dedans, c'est moche mais c'est juste pour un PoC. | ||
| + | |||
| + | `inv.sh` | ||
| + | ~~~bash | ||
| + | #! /bin/bash | ||
| + | |||
| + | set -euo pipefail | ||
| + | IFS=$' \t\n' | ||
| + | export LANG=C | ||
| + | SCRIPT_NAME=" | ||
| + | |||
| + | trap 'rm -f " | ||
| + | |||
| + | TMP_INV_INI=" | ||
| + | |||
| + | mk_ini_tmp_inv() { | ||
| + | cat << | ||
| + | [all:vars] | ||
| + | os = linux | ||
| + | |||
| + | [web] | ||
| + | srv-web1 web=1 | ||
| + | srv-web2 web=2 | ||
| + | |||
| + | [db] | ||
| + | srv-db1 db=1 | ||
| + | srv-db2 db=2 | ||
| + | |||
| + | [plop] | ||
| + | test-ansible | ||
| + | EOF | ||
| + | } | ||
| + | |||
| + | arg_list() { | ||
| + | mk_ini_tmp_inv | ||
| + | ansible-inventory -i " | ||
| + | } | ||
| + | |||
| + | arg_host() { | ||
| + | mk_ini_tmp_inv | ||
| + | ansible-inventory -i " | ||
| + | } | ||
| + | |||
| + | usage() { | ||
| + | ansible-doc -t inventory script | ||
| + | } | ||
| + | |||
| + | while [ " | ||
| + | case $1 in | ||
| + | --list ) shift | ||
| + | arg_list | ||
| + | ;; | ||
| + | --host ) shift | ||
| + | arg_host " | ||
| + | ;; | ||
| + | -h | --help ) usage | ||
| + | exit 0 | ||
| + | ;; | ||
| + | --) # End of all options | ||
| + | shift | ||
| + | break | ||
| + | ;; | ||
| + | -*) echo " | ||
| + | echo "Try ' | ||
| + | exit 1 | ||
| + | ;; | ||
| + | *) | ||
| + | usage | ||
| + | ;; | ||
| + | esac | ||
| + | shift | ||
| + | done | ||
| + | ~~~ | ||
| + | |||
| + | Rendons le script exécutable | ||
| + | ~~~bash | ||
| + | chmod +x inv.sh | ||
| + | ~~~ | ||
| + | |||
| + | Nous testons la sortie de notre script bash | ||
| + | ~~~bash | ||
| + | ./inv.sh --list | ||
| + | ~~~ | ||
| + | |||
| + | ~~~javascript | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | } | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ] | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ] | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ] | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ] | ||
| + | } | ||
| + | } | ||
| + | ~~~ | ||
| + | |||
| + | Nous testons de nouveau la sortie de notre script mais pour un host spécifique cette fois | ||
| + | ~~~bash | ||
| + | ./inv.sh --host srv-web1 | ||
| + | ~~~ | ||
| + | |||
| + | ~~~javascript | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | ~~~ | ||
| + | |||
| + | A présent testons avec Ansible : | ||
| + | ~~~ | ||
| + | $ ansible -i inv.sh -m ping plop | ||
| + | [WARNING]: | ||
| + | [WARNING]: | ||
| + | [WARNING]: Unable to parse / | ||
| + | [WARNING]: No inventory was parsed, only implicit localhost is available | ||
| + | [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match ' | ||
| + | [WARNING]: Could not match supplied host pattern, ignoring: plop | ||
| + | ~~~ | ||
| + | |||
| + | Ça ne marche pas. Ansible s' | ||
| + | |||
| + | |||
| + | Les inventory script doivent être en Python. J'ai essayé de renommer ce script inv.sh en inv.py mais ça ne marche pas. | ||
| + | |||
| + | Nous allons coder un wrapper Python qui lance notre script bash. | ||
| + | |||
| + | `inv.py` | ||
| + | ~~~python | ||
| + | #! / | ||
| + | |||
| + | import os | ||
| + | import argparse | ||
| + | |||
| + | parser = argparse.ArgumentParser() | ||
| + | parser.add_argument(' | ||
| + | parser.add_argument(' | ||
| + | |||
| + | args = parser.parse_args() | ||
| + | |||
| + | if args.list: | ||
| + | os.system(' | ||
| + | elif args.host: | ||
| + | os.system(f' | ||
| + | ~~~ | ||
| + | |||
| + | Rendons ce script Python exécutable | ||
| + | ~~~bash | ||
| + | chmod +x inv.py | ||
| + | ~~~ | ||
| + | |||
| + | |||
| + | Et ça marche : | ||
| + | ~~~ | ||
| + | $ ansible -i inv.py -m ping plop | ||
| + | test-ansible | SUCCESS => { | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | ~~~ | ||
| + | |||
| + | |||
| + | ## Autres | ||
| + | |||
| + | Voir | ||
| + | |||
| + | Enabled Variable | ||
| + | |||
| + | ~~~ | ||
| + | Retrieve the enabled state from the given dict of host variables. The enabled variable may be specified using dot notation, e.g: ' | ||
| + | ~~~ | ||
| + | |||
