如何使用Ansible结合loop_control.loop_var从服务器获取SSH公钥?
使用Ansible的loop_control.loop_var获取所有用户的SSH公钥
方案一:使用getent模块(推荐,更可靠)
替代手动解析/etc/passwd,用Ansible内置的getent模块安全获取系统用户信息,再遍历收集公钥:
tasks: - name: 拉取系统用户passwd信息 ansible.builtin.getent: database: passwd - name: 遍历用户收集SSH公钥 ansible.builtin.slurp: src: "{{ getent_passwd[target_user][4] }}/.ssh/{{ pubkey_file }}" register: ssh_public_keys loop: "{{ getent_passwd.keys() }}" loop_control: loop_var: target_user with_nested: - "{{ getent_passwd.keys() }}" - [id_rsa.pub, id_ecdsa.pub, id_ed25519.pub] when: - getent_passwd[target_user][4] | length > 0 - ansible.builtin.stat(path="{{ getent_passwd[target_user][4] }}/.ssh/{{ pubkey_file }}").stat.exists - name: 输出收集到的SSH公钥 ansible.builtin.debug: msg: "* 用户 {{ item.item.target_user }} 的{{ item.item.1 }}公钥:\n{{ item.content | b64decode }}" loop: "{{ ssh_public_keys.results }}" when: item is succeeded
方案二:基于你已有的shell命令修改
沿用你最初的用户列表获取方式,添加loop_control.loop_var并完成公钥收集:
tasks: - name: 获取所有用户名 ansible.builtin.shell: "cat /etc/passwd | awk -F: '{print $1}'" register: usersname - name: 获取每个用户的主目录 ansible.builtin.shell: "cat /etc/passwd | grep '^{{ target_user }}' | awk -F: '{print $6}'" register: user_homedirs loop: "{{ usersname.stdout_lines }}" loop_control: loop_var: target_user - name: 遍历用户收集SSH公钥 ansible.builtin.slurp: src: "{{ user_home.stdout }}/.ssh/{{ pubkey_file }}" register: ssh_public_keys loop: "{{ user_homedirs.results }}" loop_control: loop_var: user_home with_nested: - "{{ user_homedirs.results }}" - [id_rsa.pub, id_ecdsa.pub, id_ed25519.pub] when: - user_home.stdout | length > 0 - ansible.builtin.stat(path="{{ user_home.stdout }}/.ssh/{{ pubkey_file }}").stat.exists - name: 输出收集到的SSH公钥 ansible.builtin.debug: msg: "* 用户 {{ item.item.user_home.item }} 的{{ item.item.1 }}公钥:\n{{ item.content | b64decode }}" loop: "{{ ssh_public_keys.results }}" when: item is succeeded
关键说明
loop_control.loop_var用来自定义循环变量名(比如target_user、user_home),避免默认item变量在嵌套循环中冲突。- 使用
slurp模块读取文件,它会返回base64编码内容,通过b64decode可还原原始公钥文本。 when条件过滤无主目录的用户及不存在的公钥文件,避免任务报错。
内容的提问来源于stack exchange,提问作者Gg59
相关产品推荐
相关产品推荐

