首页 > 解决方案 > 使用 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 }}"

在这里,我得到了一个带有 key: users 和 value: 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

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

附言

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

谢谢你。

标签: ansibleansible-2.x

解决方案


问:“如何使用用户列表作为循环变量从该任务中创建一个循环。”

答:阅读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 }}"

(未测试)


推荐阅读