¿Cómo puedo acortar el valor del 'elemento' en la salida de la consola Ansible?

¿Cómo puedo acortar el valor del 'elemento' en la salida de la consola Ansible?

Tengo problemas con el título de esta pregunta, así que siéntete libre de editarlo para que tenga más significado.

Digamos que tienes una tarea en Ansible y tienes registerel resultado. Por ejemplo:

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

Y quiero utilizar la salida registrada para realizar otra tarea. Por ejemplo:

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

Todo eso funciona muy bien. Ahora, quiero repetir ambas tareas N veces. (Sé que podría extraer esto en un archivo yaml separado y usarlo include_taskscombinado con loop, pero no quiero tener dos libros de estrategias). Por lo tanto, actualizo a:

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

Como resultado del bucle, la workdirvariable ha adoptado una estructura diferente, por lo que la iteración ahora es ligeramente diferente. Por ejemplo:

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

Cuando el libro de estrategias se está ejecutando, la consola de Ansible muestra el valor completo del "elemento" en cada iteración. Eso hace que la salida sea ruidosa y difícil de analizar visualmente para un humano. Por ejemplo:

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'})

Aquí está mi pregunta:

¿Hay alguna manera de

  • ¿Abreviar la salida de 'elemento' en la salida de la consola de Ansible?
  • cambie el bucle para que se repita de manera diferente, como:
with_items: "{{ workdir.results.*.stdout }}"
shell: touch {{ item }}/test-file
  • ¿Algún filtro que pueda modificar los artículos?
  • ¿Alguna otra solución inteligente?

Respuesta1

Hay más opciones:

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 }}"

da

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

  • Opcionalmente, cree primero una lista de los directorios.
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 }}"

da lo mismo

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

Notas:

- 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 }}"

información relacionada