Wie kann ich den „Item“-Wert in der Ansible-Konsolenausgabe kürzen?

Wie kann ich den „Item“-Wert in der Ansible-Konsolenausgabe kürzen?

Ich habe Schwierigkeiten mit dem Titel dieser Frage. Sie können ihn also gerne bearbeiten, um ihn aussagekräftiger zu gestalten.

Angenommen, Sie haben eine Aufgabe in Ansible und möchten registerdie Ausgabe. Beispiel:

- name: Set up working directory
  shell: mktemp -d
  register: workdir

Und ich möchte die registrierte Ausgabe für eine andere Aufgabe verwenden. Beispiel:

- name: Create a file
  with_items: "{{ workdir.stdout }}"
  shell: touch {{ item }}/test-file

Das funktioniert alles super. Jetzt möchte ich beide Aufgaben N-mal schleifen. (Ich weiß, dass ich das in eine separate YAML-Datei extrahieren und include_taskskombiniert mit verwenden könnte loop, aber ich möchte nicht zwei Playbooks haben.) Daher aktualisiere ich auf:

- name: Set up working directory
  shell: mktemp -d
  register: workdir
  loop:
  - 1
  - 2

Als Ergebnis der Schleife workdirhat die Variable eine andere Struktur angenommen, sodass das Durchlaufen dieser Variable nun etwas anders ist. Beispiel:

- name: Create a file
  with_items: "{{ workdir.results }}"
  shell: touch {{ item.stdout }}/test-file

Wenn das Playbook ausgeführt wird, zeigt die Ansible-Konsole bei jeder Iteration den gesamten Wert für „item“ an. Dadurch ist die Ausgabe verrauscht und für einen Menschen visuell schwer zu analysieren. Beispiel:

TASK [Create a file] ***************************************************
changed: [localhost] => (item={'cmd': 'mktemp -d', 'stdout': '/tmp/tmp.a
ncF0iBqzP', 'stderr': '', 'rc': 0, 'start': '2023-05-26 15:22:46.458962'
, 'end': '2023-05-26 15:22:46.465557', 'delta': '0:00:00.006595', 'chang
ed': True, 'invocation': {'module_args': {'_raw_params': 'mktemp -d', '_
uses_shell': True, 'warn': True, 'stdin_add_newline': True, 'strip_empty
_ends': True, 'argv': None, 'chdir': None, 'executable': None, 'creates'
: None, 'removes': None, 'stdin': None}}, 'stdout_lines': ['/tmp/tmp.anc
F0iBqzP'], 'stderr_lines': [], 'failed': False, 'item': 1, 'ansible_loop
_var': 'item'})
changed: [localhost] => (item={'cmd': 'mktemp -d', 'stdout': '/tmp/tmp.v
Tpkvx6RK0', 'stderr': '', 'rc': 0, 'start': '2023-05-26 15:22:46.727879'
, 'end': '2023-05-26 15:22:46.734876', 'delta': '0:00:00.006997', 'chang
ed': True, 'invocation': {'module_args': {'_raw_params': 'mktemp -d', '_
uses_shell': True, 'warn': True, 'stdin_add_newline': True, 'strip_empty
_ends': True, 'argv': None, 'chdir': None, 'executable': None, 'creates'
: None, 'removes': None, 'stdin': None}}, 'stdout_lines': ['/tmp/tmp.vTp
kvx6RK0'], 'stderr_lines': [], 'failed': False, 'item': 2, 'ansible_loop
_var': 'item'})

Hier ist meine Frage:

Gibt es eine Möglichkeit,

  • die Ausgabe von „item“ in der Ansible-Konsolenausgabe abkürzen?
  • ändern Sie die Schleife, sodass sie anders iteriert, etwa:
with_items: "{{ workdir.results.*.stdout }}"
shell: touch {{ item }}/test-file
  • Gibt es einen Filter, mit dem die Elemente geändert werden können?
  • eine andere clevere Lösung?

Antwort1

Es gibt weitere Optionen:

shell> cat pb.yml
- hosts: localhost

  tasks:

    - command: mktemp -d
      register: workdir
      with_sequence: end=2

    - command: "touch {{ item.stdout }}/test-file" 
      loop: "{{ workdir.results }}"
      loop_control:
        label: "{{ item.stdout }}"

gibt

shell> ansible_playbook pb.yml

PLAY [localhost] *****************************************************************************

TASK [command] *******************************************************************************
changed: [localhost] => (item=1)
changed: [localhost] => (item=2)

TASK [command] *******************************************************************************
changed: [localhost] => (item=/tmp/tmp.2pOVwfrYLI)
changed: [localhost] => (item=/tmp/tmp.FyF0JCghAo)

PLAY RECAP ***********************************************************************************
localhost: ok=2    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

  • Optional können Sie zunächst eine Liste der Verzeichnisse erstellen
shell> cat pb.yml
- hosts: localhost

  vars:

    workdirs: "{{ workdir.results|map(attribute='stdout') }}"

  tasks:

    - command: mktemp -d
      register: workdir
      with_sequence: end=2

    - command: "touch {{ item }}/test-file" 
      loop: "{{ workdirs }}"

gibt das gleiche

shell> ansible-playbook pb.yml

PLAY [localhost] *****************************************************************************

TASK [command] *******************************************************************************
changed: [localhost] => (item=1)
changed: [localhost] => (item=2)

TASK [command] *******************************************************************************
changed: [localhost] => (item=/tmp/tmp.OOHLqAfFlX)
changed: [localhost] => (item=/tmp/tmp.T5lF2ZruwZ)

PLAY RECAP ***********************************************************************************
localhost: ok=2    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Anmerkungen:

- hosts: localhost

  vars:

    workdirs: "{{ workdir.results|map(attribute='path') }}"

  tasks:

    - tempfile:
        state: directory
      register: workdir
      with_sequence: end=2

    - file:
        state: touch
        path: "{{ item }}/test-file" 
      loop: "{{ workdirs }}"

    - file:
        state: absent
        path: "{{ item }}"
      loop: "{{ workdirs }}"

verwandte Informationen