Ansible: 使用循环注册变量

32次阅读
没有评论

问题描述

在使用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.resultsstat.pw_name等于root的项,并计算列表的长度。
请注意,方案1中使用的json_query过滤器需要安装jmespath库。如果不想安装该库,可以使用方案2中的Jinja过滤器代替。

正文完