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

如何将多文件内容合并到单个Ansible变量?路径问题求助

问题解决:Ansible读取远程密钥文件并合并

警告原因分析

你遇到的Unable to find '/home/adminuser/keys'警告,核心原因是**with_fileglob是在Ansible控制主机上匹配文件路径**,而非目标Ubuntu远程服务器。你的密钥文件存放在远程服务器的/home/adminuser/keys/下,但控制主机没有这个路径,因此触发警告。

解决方案

以下两种方案均可解决路径问题,并实现密钥片段的合并:

方案1:灵活适配任意文件名(推荐)

通过find模块在远程服务器上获取文件列表,按顺序读取后合并:

- name: 远程服务器上查找密钥文件(按文件名排序)
  find:
    paths: /home/adminuser/keys
    patterns: "unseal_key_*"
    sort: yes
  register: key_files

- name: 读取每个密钥文件内容(base64编码避免特殊字符问题)
  slurp:
    src: "{{ item.path }}"
  register: unseal_keys_raw
  loop: "{{ key_files.files }}"

- name: 解码并合并所有密钥片段
  set_fact:
    full_unseal_key: "{{ unseal_keys_raw.results | map(attribute='content') | map('b64decode') | map('trim') | join('') }}"

- name: 输出完整密钥
  debug:
    var: full_unseal_key

关键说明:

  • sort: yes确保按unseal_key_0到unseal_key_4的顺序读取,避免密钥片段顺序错乱。
  • slurp模块安全读取远程文件,返回的base64内容通过b64decode解码,trim去掉每行的换行/空白,join('')拼接成完整字符串。

方案2:简洁版(文件名固定时使用)

直接用Shell命令一次性读取并合并,适合文件名明确且顺序固定的场景:

- name: 读取并合并密钥片段(删除换行符)
  shell: cat /home/adminuser/keys/unseal_key_{0..4} | tr -d '\n'
  register: full_unseal_key_raw

- name: 保存完整密钥为变量
  set_fact:
    full_unseal_key: "{{ full_unseal_key_raw.stdout }}"

- name: 输出结果
  debug:
    var: full_unseal_key

关键说明:

  • cat /home/adminuser/keys/unseal_key_{0..4}按顺序读取所有密钥文件。
  • tr -d '\n'直接删除所有换行符,生成无间隔的完整密钥字符串。

权限注意事项

确保执行Ansible的远程用户对/home/adminuser/keys/目录及下属文件有读权限,如果之前调整过文件/目录的用户权限,需确认权限配置正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:05:23