
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 register
el 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_tasks
combinado 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 workdir
variable 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:
- Usarcontrol_bucle. VerLimitar la salida del bucle con etiqueta. Por ejemplo,
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:
Utilice el móduloarchivo ansible.builtin.tempen lugar dedominio
Utilice el móduloansible.archivo.integradoen lugar de comando
Elimine los archivos temporales como última tarea.
- 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 }}"