3

我用 find ansible 模块找到了一些文件

- find:
    paths: "/"
    patterns: ["*.service"]
    file_type: file
    hidden: True
    recurse: yes
  register: find_results
  when: ansible_service_mgr == "systemd"

现在我想检查修改某些文件的权限:

- file:
    path: "{{ item.path }}"
    owner: root
    group: root
    mode: 0644
  with_items:
    - "{{ find_results.files }}"
  when:
    - item.path | match("/sys/devices/power/events/*")
    - ansible_service_mgr == "systemd"

问题是我不想要比赛。我想要与该路径不匹配的所有内容?

如何否定匹配过滤器?(!,不是,等等)?

4

3 回答 3

6

感谢您的帮助,您还可以执行以下操作:

not (item.path | match("/sys/devices/power/events/*"))
于 2017-05-19T08:26:55.313 回答
0

我建议重写你的任务如下:

- file:
    path: "{{ item.path }}"
    owner: root
    group: root
    mode: 0644
  with_items: "{{ [] if ansible_service_mgr != 'systemd' else find_results.files | rejectattr('path','match','/sys/devices/power/events/.*') | list }}"
  1. 它用于rejectattr拒绝(消除)find_results.files该匹配正则/sys/devices/power/events/.*表达式中的所有项目。你想要的一种匹配否定。

  2. 它只使用必需的项目进行循环。您的任务将使用所有找到的文件进行循环,并为每个when语句未命中生成“跳过”消息。

  3. 当服务管理不是时[],它还会提供空列表。否则,您的任务可能会为每个项目生成多个跳过的项目,或者完全失败,因为之前的任务被跳过并且未定义。with_itemssystemdfind_results.filesfind_results.files

PS 如果您有许多依赖于 的任务systemd,您可能希望将它们分成不同的 yaml 文件,并有条件地将其仅包含在systemd机器上——这将使代码更清晰,而无需这些多条when: ansible_service_mgr == "systemd"语句。

于 2017-05-19T07:44:56.343 回答
0

你能试一下吗

when: ("/sys/devices/power/events/*" not in item.path "/sys/devices/power/events/")  and
      (ansible_service_mgr == "systemd")

但是第二个条件是没用的,因为你在获取的时候已经设置了条件find_results

于 2017-05-19T07:45:53.350 回答