【问题标题】:Get users and users dirs using getent使用 getent 获取用户和用户目录
【发布时间】:2019-11-21 16:34:29
【问题描述】:

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

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

我的计划是:

  • 从密码文件中获取所有用户;

  • 只选择非系统用户,例如可以是passwd中有/bin/bash shell的用户,也可以不是/usr/sbin/nologin /bin/false;

  • 提取用户名和主目录到变量;

  • 将其作为变量放入 blockinfile 模块中。

我正在尝试使用下面的 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 }}"

在这里,我得到了一个带有键的字典:用户和值:主目录。但我不知道如何按 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

谢谢。

【问题讨论】:

    标签: ansible ansible-2.x


    【解决方案1】:

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

    A:读取密码。变量 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 }}"
    

    (未测试)

    【讨论】:

    • 这段代码完美运行。我只是将exclusive: yes 添加到authorized_key 模块。并为来自不同文件的多个用户组的密钥做了额外的任务。
    猜你喜欢
    • 2015-01-14
    • 2019-06-20
    • 2011-12-16
    • 2022-01-10
    • 2014-02-01
    • 2015-08-23
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多