Ansible 列表变量和选择过滤器以忽略匹配项

Posted

技术标签:

【中文标题】Ansible 列表变量和选择过滤器以忽略匹配项【英文标题】:Ansible List Variable and Select Filter to ignore matched items 【发布时间】:2020-03-17 08:48:22 【问题描述】:

我在 ansible playbook 中有一个变量 dir_lst_raw,其值为 list,如下所示:

"dir_lst_raw": [
        "/path1/dir1/user",
        "/path2/dir2/admin",
        "/path3/dir3/user.ansible_backup_2020-03-16",
        "/path1/dir1/config.ansible_backup_2020-03-16",
        "/path2/dir2/dir3/somefile"
      ]

我需要删除所有包含.ansible_backup_ 的行并作为list 保存到另一个变量中。 我搜索了正则表达式并试图 不匹配模式与选择过滤器,如下所示:

  - set_fact:
      dir_lst: " dir_lst_flt_r | select('match','(^.ansible_backup_)+') | list "

但新变量 dir_lst 原来是一个空列表。我期待dir_lst 如下:

"dir_lst_raw": [
        "/path1/dir1/user",
        "/path2/dir2/admin",
        "/path2/dir2/dir3/somefile"
     ]

有人可以建议我如何完成它吗?

【问题讨论】:

【参考方案1】:

下面的任务完成了这项工作

    - set_fact:
        dir_lst: " dir_lst_raw|reject('match', my_regex)|list "
      vars:
        my_regex: '^(.*)\.ansible_backup_(.*)$'
    - debug:
        var: dir_lst

给予

    "dir_lst": [
        "/path1/dir1/user", 
        "/path2/dir2/admin", 
        "/path2/dir2/dir3/somefile"
    ]

【讨论】:

以上是关于Ansible 列表变量和选择过滤器以忽略匹配项的主要内容,如果未能解决你的问题,请参考以下文章

ansible Regular Expression Filters 正则表达式过滤器

扁平化和过滤 ansible 中的复杂结构 - dict 列表中的 dict

为啥 Ansible-Tower 忽略了额外的变量?

如何过滤 label_values(label) 的结果以获取与正则表达式匹配的标签列表?

ansible基础三

Ansible 循环遍历字典和列表