能否用slurp直接替代lookup?Ansible远程文件读取疑问
关于Ansible远程读取文件替代lookup的方案
不存在直接替代lookup('file')的远程版本——所有Ansible lookup插件都是在**控制节点(本地)**执行的,没有原生的"远程lookup"机制来直接在模板中读取目标主机的文件内容。
优化现有方案的思路
虽然必须通过远程任务获取文件内容,但可以把处理逻辑集中在任务中,让模板只负责渲染变量,避免逻辑拆分过散:
方案1:直接用command提取DNS地址
任务代码:
tasks: - name: 提取远程主机的DNS服务器地址 command: grep -oE '\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b' /etc/resolv.conf register: dns_server changed_when: false # 标记任务无状态变更
模板文件foo.cfg.j2:
nameserver dns1 {{ dns_server.stdout }}:53
方案2:用slurp+set_fact预处理内容
如果需要保留文件读取的通用性(比如后续要处理其他内容),可以在任务中完成解码和正则提取:
tasks: - slurp: src: /etc/resolv.conf register: slurpfile - set_fact: dns_server: "{{ slurpfile.content | b64decode | regex_search('\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b') }}"
模板文件foo.cfg.j2:
nameserver dns1 {{ dns_server }}:53
额外说明
如果确实想实现类似"远程lookup"的语法,可以自定义Ansible lookup插件,但这需要编写Python代码,复杂度远高于上述方案,一般不推荐。Ansible的设计逻辑就是:远程主机的操作通过任务模块执行,结果通过变量传递给模板渲染。
内容的提问来源于stack exchange,提问作者puravidaso
相关产品推荐
相关产品推荐

