我创建了这个 playbook 来提取从变量whitelist中与type= ext2, ext3, ext4匹配的任何元素开始的所有挂载点.

问题是我可以得到全部mount_points个,但我不能用变量过滤结果.

- hosts: all
  gather_facts: True
  become: True
  vars:
     whitelist:
         - /boot
         - /home
         - /opt
         - /var
         - /bin
         - /usr

  tasks:
  - name: extract mount_points 
    set_fact:
      mount_point: "{{ansible_facts.mounts | selectattr('fstype', 'in', ['ext2', 'ext3', 'ext4']) | map(attribute='mount') | list }}"

  - debug:
      var: mount_point
    vars:
      query: "[?starts_with(mount, whitelist)].mount"

当我执行 playbook 时,我得到了这个

ok: [ansible@controller] => {
    "mount_point": [
        "/", 
        "/boot", 
        "/tmp", 
        "/home", 
        "/var", 
        "/var/opt", 
        "/var/tmp", 
        "/var/log", 
        "/var/log/audit", 
        "/opt", 
    ]
}

包括/tmp,这意味着跳过了query: "[?starts_with(mount, whitelist)].mount",我不知道如何实现战术目标.

推荐答案

在这里,您实际上不需要json查询.一种简单的方法是用match过滤列表,并构造一个包含所有可能前缀的正则表达式:

- name: show my filtered mountpoints:
  vars:
    start_regex: "{{ whitelist | map('regex_escape') | join('|') }}"
  degug:
    msg: "{{ {{ansible_facts.mounts | selectattr('fstype', 'in', ['ext2', 'ext3', 'ext4'])
          | map(attribute='mount') | select('match', start_regex) | list }}"
   

Linux相关问答推荐

如何在Linux上获取clang中的模板实例化统计?

使用正则表达式捕获特定字符串

8 个半小时范围的 Crontab 表达式

如何使用 shell 脚本查找具有最大上下文长度的行号?

Linux 如何将主机文件作为用户的输入并将其调用到脚本中

如何指定链接时使用的库版本?

如何使用 AWK 合并两个文件?

从 shell 将多个 .sql 转储文件导入 mysql 数据库

在 Linux/POSIX 系统上获取用户全名的最简单方法是什么?

yum 可以告诉我哪些存储库提供了特定的包吗?

如何让 PHP、Symlinks 和 __FILE__ 很好地协同工作?

使用 ssh 判断远程主机上是否存在文件

为什么 JVM 报告的已提交内存比 linux 进程驻留集大小更多?

如何在 Linux 上取消关机?

如果关键字触发然后执行命令,Shell 脚本来监视日志(log)文件?

Postgresql -bash:psql:找不到命令

readelf vs. objdump:为什么都需要

id_rsa.pub 文件 SSH 错误:格式无效

在 Docker 容器中运行的 JVM 的驻留集大小 (RSS) 和 Java 总提交内存 (NMT) 之间的差异

如何处理以连字符 (-) 字符开头的文件名?