如果目录存在于 Ansible 中,则尝试对列表进行 运行 统计并执行某些操作

Trying to run stat over a list if directories and perform some action if they exist in Ansible

我是 Ansible 新手,请多多包涵。

我有一个需要设置 FACL 的目录列表。 并非所有这些目录都存在于我清单中的所有主机上。我的 Ansible 剧本试图实现以下目标:

-stat每个目录中列出的dir_list变量文件并注册结果。 -运行 将 FACL 权限分配给服务器上存在的任何目录的 acl 模块。

这是我的变量文件 - dir_list - 看起来像:

dir_path:
  - /tmp/testdir1
  - /tmp/testdir2
  - /tmp/testdir3
  - /tmp/testdir4

这是我的剧本的样子:

---
- hosts: localhost
  connection: local
  become: yes
  become_method: sudo
  become_user: root
  gather_facts: yes
  any_errors_fatal: no
  vars_files:
    - /home/user1/ansible/dir_list
  tasks:
  - name: Check if directory exists
    stat:
      path: "{{ item }}"
    with_items:
      "{{ dir_path }}"
    register: dircheck

  - name: Set ACLs
    acl:
      path: "{{ item }}"
      entity: testuser
      etype: user
      permissions: rx
      state: present
    with_items: "{{ dircheck.results | selectattr('stat.isdir') | map(attribute='item') | list }}"
    when: item.stat.isdir is defined and (item.stat.isdir|bool)

我显然对此进行了研究,并尝试了十几种建议的解决方案,但均无济于事。最后两行只是我尝试过的无数组合中的两个。我是 运行 RHEL7 上的 Ansible 版本 2.9.10。

如有任何帮助,我们将不胜感激。

Q: "统计 dir_list 变量中列出的每个目录... 运行 acl 模块将 FACL 权限分配给任何存在的目录."

A:给定目录

shell> ls -d1 /tmp/* | grep testdir
/tmp/testdir1
/tmp/testdir2
/tmp/testdir3

剧本

- hosts: localhost
  vars:
    dir_path:
      - /tmp/testdir1
      - /tmp/testdir2
      - /tmp/testdir3
      - /tmp/testdir4
  tasks:
    - stat:
        path: "{{ item }}"
      loop: "{{ dir_path }}"
      register: dircheck
    - debug:
        msg: "Set ACLs at {{ item.stat.path }}"
      loop: "{{ dircheck.results }}"
      loop_control:
        label: "{{ item.item }}"
      when:
        - item.stat.exists
        - item.stat.isdir|default(false)

给出(删节)

TASK [stat] ****
ok: [localhost] => (item=/tmp/testdir1)
ok: [localhost] => (item=/tmp/testdir2)
ok: [localhost] => (item=/tmp/testdir3)
ok: [localhost] => (item=/tmp/testdir4)

TASK [debug] ****
ok: [localhost] => (item=/tmp/testdir1) => 
  msg: Set ACLs at /tmp/testdir1
ok: [localhost] => (item=/tmp/testdir2) => 
  msg: Set ACLs at /tmp/testdir2
ok: [localhost] => (item=/tmp/testdir3) => 
  msg: Set ACLs at /tmp/testdir3
skipping: [localhost] => (item=/tmp/testdir4)