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

Ansible遍历嵌套列表读取SSH公钥文件报错求助

问题解决:Ansible读取多用户多SSH公钥文件报错

错误原因

你遇到的'list' object has no attribute 'startswith'错误,是因为item.ssh_public_keyfiles是列表类型(每个用户对应多个公钥文件名),但file lookup插件仅接受单个字符串文件名作为参数,直接传入列表会导致插件无法处理。

解决方案

以下两种方案均满足你的需求:公钥文件存于files目录,修改文件即可更新公钥,无需改动变量文件。

方案1:直接在授权任务中批量读取公钥

这种方式无需额外的set_fact步骤,直接在authorized_key任务中处理每个用户的所有公钥:

- name: 为用户配置SSH公钥
  authorized_key:
    user: "{{ item.name }}"
    state: "{{ item.state }}"
    key: "{{ item.ssh_public_keyfiles | map('lookup', 'file') | join('\n') }}"
  loop: "{{ provisioning_user }}"
  • 逻辑说明:用map('lookup', 'file')遍历当前用户的所有公钥文件名,批量读取文件内容,再用join('\n')把多个公钥拼接成换行分隔的字符串(authorized_key支持一个用户添加多个公钥)。

方案2:先整理用户-公钥映射关系(适合后续有其他操作场景)

如果需要后续对用户公钥做额外处理,可以先通过set_fact生成结构化的用户-公钥列表:

- name: 读取所有用户的SSH公钥并生成映射列表
  set_fact:
    user_pubkey_map: "{{ user_pubkey_map | default([]) + [{
      'username': item.0.name,
      'state': item.0.state,
      'pubkey': lookup('file', item.1)
    }] }}"
  loop: "{{ provisioning_user | subelements('ssh_public_keyfiles') }}"

- name: 为用户配置SSH公钥
  authorized_key:
    user: "{{ item.username }}"
    state: "{{ item.state }}"
    key: "{{ item.pubkey }}"
  loop: "{{ user_pubkey_map }}"
  • 逻辑说明:用subelements实现嵌套循环,遍历每个用户及其对应的每个公钥文件,读取内容后生成包含用户名、状态、公钥内容的列表,再批量执行授权操作。

内容的提问来源于stack exchange,提问作者en1cc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 06:56:54