问题描述
在使用Ansible时,有一个问题是如何使用注册变量audit_tools
来检查所有项目是否由root用户拥有。他想知道是否需要使用Jinja2过滤器或其他方法来实现。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
将工具列表放入变量audit_tools
中,并比较列表的长度。以下是一个示例的Playbook:
- hosts: localhost
vars:
audit_tools:
- auditctl
- aureport
- ausearch
- autrace
- auditd
- audispd
- augenrules
tasks:
- block:
- stat:
path: "/sbin/{{ item }}"
loop: "{{ audit_tools }}"
register: result
- assert:
that: no_audit_tools == no_owner_root
fail_msg: "One or more tools are not owned by root."
vars:
no_audit_tools: "{{ audit_tools|length }}"
no_owner_root: "{{ result.results|
json_query('[?stat.pw_name==`root`]')|
length }}"
rescue:
- debug:
msg: "Rescue: audit tools not owned by root."
如果不是所有项目都由root用户拥有,assert
将失败,并且block
将进入rescue
部分。
方案2
使用Jinja过滤器
selectattr
可以实现相同的功能。
以下是使用Jinja过滤器selectattr
的示例:
no_owner_root: "{{ result.results|
selectattr('stat.pw_name', 'eq', 'root')|
list|length }}"
这个过滤器将选择result.results
中stat.pw_name
等于root
的项,并计算列表的长度。
请注意,方案1中使用的json_query
过滤器需要安装jmespath
库。如果不想安装该库,可以使用方案2中的Jinja过滤器代替。
正文完