Alalalala, ces fichier de conf où il faut définir les options dans le bon ordre… Genre Knot.
Je me dis chouette, c'est du "presque-yaml" j'ai juste à définir mes dictionnaires dans Ansible, puis {{ templates | to_nice_yaml }}
et tout va bien !
Et bien non.
Genre :
template:
- id: default
file: %s.zone
storage: /var/lib/knot
==> Le serveur arrive à démarrer.
Contrairement à :
template:
- file: %s.zone
id: default
storage: /var/lib/knot
==> Critical: failed to load configuration file [...] (missing identifier)
Et les dictionnaires python n'étant pas ordonnés, to_nice_yaml
fait un output avec les clefs par ordre alphabétique pour garantir une certaine idempotence.
Cette fois ce n'est pas le code d'Ansible mais celui de PyYAML qu'il fallait aller lire.
J'ai pas trouvé l'info dans https://pyyaml.org/wiki/PyYAMLDocumentation mais par contre dans https://github.com/yaml/pyyaml/blob/ee37f4653c08fc07aecff69cfd92848e6b1a540e/lib/yaml/dumper.py y'a un `sort_keys=True` dont on peut changer la valeur.
Et effectivement dans Ansible / Jinja2 on peut faire `| to_nice_yaml(indent=2, sort_keys=False)` et ça essaie de préserver le même ordre. J'ai crus comprendre que depuis python 3.6 les dictionnaires sont plus ou moins tout le temps ordonné et donc y'a pas trop de risque coté idempotence.