Ansible para cambiar el nombre de un archivo sólo si existe

Ansible para cambiar el nombre de un archivo sólo si existe

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 blockinfileagregará 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, verloopvswith_) 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 Nestá el índice al que desea acceder).

información relacionada