如何访问 Ansible getent 模块值并放入变量?

如何访问 Ansible getent 模块值并放入变量?

我正在尝试开发一个使用 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

getenttl;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 }}"

相关内容