web-dev-qa-db-fra.com

Espaces supplémentaires apparaissant dans les modèles Ansible

Je génère des fichiers de configuration et je veux qu'ils soient mis en retrait juste ainsi. J'ai commencé avec un modèle Jinja2 qui s'affichait correctement lorsqu'il était appelé à partir d'un simple programme python. Lorsque je l'appellerai depuis ansible, j'obtiendrai 2 espaces supplémentaires sur tout sauf la première ligne de la boucle. des choses comme YAML et python a été une vraie douleur. J'ai pris la décision de mettre une ligne de commentaire comme première ligne d'un bloc for pour résoudre ce problème ...

Voici un exemple vraiment simple d'un générateur YAML:

appel playbook:

  - name: generate bgp vars file, put in includes directory
    local_action: template src={{ role_dir }}/templates/bgp_vars.j2 dest={{ incvar_dir }}/bgp_vars.yaml
    run_once: true

section du modèle:

dc_route_reflectors:
{% for dc in SH_dcs %}
# dc is "{{ dc }}"
  {{ dc }}:
  {% for Host in groups[bgpgroupname] if dc == hostvars[Host].MYDC %}
    - "{{ hostvars[Host].MAIN_MYADDR }}"
  {% endfor %}
{% endfor %}

sortie rendue:

dc_route_reflectors:

# dc is "pnp"
  pnp:
      - "10.100.16.3"
      - "10.100.32.3"
  # dc is "sgs"
  sgs:
      - "10.8.0.3"
      - "10.8.16.3"
  # dc is "cst"
  cst:
      - "10.4.0.3"
      - "10.4.16.3"
  # dc is "dse"
  dse:
      - "10.200.0.3"
      - "10.200.16.3"

Remarquez comment le dc est un commentaire "pnp" non mis en retrait comme il est montré dans le modèle, mais les commentaires sgs, cst et dse sont mis en retrait de 2 espaces. Toutes les lignes du tableau des adresses IP sont également en retrait. J'ai essayé différentes versions de l'ajout de "-" aux choses "%" comme décrit Jinja2, mais aucune n'a donné de résultats corrects et cohérents.

D'autres ont dû le voir auparavant. J'utilise 2.2.1.0 sur CentOS7.

17
JerryS

Pour commencer, vous pouvez simplement supprimer les espaces que vous avez explicitement ajoutés devant vos instructions et conserver l'indentation uniquement pour les données:

dc_route_reflectors:
{% for dc in SH_dcs %}
# dc is "{{ dc }}"
  {{ dc }}:
{% for Host in groups[bgpgroupname] if dc == hostvars[Host].MYDC %}
    - "{{ hostvars[Host].MAIN_MYADDR }}"
{% endfor %}
{% endfor %}

Si vous souhaitez conserver l'indentation des instructions, vous pouvez définir lstrip_blocks option pour True (remarque: la déclaration doit être dans la première ligne du modèle):

#jinja2:lstrip_blocks: True
dc_route_reflectors:
{% for dc in SH_dcs %}
# dc is "{{ dc }}"
  {{ dc }}:
  {% for Host in groups[bgpgroupname] if dc == hostvars[Host].MYDC %}
    - "{{ hostvars[Host].MAIN_MYADDR }}"
  {% endfor %}
{% endfor %}

En savoir plus sur contrôle des espaces blancs dans Jinja2.


Ansible exécute Jinja2 avec trim_blocks activé et lstrip_blocks désactivé.

Tous les espaces que vous avez saisis dans le modèle (en dehors des instructions et des expressions) sont donc considérés comme faisant partie de la sortie. Aucun "espace supplémentaire" n'est ajouté.

Remarquez comment le dc est "pnp", le commentaire n'est pas indenté comme indiqué dans le modèle, mais les commentaires sgs, cst et dse sont indentés de 2 espaces.

Ces deux espaces sont inclus dans votre modèle sur la 7ème ligne (avant {% endfor %}).

Toutes les lignes du tableau des adresses IP sont également en retrait.

Ces espaces sont définis dans votre modèle sur la 5ème ligne (devant le {% for Host).

26
techraf