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 %}
输出将是我想要的。
还有其他方法可以使它变得简单吗?
顺便说一句,我已经检查了这篇文章
#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
评论
我只是将命令的完整路径放在您的vars中对于系统的修改,我更喜欢在bash中包含脚本以更好地运行。