如果目录存在于 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)
我是 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)