在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]')) }}"