使用 getent 获取用户和用户目录

Get users and users dirs using getent

我是ansible的新手,所以请原谅。我没有从 ansible 文档中找到或可能不了解相关信息。

我需要在系统 (Debian 9) 中所有用户的 .ssh/autorized_keys 中按块放置一些 ssh 密钥,而无需在任务中使用 shell。 Ansible 2.7.5

我的计划是:

我正在尝试使用下面的 getent 模块从 passwd 文件中获取所有用户。

- getent:
    database: passwd
    key:
  register: allusers

# - debug:
#     var: allusers
# - debug:
#       msg: "{{ ansible_facts.getent_passwd }}"

# - name: Select actual users
#   set_fact:
#       passwd_user: "{{ item.key }}"
#       passwd_hdir: "{{ item.value.4 }}"
#   loop: "{{ allusers.ansible_facts.getent_passwd | dict2items }}"

- name: "Show file path only"
  debug:
    msg:
      - "Located user: {{ item.key }}"
      - "Home Dir: {{ item.value.4 }}"
  loop: "{{ allusers.ansible_facts.getent_passwd | dict2items }}"

这里我得到了一个字典,键为:users,值为:home dir。但我不知道如何按 shell 类型过滤它以及如何将所有用户和目录分配给 var.

- name: "Add ssh keys"
  blockinfile:
      path: "{{ passwd_hdir }}/.ssh/authorized_keys"
      create: yes
      owner: "{{ passwd_user }}"
      group: "{{ passwd_user }}"
      block: "{{ item }}"
  with_file:
    - "defaults/main.yml"  # file in role's dir with ssh-keys

结果我只为一个用户添加了密钥。如何使用用户列表作为循环变量从该任务创建循环。

P.S.

我的问题的第二部分是如何处理变量结果:列表、字符串、字典。我想我了解如何使用过滤器进行转换,但我可以在哪里阅读更多有关检测 var 类型并从中提取数据的信息。我不清楚:https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html

谢谢。

Q: "How to make a loop from that task with a list of users as loop variable."

A:读取passwd。变量 getent_passwd 将由模块 getent

自动创建
- getent:
    database: passwd

通过选择包含 shell /bin/bash 的记录创建用户列表 my_users

- set_fact:
    my_users: "{{ getent_passwd|
                  dict2items|
                  json_query('[? contains(value,`/bin/bash`)].key') }}"

循环列表my_users并使用authorized_key配置authorized_keys

- authorized_key:
    user: "{{ item }}"
    key: "{{ lookup('file', 'defaults/main.yml') }}"
  loop: "{{ my_users }}"

(未测试)