使用 getent 获取用户和用户目录
Get users and users dirs using getent
我是ansible的新手,所以请原谅。我没有从 ansible 文档中找到或可能不了解相关信息。
我需要在系统 (Debian 9) 中所有用户的 .ssh/autorized_keys 中按块放置一些 ssh 密钥,而无需在任务中使用 shell。 Ansible 2.7.5
我的计划是:
从密码文件中获取所有用户;
select只能是非系统用户,比如密码可以是/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 }}"
这里我得到了一个字典,键为: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 }}"
(未测试)
我是ansible的新手,所以请原谅。我没有从 ansible 文档中找到或可能不了解相关信息。
我需要在系统 (Debian 9) 中所有用户的 .ssh/autorized_keys 中按块放置一些 ssh 密钥,而无需在任务中使用 shell。 Ansible 2.7.5
我的计划是:
从密码文件中获取所有用户;
select只能是非系统用户,比如密码可以是/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 }}"
这里我得到了一个字典,键为: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 }}"
(未测试)