如何在 Ansible 中给定路径的所有父级、祖先设置 acl?

问题描述 投票:0回答:2

我需要确保给定用户能够读取 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 中有一个动态循环。但我不知道如何实现这一目标。 如果有任何想法,我将不胜感激。

ansible
2个回答
0
投票

这个话题已经很老了,但是我遇到过类似的情况,我解决了用 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 中排除,但为了保持简短而没有出现在我的示例中。


-1
投票

您需要使用ACL吗? 如果您需要做的只是授予用户对目录结构的执行权限,我首先想到的是使用

chmod
- 或者在 Ansible 中,文件模块:

- file:
    path: /var/lib/secured/directory
    state: directory
    owner: root
    group: root
    mode: u=rwx,g=rwx,o=rx
    recurse: yes

或类似的。

© www.soinside.com 2019 - 2024. All rights reserved.