【问题标题】:Ansible - Filter Dictionary ValuesAnsible - 过滤字典值
【发布时间】:2021-08-28 19:54:41
【问题描述】:

我已经收集了所有使用getent_module的用户列表:

- name: Get user info
  getent:
    database: passed

这会将这个变量作为 getent_passwd 返回,一个像这样的字典:

{
    "uuidd": [
        "x",
        "107",
        "112",
        "",
        "/run/uuidd",
        "/usr/sbin/nologin"
    ],
    "www-data": [
        "x",
        "33",
        "33",
        "www-data",
        "/var/www",
        "/usr/sbin/nologin"
    ]
}

我试图返回一个用户数组,包括一些特定的用户,找到 item.value 的键,其中“/home”是值数组项之一的一部分,而“nologin”不是。 这是我目前写的代码,但是不正确。

- name: style the user list
  set_fact:
    my_users: "{{ item.key | default([]) }}"
  when:
    - "'nologin' not in (item.value)"
    - "'/home' search in (item.value)"
  loop: "{{ lookup('dict', getent_passwd) }}"

我应该如何改变我的条件以获得预期的结果?

【问题讨论】:

    标签: ansible filtering ansible-module


    【解决方案1】:

    正如您正确理解的那样,由于模式/正则表达式匹配适用于字符串而不适用于列表项,when 条件将不起作用。在匹配列表中的项目时,我们需要匹配完整的项目,即

    when:
      - "'/home/someuser' in item.value"
      - "'/usr/sbin/nologin' not in item.value"
    

    通常,Linux 中的$HOME 路径是/home/$USER。生成的getent_passwd 包含item.key 中的用户名。这意味着我们可以使用/home/{{ item.key }} 来匹配item.value

    下面的任务应该可以完成这项工作:

        - name: save users with actual login
          set_fact:
            my_users: "{{ my_users | default([]) + [ item.key ] }}"
          when:
            - "'/home/' ~ item.key in item.value"
            - "'/usr/sbin/nologin' not in item.value"
          loop: "{{ lookup('dict', getent_passwd) }}"
    

    另一种方法可能是实际上join item.value 得到一个类似于/etc/passwd 中的字符串,以便我们可以进行文本搜索,例如:'/home' search in (item.value)

    例子:

       # item.value | join(':') is the same as each line of '/etc/passwd'
        - name: save users with actual login
          set_fact:
            my_users: "{{ my_users | default([]) + [ item.key ] }}"
          when:
            - "'/home' in item.value | join(':')"
            - "'nologin' not in item.value | join(':')"
          loop: "{{ lookup('dict', getent_passwd) }}"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 2021-08-24
      • 1970-01-01
      相关资源
      最近更新 更多