tech:ansible_inventory_script_-_inventaire_dynamique_2
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédente | |||
| tech:ansible_inventory_script_-_inventaire_dynamique_2 [2025/11/09 19:07] – Jean-Baptiste | tech:ansible_inventory_script_-_inventaire_dynamique_2 [2026/06/07 19:12] (Version actuelle) – modification externe 127.0.0.1 | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | < | ||
| + | {{tag> | ||
| + | |||
| + | # Ansible inventory script - inventaire dynamique 2 - CSV | ||
| + | |||
| + | Cahier des charges : | ||
| + | * Inventaire basé sur un fichier CSV | ||
| + | |||
| + | Voir aussi : | ||
| + | * https:// | ||
| + | * Les options : `Host Filter`, `Enabled Variable`, `Enabled Value` | ||
| + | |||
| + | Exemple de fichier CSV | ||
| + | |||
| + | `inv.csv` | ||
| + | ~~~csv | ||
| + | hostname; | ||
| + | srvweb1; | ||
| + | srvweb2; | ||
| + | ~~~ | ||
| + | |||
| + | Script Python d' | ||
| + | |||
| + | `inventory_from_csv.py` | ||
| + | ~~~python | ||
| + | # | ||
| + | |||
| + | """ | ||
| + | CSV external inventory script. | ||
| + | |||
| + | # Creative Commons CC0 Public Domain Licence | ||
| + | """ | ||
| + | |||
| + | import sys | ||
| + | import csv | ||
| + | import argparse | ||
| + | import json | ||
| + | from ansible.module_utils._text import to_text | ||
| + | |||
| + | _GROUP = ' | ||
| + | mapping = {} | ||
| + | |||
| + | def parser_args(): | ||
| + | parser = argparse.ArgumentParser(description="" | ||
| + | parser.add_argument(' | ||
| + | help=" | ||
| + | parser.add_argument(' | ||
| + | help=" | ||
| + | return parser | ||
| + | |||
| + | |||
| + | def mk_inventory_from_csv(): | ||
| + | """ | ||
| + | Make inventory from CSV file | ||
| + | """ | ||
| + | mapping[' | ||
| + | mapping[' | ||
| + | mapping[_GROUP]={} | ||
| + | mapping[_GROUP][' | ||
| + | |||
| + | with open(' | ||
| + | csvreader = csv.DictReader(csvfile, | ||
| + | for row in csvreader: | ||
| + | hostname = to_text(row[' | ||
| + | mapping[' | ||
| + | mapping[' | ||
| + | mapping[' | ||
| + | mapping[_GROUP][' | ||
| + | |||
| + | |||
| + | def get_host_details(host): | ||
| + | """ | ||
| + | Get json hostvars for specified host | ||
| + | """ | ||
| + | host = mapping[' | ||
| + | return json.dumps(host, | ||
| + | |||
| + | |||
| + | args = parser_args().parse_args() | ||
| + | def main(): | ||
| + | if args.list: | ||
| + | mk_inventory_from_csv() | ||
| + | print(json.dumps(mapping, | ||
| + | sys.exit(0) | ||
| + | elif args.host: | ||
| + | mk_inventory_from_csv() | ||
| + | print(get_host_details(args.host)) | ||
| + | sys.exit(0) | ||
| + | else: | ||
| + | parser_args.print_help() | ||
| + | sys.exit(0) | ||
| + | |||
| + | |||
| + | if __name__ == ' | ||
| + | main() | ||
| + | |||
| + | ~~~ | ||
| + | |||
| + | On test | ||
| + | ~~~bash | ||
| + | chmod +x inventory_from_csv.py | ||
| + | ./ | ||
| + | ./ | ||
| + | ansible-inventory -i inventory_from_csv.py --list | ||
| + | ansible-inventory -i inventory_from_csv.py --host srvweb1 | ||
| + | ~~~ | ||
| + | |||
| + | |||
| + | ## Annexes | ||
| + | |||
| + | ### Script Python sql2csv | ||
| + | |||
| + | `sql2csv.py` | ||
| + | ~~~python | ||
| + | #! / | ||
| + | |||
| + | """ | ||
| + | Make CSV inventory file from SQL query (CMDB) | ||
| + | """ | ||
| + | |||
| + | import os | ||
| + | import pyodbc | ||
| + | |||
| + | cfg_csv_path = os.environ[" | ||
| + | cfg_queryname = os.environ[" | ||
| + | db_user = os.environ[" | ||
| + | db_pass = os.environ[" | ||
| + | db_name = os.environ[" | ||
| + | db_host = os.environ[" | ||
| + | db_port = os.environ[" | ||
| + | |||
| + | |||
| + | def clean_field(field): | ||
| + | """ | ||
| + | Clean each fields. | ||
| + | CSV use ';' | ||
| + | CSV use line break as line separator and so all ' | ||
| + | """ | ||
| + | if field is None or field == " | ||
| + | ret = "" | ||
| + | else: | ||
| + | ret = str(field).strip().replace(";", | ||
| + | return ret | ||
| + | |||
| + | |||
| + | with open(f" | ||
| + | query = f.read().strip() | ||
| + | |||
| + | |||
| + | def main(): | ||
| + | db = pyodbc.connect( | ||
| + | DRIVER=" | ||
| + | Server=db_host, | ||
| + | Port=db_port, | ||
| + | Database=db_name, | ||
| + | UID=db_user, | ||
| + | PWD=db_pass, | ||
| + | ) | ||
| + | cursor = db.cursor() | ||
| + | result = cursor.execute(query) | ||
| + | |||
| + | with open(cfg_csv_path, | ||
| + | headers = [] | ||
| + | for row in result.description: | ||
| + | headers.append(row[0]) | ||
| + | print(";" | ||
| + | for row in result: | ||
| + | print(";" | ||
| + | |||
| + | |||
| + | main() | ||
| + | ~~~ | ||
| + | |||
| + | |||
| + | |||
| + | |||
