如何使用Ansible将文本块替换为本地文件内容?
用Ansible Replace模块读取本地文件内容完成替换
当然可以实现!不用硬写一大段字面量,用Ansible的lookup插件就能轻松把本地文件内容作为替换值传入replace模块,这里给你几种实用的方案:
方案1:直接读取控制节点的本地文件(最常用)
如果要读取的文件在运行Ansible的控制节点上,直接用file lookup插件就行,它会把文件内容直接插入到replace的参数里:
- name: Fixing client_encryption_options in cassandra.yaml replace: path: '{{ tmpBase }}/cassandra.yaml' regexp: '(client_encryption_options:[\s\S]*)CBC_SHA]\n^$' replace: '\1{{ lookup("file", "/path/to/your/local/file.txt") }}'
这里的\1是保留正则匹配到的第一个分组(也就是client_encryption_options:开头的那段前缀),然后接上你本地文件里的内容,完美替代硬编码的字面量。
方案2:处理含特殊字符的文件内容
如果你的文件里包含正则相关的特殊字符(比如\、$、*),直接插入可能会干扰replace的正则逻辑,这时候加上regex_escape过滤器转义就行:
- name: Fixing client_encryption_options with escaped content replace: path: '{{ tmpBase }}/cassandra.yaml' regexp: '(client_encryption_options:[\s\S]*)CBC_SHA]\n^$' replace: '\1{{ lookup("file", "/path/to/your/local/file.txt") | regex_escape }}'
方案3:读取目标节点上的文件
如果要读取的文件在被管理的目标节点上,那就先用slurp模块读取文件内容(它会返回base64编码后的内容),再解码后传入replace:
- name: Get content from target node's file slurp: src: '/path/on/target/machine/config_snippet.txt' register: target_file_data - name: Fixing client_encryption_options using target node file replace: path: '{{ tmpBase }}/cassandra.yaml' regexp: '(client_encryption_options:[\s\S]*)CBC_SHA]\n^$' replace: '\1{{ target_file_data.content | b64decode }}'
这样不管文件在控制节点还是目标节点,都能轻松实现用文件内容替换文本块的需求啦!
内容的提问来源于stack exchange,提问作者Jim Wartnick
相关产品推荐
相关产品推荐

