如何向已存在的setup.yaml文件中追加变量?Ansible当前方案无效,能否使用copy模块实现?
使用Ansible向已有YAML文件追加变量的正确方案
首先得说清楚:你原来的playbook思路走偏啦!set_fact+combine的方式只能合并内存里的字典对象,根本没法直接把变量写入到物理的YAML文件里,这就是它失效的原因。
回到你的问题:完全可以用copy模块实现需求,但得搭配slurp模块先读取原文件内容,合并后再写回去,具体步骤和完整playbook如下:
实现思路
- 用
slurp模块读取已有YAML文件的内容,把它转换成Ansible能处理的字典格式 - 用
combine过滤器将原文件的字典和你要追加的新变量合并(注意要处理你给的ip和kind里的多余空格) - 用
copy模块把合并后的字典重新转换成YAML格式,覆盖写入原文件
完整可运行的Playbook
- hosts: localhost connection: local vars: yaml_path: "/home/user/setup.yaml" # 清理掉变量里的多余空格,避免写入文件后格式混乱 new_vars: ip: "10.x.x.0" kind: "public" tasks: - name: 读取已有YAML文件内容 slurp: path: "{{ yaml_path }}" register: existing_yaml_content - name: 将读取到的内容转换为字典 set_fact: existing_yaml_dict: "{{ existing_yaml_content.content | b64decode | from_yaml(default={}) }}" - name: 合并原有字典和新变量 set_fact: final_yaml_dict: "{{ existing_yaml_dict | combine(new_vars) }}" - name: 将合并后的字典写入原YAML文件 copy: content: "{{ final_yaml_dict | to_yaml }}" dest: "{{ yaml_path }}"
额外注意事项
- 我在转换原文件内容时加了
default={},如果原YAML文件是空的也不会报错 combine默认会用新变量覆盖原文件中同名的key,如果想保留原变量不被覆盖,改成existing_yaml_dict | combine(new_vars, replaced=False)即可- 记得保持YAML格式的规范性,避免因为多余空格、缩进问题导致文件失效
内容的提问来源于stack exchange,提问作者Sandeep
相关产品推荐
相关产品推荐

