Labels gebruiken in Ansible loops

Gebruik loop_control.label om de Ansible loop output kort en leesbaar te houden wanneer een loop over dictionaries of andere grote waarden itereert.

Probleem

Wanneer een Ansible taak over dictionaries of andere gestructureerde waarden loopt, drukt de standaard output vaak het volledige loop item af.

Dit maakt de taakoutput moeilijker scanbaar en te beoordelen. Het voegt ook ruis toe aan logs, vooral wanneer het loop item geneste data bevat zoals bindings, opties of statusdetails.

Voor operators kan dit soort output het vertrouwen in de taakrun verminderen, omdat technische en rommelige logging kan lijken op een teken dat er iets misgaat. Het kan ook de waargenomen implementatiekwaliteit verlagen door een correcte taak rommelig, ongestructureerd of onvoldoende doordacht te laten lijken.

Bijvoorbeeld, output zoals dit is technisch correct maar onnodig uitgebreid:

TASK [c2platform.mw.iis : Create website] *****************************************
ok: [c2d-iis1] => (item={'name': 'HelloWorld', 'physical_path':
'D:/inetpub/wwwroot/HelloWorld', 'application_pool': 'HelloWorld',
'bindings': {'add': [{'ip': '192.168.3.100', 'hostname': 'helloworld.c2platform.org',
'port': 80, 'protocol': 'http'}]}, 'state': 'started'})

In de meeste gevallen heeft de operator alleen een korte identificatie nodig, zoals de websitenaam en de beoogde status.

Context

Ansible ondersteunt loop_control.label om te beperken wat voor elk loop item in de taakoutput wordt getoond.

Dit is vooral nuttig wanneer de loop over dictionaries itereert en de taak slechts een paar velden benadert, bijvoorbeeld item['name'] en item['state']. In die gevallen voegt het herhalen van de volledige dictionary in de log weinig waarde toe.

loop_control.label verbetert de leesbaarheid, maar moet eenvoudig blijven. Een label is het meest nuttig wanneer het de velden benadrukt die een operator helpen om snel te herkennen wat de taak verwerkt.

Deze richtlijn vormt een aanvulling op Item en loop_var gebruiken in Ansible loops . Als een taak een aangepaste loop_control.loop_var gebruikt, gebruik diezelfde variabele consistent binnen label.

Oplossing

  1. Gebruik loop_control.label wanneer de standaard loop output grote of afleidende waarden zou afdrukken.
  2. Kies bij voorkeur een korte, stabiele identificatie zoals een naam, sleutel, pad of naam plus status.
  3. Herhaal niet de hele dictionary binnen het label.
  4. Houd het label gericht op wat operators helpt om de taakoutput snel te lezen.
  5. Wanneer de taak een aangepaste loop_control.loop_var gebruikt, gebruik die variabelenaam ook in het label.
  6. Voeg bij eenvoudige loops over korte scalaire waarden geen label toe, tenzij het de output verbetert.

Voordelen

  • Maakt taakoutput gemakkelijker scanbaar.
  • Vermindert logruis bij loops over dictionaries en geneste data.
  • Helpt operators het huidige loop item snel te identificeren.
  • Houdt de loop output gericht op de velden die het belangrijkst zijn.

Voorbeelden en implementatie

Gebruik label om output voor dictionaries te verkorten

- name: Create website
  microsoft.iis.website:
    name: "{{ item['name'] }}"
    site_id: "{{ item['site_id'] | default(omit) }}"
    state: "{{ item['state'] | default(iis_websites_state) }}"
    physical_path: "{{ item['physical_path'] }}"
    application_pool: "{{ item['application_pool'] }}"
    bindings: "{{ item['website_bindings'] | default(omit) }}"
  loop: "{{ iis_websites }}"
  loop_control:
    label: >-
      {{ item['name'] }} →
      {{ item['state'] | default(iis_websites_state) }}

Dit houdt de taakoutput gericht op de websitenaam en de effectieve status.

In plaats van de volledige dictionary te loggen, kan Ansible nu een korter resultaat tonen zoals:

TASK [c2platform.mw.iis : Create website] *****************************************
ok: [c2d-iis1] => (item=HelloWorld → started)

Houd labels kort en betekenisvol

Een label moet het loop item identificeren, niet elk veld herhalen.

- name: Configure Apache vhost
  ansible.builtin.debug:
    msg: "Configuring {{ item['servername'] }}"
  loop: "{{ apache_vhosts }}"
  loop_control:
    label: "{{ item['servername'] }}"

Hier is de hostnaam voldoende om het huidige item te herkennen.

Vermijd labels die te uitgebreid blijven

Het volgende patroon wordt niet aanbevolen omdat het nog steeds te veel data logt:

- name: Create website
  microsoft.iis.website:
    name: "{{ item['name'] }}"
    state: "{{ item['state'] | default(iis_websites_state) }}"
  loop: "{{ iis_websites }}"
  loop_control:
    label: "{{ item }}"

Dit ondermijnt het doel van label, omdat het nog steeds het hele loop item weergeeft in plaats van een korte identificatie.

Aanvullende informatie