
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 register
die 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_tasks
kombiniert 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 workdir
hat 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:
- VerwendenSchleifensteuerung. SehenBegrenzung der Schleifenausgabe mit Label. Zum Beispiel,
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:
Verwenden des Modulsansible.builtin.tempfileanstattBefehl
Verwenden des Modulsansible.builtin.filestatt Befehl
Als letzten Schritt müssen die temporären Dateien entfernt werden.
- 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 }}"