Возможность переименовать файл, только если он существует

Мне нужно переименовать /jp/Test в /jp/test только в том случае, если /jp/Test существует, иначе мне не нужно выполнять эту задачу. если оба существуют, мне нужно объединить оба в /jp/test

Я получаю ошибку ниже

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

Пособие:

      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

1 ответ

Ниже приведено рабочее решение. Обратите внимание, что вы можете установить владельца/разрешения для файла, созданного , и чтоblockinfileдобавит привязки вставки вокруг вставленного текста в файле назначения. Оба из них можно настроить (см. документацию ).

      - 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

Ошибка связана с тем, что переменная цикла не является списком, а объектом словаря. Когда вы вызываетеloop: "{{ jpresult.results }}"(обратите внимание, см.loopпротив with_) значение{{ item }}для каждой итерации цикла — это один элемент списка, а не полный список. Чтобы получить доступ к значению статистики текущего индекса цикла, вы можете использоватьitem.statили для доступа к статистике другой итерации вы можете использоватьjpresult.results.N.stat(гдеN— это индекс, к которому вы хотите получить доступ).

Другие вопросы по тегам