You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 23:43:25