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
相关产品推荐
相关产品推荐

