如何将多文件内容合并到单个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
相关产品推荐
相关产品推荐

