我正在尝试使用ansible模板创建一个sudoers文件。 sudoers文件应如下所示:

Cmnd_Alias LS = /bin/ls
Cmnd_Alias LESS = /usr/bin/less
Cmnd_Alias DU = /usr/bin/du

%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU


到目前为止,我管理的内容如下:

Cmnd_Alias LS = ls
Cmnd_Alias LESS = less
Cmnd_Alias DU = du

%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU


模板如下所示:

{% for item in commands %}
Cmnd_Alias {{ item|upper }} = {{ item }}
{% endfor %}

%{{ group }} ALL=(ALL) NOPASSWD: {% for item in commands %}
{{ item|upper}}{% if not loop.last %}, {% endif %}
{% endfor %}


vars

commands:
  - ls
  - less
  - du


据我所知,ansible模板模块没有任何东西可以在远程服务器上执行命令并输出输出,否则我正在考虑将模板文件更改为如下所示:

{% for item in commands %}
Cmnd_Alias {{ item|upper }} = `which {{ item }}`
{% endfor %}

%{{ group }} ALL=(ALL) NOPASSWD: {% for item in commands %}
{{ item|upper}}{% if not loop.last %}, {% endif %}    
{% endfor %}


输出将是我想要的。

还有其他方法可以使它变得简单吗?

顺便说一句,我已经检查了这篇文章

评论

我只是将命令的完整路径放在您的vars中

对于系统的修改,我更喜欢在bash中包含脚本以更好地运行。

#1 楼

TL; DR:KISS。不要少用。

人们经常通过尝试制作不需要的变量来使ansible错误。除非在多个位置定义支持可以访问的命令列表,否则完全可以将它们放在模板创建文件中:

templates / etc / sudoers.d / support1

Cmnd_Alias LS = /bin/ls
Cmnd_Alias LESS = /bin/cat
Cmnd_Alias DU = /usr/bin/du

%support1 ALL=(ALL) NOPASSWD: LS, LESS, DU


或显式,因为您不在任何地方重用Cmnd_Alias

%support1 ALL=(ALL) NOPASSWD: /bin/ls
%support1 ALL=(ALL) NOPASSWD: /bin/cat
%support1 ALL=(ALL) NOPASSWD: /usr/bin/du


,并添加一些任务,例如:

- name: add templates
  template:
    src: {{ item }}
    dest: /{{ item }}
    owner: root
    group: root
    mode: 0640
  with_items:
    - etc/sudoers.d/support1


您将只使用模板而不是文件,因为后期可能会将一些变量添加到所有模板中,或者如果您得到另一个,则组名可能来自变量创建组的角色。

如果需要使用变量,可以做的就是使用这样的哈希列表:

sudoers.support1.commands:
- { alias: "LS", path: "/bin/ls" }
- { alias: "DU", path: "/usr/bin/du" }


然后在模板中:

{% for item in sudoers.{{ group }}.commands %}
Cmnd_Alias {{ item.alias }} = {{ item.path }}
{% endfor %}
%{{ group }} ALL=(ALL) NOPASSWD: {{ sudoers.{{ group }}.commands | map(attribute='alias') | join(', ') }}


使用/ usr / bin / less不安全

没有注意到很多重要的事情,那就是使用少作为查看器。可悲的是,这是一个安全漏洞。您可以键入“!bash”来调用bash。然后按“ v”,您将基于VISUAL,EDITOR或LESSEDIT变量进入编辑器。因此,您可以给他们提供“ / bin / cat”,他们总是可以将内容减少到更少的内容中。请注意,这仍然是一个安全漏洞,因为unix中的某些文件是有意限制的,例如:

/etc/shadow
/etc/sudoers
/etc/ssh/ssh_host_rsa_key
$HOME/.ssh/id_rsa


评论


我喜欢第二部分。我们应该避免少使用sudo命令。

– Prakash
18年8月13日在4:40

如果更改位于单个位置,则更改变量与更改模板之间的差异为零。使用变量只会使其可读性降低。如果您确实需要使用该变量,请对其命名更好,并列出哈希表,

–吉里·克劳达(Jiri Klouda)
18年8月13日在5:08



#2 楼

首先

,您应该参考Jinja处理空格/换行符。您当前的模板将创建新行,而且我认为这会使sudo混乱并且语法验证失败(IIRC,正确的语法是在q循环中添加-,例如:-%},但您应该“播放”并看看会发生什么)。要渲染模板,您可以在工作站上完成它,而无需在实际的目标计算机上运行它。

此外,我认为在指令行中使用1个命令创建模板更容易理解:

{% for command in commands %}
%{{group}} ALL=(ALL) NOPASSWD: {{command}}
{% endfor %}


其次

我不建议使用ansible编辑现有的全局文件。而是在/etc/sudoers.d/下创建您的自定义模板(就像您提到的那样)。

这是正确的方法,因为:


系统将会保留所有默认值。
您的模板会更短。
如果您犯了错误,则可以确定在模板中的位置。

第三
/>
我认为在which中执行sudoers是一个原始想法,但不起作用。

评论


确实,我收到了语法错误消息。我将研究语法。当然,我为此创建了一个单独的文件。

– Prakash
18年8月11日13:56