Ansible循环遍历文件。

12
在Ansible 2.5之前,循环的语法通常使用with_x。从2.5开始,loop更受青睐,with_x基本在文档中消失了。
尽管如此,文档还提到了如何用loop替换with_x的示例。但是对于如何遍历文件夹中的文件,我还是一筹莫展。
假设我需要上传给定目录中的所有文件,我过去会使用with_fileglob
- name: Install local checks
  copy:
    src: "{{ item }}"
    dest: /etc/sensu/plugins/
    owner: sensu
    group: sensu
    mode: 0744
  with_fileglob:
    - plugins/*

那么现代的替代方法是什么?这真的可能吗?我知道我仍然可以使用with_fileglob,但是当我编写新角色时,最好让它们具备未来兼容性。

2个回答

29
以下是等效的内容。请参阅比较循环和with_*
  loop: "{{ lookup('fileglob', 'plugins/*', wantlist=True) }}"

查找查询之间的区别主要在于查询始终会返回一个列表。默认情况下,查找的行为是返回一个逗号分隔的字符串。可以通过使用wantlist=True来显式配置查找以返回一个列表。

  loop: "{{ query('fileglob', 'plugins/*') }}"

此外,q 也被引入为 query 的简写形式。
  loop: "{{ q('fileglob', 'plugins/*') }}"

所有三个选项都会得到相同的结果。请参阅查找插件

它完美地工作了!我在文档中找不到它,以为它已经被删除了,因为每个 with_x 的替代方案都被提出了,但是没有这个。谢谢! - Buzut

16

从当前的Ansible循环文档中:

任何需要在循环中使用lookupwith_*语句都不应该转换为使用loop关键字。例如,不要这样做:

loop: "{{ lookup('fileglob', '*.txt', wantlist=True) }}"

保持干净:

with_fileglob: '*.txt'


1
虽然从技术上讲这不是对原帖的回答,但这是一个非常实用的建议,所以值得点赞,这很重要。 - Drew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接