![Ansible para cambiar el nombre de un archivo sólo si existe](https://rvso.com/image/760998/Ansible%20para%20cambiar%20el%20nombre%20de%20un%20archivo%20s%C3%B3lo%20si%20existe.png)
Necesito cambiar el nombre de /jp/Test a /jp/test solo si /jp/Test existe; de lo contrario, no necesito realizar esta tarea. Si ambos existen, necesito fusionarlos en /jp/test
me sale el siguiente error
{"msg": "The conditional check 'item.1.stat.exists == false and item.2.stat.exists == true' failed. The error was: error while evaluating conditional (item.1.stat.exists == false and item.2.stat.exists == true): dict object has no element 1\n\nThe error appears to be in
Libro de jugadas:
hosts: test
gather_facts: false
vars:
hostsfiles:
- /jp/test
- /jp/Test
tasks:
- name: Check if file exists
stat:
path: "{{ item}}"
with_items: "{{ hostsfiles }}"
register: jpresult
- name: test
shell: mv "{{item.2.stat.path}}" /jp/test
with_items:
- "{{ jpresult.results }}"
when: item.1.stat.exists == false and item.2.stat.exists == true
Respuesta1
A continuación se muestra una solución funcional. Tenga en cuenta que es posible que desee establecer el propietario/los permisos en el archivo creado por blockinfile
, y eso blockinfile
agregará anclajes de inserción alrededor del texto insertado en el archivo de destino. Ambos se pueden configurar (verlos documentos)
- name: Some very cool play
hosts: test
gather_facts: false
vars:
destination_path: /jp/test
legacy_path: /jp/Test
tasks:
- name: Check if legacy file exists
stat:
path: "{{ legacy_path }}"
register: legacy_status
- name: Move contents of legacy file to destination file
when: legacy_status.stat.exists is true
block:
# Note that there is currently no module to read the contents of a
# file on the remote, so using "cat" via command is the best alternative
- name: Read contents of legacy file
command:
cmd: cat {{ legacy_path }}
register: legacy_contents
changed_when: false
- name: Add contents of legacy file to destination file
blockinfile:
path: "{{ destination_path }}"
state: present
block: "{{ legacy_contents.stdout }}"
# This ensures the file is created if it does not exist,
# saving an extra task to rename the file if necessary
create: true
- name: Remove legacy file
file:
path: "{{ legacy_path }}"
state: absent
El error que tienes ahí se debe a que la variable de bucle no es una lista, sino un objeto de diccionario. Cuando invocas loop: "{{ jpresult.results }}"
(nota, verloop
vswith_
) el valor de {{ item }}
para cada iteración del bucle es un único elemento de la lista, en lugar de la lista completa. Para acceder al valor de estadística del índice de bucle actual, puede usar item.stat
, o para acceder a la estadística de una iteración diferente, puede usar jpresult.results.N.stat
(dónde N
está el índice al que desea acceder).