我正在尝试开发一个使用 getent 模块来帮助管理各种用户帐户的 Ansible 剧本。我希望能够访问各种值,如 UID、GID、密码等(我认为是 Python 字典——但我不确定是否准确)。
如果密码被锁定(例如 ! 或 !!),我该如何读取/访问?
如何读取/访问以下帐户的 UID 或 GID:ntp:x:38:38::/etc/ntp:/sbin/nologin 并将其放入变量中,以供下一个任务使用?
这是迄今为止的当前剧本任务。如果有剧本,可以完成此任务吗?
- 名称:“getent 变量” 获取: 数据库:passwd 密钥:ntp #root #uid 分裂: ':' #失败键: # 注册:getent_passwd - 调试: 变量: getent_passwd
答案1
Getent 结果通常会作为事实添加到主机事实中。
请记住,有关 gid/uid/etc 的信息与密码信息位于不同的数据库中。
# ansible localhost -m getent -a 'database=passwd key=root'
localhost | SUCCESS => {
"ansible_facts": {
"getent_passwd": {
"root": [
"x",
"0",
"0",
"root",
"/root",
"/bin/bash"
]
}
},
"changed": false
}
# ansible localhost -m getent -a 'database=shadow key=root'
localhost | SUCCESS => {
"ansible_facts": {
"getent_shadow": {
"root": [
"*",
"17939",
"0",
"99999",
"7",
"",
"",
""
]
}
},
"changed": false
}
我如何读取/访问此帐户的 UID 或 GID:ntp:x:38:38::/etc/ntp:/sbin/nologin 并将其保存为变量以用于下一个任务?
事情没那么容易。
- name: "getent variables"
getent:
database: passwd
key: ntp
- name: show the UID
debug:
var: getent_passwd['ntp'][1]
- name: show the GID
debug:
var: getent_passwd['ntp'][2]
- name: "getent variables"
getent:
database: passwd
key: ntp
- name: show the password hash
debug:
var: getent_shadow['ntp'][0]
答案2
getent
tl;dr - 使用模块(棘手)或user
模块(更简单但信息更有限)解决问题的示例
您可以通过使用模块获取最多的信息getent
,但挑选出您想要的项目却很棘手(用于debug
向您展示整个结构,以便您可以弄清楚如何指定您想要的字段)。
要获取一些常见字段,getent
例如,
- ansible.builtin.set_fact:
username: ntp
- ansible.builtin.getent:
database: passwd
key: "{{ username }}"
- ansible.builtin.set_fact:
uid: "{{ getent_passwd[username][1] }}"
gid: "{{ getent_passwd[username][2] }}"
home: "{{ getent_passwd[username][4] }}"
shell: "{{ getent_passwd[username][5] }}"
- ansible.builtin.debug:
msg: "UID: {{ uid }}, GID: {{ gid }}, home: {{ home }}, shell: {{ shell }}"
重申 Zoredache 的评论,该getent
模块将创建以下形式的主机事实getent_
数据库名称在哪里数据库名称将与database:
指定的相对应getent
,因此getent_passwd
如上所述。
如果您只需要那些特定字段,则可以使用更容易理解的user
模块check_mode
(不会check_mode: true
创建或修改相关用户,因此请小心!)。相应的行将是,
- ansible.builtin.user:
name: ntp
check_mode: true
register: res
- ansible.builtin.set_fact:
uid: "{{ res.uid }}"
gid: "{{ res.group }}"
home: "{{ res.home }}"
shell: "{{ res.shell }}"
- ansible.builtin.debug:
msg: "UID: {{ uid }}, GID: {{ gid }}, home: {{ home }}, shell: {{ shell }}"