在我的剧本中,我想获取 UI 超过 14000 的所有本地用户的列表
我在 /etc/passwd 或 ansible.builtin.getent 上使用了 ansible.builtin.slurp,但真正的问题是我得到的 UID 值是字符串而不是整数,所以我无法正确过滤,并且我得到的所有结果都是空的,或者因为不是整数而抱怨。
- name: Get all users from /etc/passwd
ansible.builtin.getent:
database: passwd
register: users_info
- name: Filter users with UID greater than 14000
set_fact:
filtered_users: >-
{{
users_info.ansible_facts.getent_passwd |
dict2items |
selectattr('value.1', 'int') |
selectattr('value.1', >, 14000) |
map(attribute='key') |
list
}}
我以为selectattr('value.1', 'int')
会转换为 int,但结果总是空。(我的字典中确实有一些高于 14000 的 UID)
这里是 getent 提供的用户字典,所有 UID 都用引号引起来,所以它们是字符串
root:
- x
- '0'
- '0'
- root
- /root
- /bin/bash
shutdown:
- x
- '6'
- '0'
- shutdown
- /sbin
- /sbin/shutdown
sshd:
- x
- '74'
- '74'
- Privilege-separated SSH
- /usr/share/empty.sshd
- /sbin/nologin
我没有其他选择,只能运行一些我会避免的 shell cmd。
干杯,
我发现你的过滤链存在几个问题:
首先,没有名为 的测试
int
,尽管有一个名为 的过滤器integer
。不幸的是,这是一个测试,而不是转换过滤器,因此由于 的值在所有情况下value.1
都是字符串,因此此selectattr()
过滤器将拒绝您的所有条目,从而导致列表为空。此点之后的所有内容都无关紧要,因为没有剩余的内容可以过滤。例如:
结果:
json_query
我认为您会发现使用过滤器的解决方案更简单。对于您想要的,我们可以这样做:在这里,我们使用
to_number
函数将字符串值转换为整数以便进行比较。在我的系统上,这会产生:
使用community.general.jc解析文件/etc/passwd。声明目标
并获取文件
声明路径并解析文件
给出(节选)
属性uid和gid是整数。你可以测试一下
给出
现在,选择工作如预期一样
给出
将声明放入group_vars中
在剧本中,获取文件并声明间隔。例如,
感谢@larsks 的回答,我能够修改我的查询以过滤 14000-15000 UID,如下所示,这给出了预期的结果: