在Ansible循环中,根据注册的结果测试文件是否存在

在Ansible循环中,根据注册的结果测试文件是否存在,ansible,Ansible,我有几个文件需要备份到不同的目录中。我尝试了下面的代码,但没有为我工作 vars: file_vars: - {name: /file1} - {name: /etc/file2} - {name: /etc/file/file3} tasks: - name: "Checking if config files exists" stat: path: "{{ item.name }}" with_items

我有几个文件需要备份到不同的目录中。我尝试了下面的代码,但没有为我工作

  vars:
    file_vars:
      - {name: /file1}
      - {name: /etc/file2}
      - {name: /etc/file/file3}

  tasks:

  - name: "Checking if config files exists"
    stat:
      path: "{{ item.name }}"
    with_items: "{{ file_vars }}"
    register: stat_result

  - name: Backup Files
    copy: src={{ item.name }} dest={{ item.name }}{{ ansible_date_time.date }}.bak
    with_items: "{{ file_vars }}"
    remote_src: yes
    when: stat_result.stat.exists == True

请尝试使用以下适合我的方法:

---
- name: Copy files
  hosts: localhost
  become: yes
  become_user: root
  vars_files:
    - files.yml


  tasks:

  - name: "Checking if config files exists"
    stat:
    path: "{{ item }}"
    with_items: "{{ files }}"
    register: stat_result

  - name: Ansible
    debug:
      msg: "{{ stat_result }}"

  - name: Backup Files
    copy:
      src: "{{ item }}"
      dest: "{{ item.bak }}"
    with_items: "{{ files }}"
    when: stat_result == "True"
和files.yml将如下所示:

---
files:
   - /tmp/file1
   - /tmp/file2
您可以使用以下命令检查playbook语法: ansible playbook copy.yml-语法检查

此外,在实际执行之前,您也会对您的剧本进行试运行。
ansible playbook-i localhost copy.yml-检查

问题在于条件

when: stat_result.stat.exists == True
when: files_stats[item.name]
没有属性stat\u result.stat。相反,属性stat_result.results是循环结果的列表。可以创建文件及其状态的字典。比如说

   - set_fact:
        files_stats: "{{ dict(my_files|zip(my_stats)) }}"
      vars:
        my_files: "{{ stat_result.results|json_query('[].item.name') }}"
        my_stats: "{{ stat_result.results|json_query('[].stat.exists') }}"
然后只需在条件中使用此词典

when: stat_result.stat.exists == True
when: files_stats[item.name]
下面是一个较短的版本,它可以更有效地创建字典

   - set_fact:
       files_stats: "{{ dict(stat_result.results|
                        json_query('[].[item.name, stat.exists]')) }}"