ansible 循环遍历文件列表并检查文件是否存在,如果不存在则下载它

Nic*_*asW 2 yaml loops ansible

不知道如何实现这个逻辑,我知道如何在单个文件中实现它:

- name: Obtain information about a file
  win_stat:
    path: "C:\myfile.txt"
  register: fileinfo

- [...]
  when: fileinfo.exists == False
Run Code Online (Sandbox Code Playgroud)

我应该如何处理文件列表?

gai*_*ige 6

如果您只是想减少执行此操作的步骤,您应该能够使用ignore_errors: yes下载命令执行下载步骤(示例中未显示)。ignore_errors: yes如果您使用和的组合register,您甚至可以判断命令是否失败。

如果您希望提高效率,可以在单个任务中进行统计,然后检查其结果。当您使用列表执行任务时,您会得到答案的哈希值。

假设您有一个文件名/路径列表ssh_key_config,您可以使用 stat,然后您可以循环遍历这些项目(其中方便地包含文件名)。

- name: Check to see if file exists
  stat:
    path: "{{ remote_dir }}/{{ item }}"
  register: stat_results
  with_items: "{{ target_files }}"
  ignore_errors: True

- name: perform operation
  fetch:
    src: "{{ remote_dir }}/{{ item.item }}"
    dest: "{{ your_dest_dir }}"
    flat: yes
  with_items: "{{ stat_results.results }}"
  when: item.stat.exists == False
Run Code Online (Sandbox Code Playgroud)

在本例中,假设remote_dir包含主机上的远程目录、target_files包含实际文件名以及your_dest_dir您希望在本地放置文件的位置。

我对 Windows 和 Ansible 没有做太多的工作,但win_stat文档与 几乎相同stat,因此您可能只需替换它即可。

另请注意,这需要文件列表,而不是 glob。如果您使用 glob(例如,您想从远程检索具有特定扩展名的所有文件),那么您将不会使用该with_items子句,并且您需要使用item.stat.filename and/oritem.stat.path来远程检索文件(因为将item.item包含请求项,即 glob。