我需要确保给定用户能够读取 ansible 中的给定文件。当然,我使用“acl”模块(使用setfacl)来授予用户读取权限。这很容易。但我还需要确保用户可以“执行”文件路径树上的所有目录。例如。:
read /var/lib/secured/directory/file
eXecute /var/lib/secured/directory
eXecute /var/lib/secured
eXecute /var/lib
eXecute /var
eXecute /
当然,我正在编写一个角色,它不知道路径将有多少个元素,所以我需要在 Ansible 中有一个动态循环。但我不知道如何实现这一目标。
如果有任何想法,我将不胜感激。
这个话题已经很老了,但是我遇到过类似的情况,我解决了用 python 编写一个(非常)简约的过滤器插件。
假设我有一个文件位于 ansible 托管节点上的
/path/to/my/file
中。目标是在此文件上为特定用户(在以下 ansible 任务中名为 fizzgig1888)设置 r
acl,并为此文件的每个父目录设置 x
acl:/
、/path
、 /path/to
和 /path/to/my
。
构建所有这些路径的列表的一个简单方法是在角色目录中的
filter_plugins/filters.py
文件中添加以下代码,以创建一个名为 parents
的自定义 ansible 过滤器插件。如果尚未在所涉及的 ansible 角色中编码任何过滤器插件,则可能需要创建它。
from pathlib import Path
class FilterModule(object):
def filters(self):
return {
'parents': lambda path: [path]+[ str(parent) for parent in Path(path).parents ]
}
现在在
tasks/main.yml
中创建以下 ansible 任务
- name: Apply acl perms
ansible.posix.acl:
path: "{{ item }}"
entity: "{{ myuser }}"
etype: user
permissions: "{{ perm }}"
state: present
loop: "{{ myfile | parents }}"
loop_control:
index_var: i
vars:
perm: "{{ (i==0 ) | ternary('r', 'x') }}"
myfile: /path/to/my/file
myuser: fizzgig1888
运行它,它应该产生以下输出:
TASK [myrole : Apply acl perms] *************************************************************************
changed: [controller] => (item=/path/to/my/file)
changed: [controller] => (item=/path/to/my)
changed: [controller] => (item=/path/to)
changed: [controller] => (item=/path)
changed: [controller] => (item=/)
使用自定义
parents
filter_plugin,"{{ myfile | parents }}"
在以下列表中进行评估:['/path/to/my/file', '/path/to/my', '/path/to', '/path', '/']
在任务循环中,loop_control 定义设置一个变量
i
,当路径列表循环时,该变量从 0 变为 3。这样,由于 ternary
过滤器,当 perm
等于 r
时,i
值设置为 0
,当路径列表中的第一项(文件本身)为治疗。否则, perm
值设置为 x
,当处理路径列表中的每个其他项目(父目录)时,会附加该值。
备注:请注意,根
/
文件夹不需要设置任何acl,因为用户应该可以读取和执行该文件夹来访问其主目录。它可以从 parents
自定义 filter_plugin 中排除,但为了保持简短而没有出现在我的示例中。
您需要使用ACL吗? 如果您需要做的只是授予用户对目录结构的执行权限,我首先想到的是使用
chmod
- 或者在 Ansible 中,文件模块:
- file:
path: /var/lib/secured/directory
state: directory
owner: root
group: root
mode: u=rwx,g=rwx,o=rx
recurse: yes
或类似的。