Ansible中如何用主机专属文件优先替代角色默认文件?
Ansible实现主机专属文件优先覆盖角色文件
不用写三个繁琐任务,有两种更简洁的方式实现你要的逻辑:主机专属文件存在就用它,不存在就 fallback 到角色默认文件。
方法一:单任务用first_found lookup自动匹配
直接在copy任务里指定搜索优先级,Ansible会自动找第一个存在的文件:
- name: 优先复制主机专属文件 copy: src: "{{ lookup('first_found', params) }}" dest: /目标路径/你的文件名 vars: params: files: - "{{ inventory_hostname }}/你的文件名" - "roles/你的角色名/files/你的文件名" paths: - files
逻辑很直白:先查files/主机名/下的目标文件,找到就用;找不到就用角色默认的roles/你的角色名/files/里的文件,完全对应主机变量覆盖角色变量的优先级。
方法二:全局配置搜索路径(一劳永逸)
如果想让所有文件复制都遵循这个规则,直接改ansible.cfg的默认搜索路径:
[defaults] files_search_path = ./files/{{ inventory_hostname }}:./files:./roles/*/files
路径用冒号分隔,越靠前优先级越高:
- 优先找
files/主机名/下的文件 - 其次是全局
files/目录 - 最后才是各个角色的
files/目录
之后任务里直接写文件名就行,Ansible会自动按配置顺序找:
- name: 自动按优先级复制文件 copy: src: 你的文件名 dest: /目标路径/你的文件名
注意点
- 只要
files/主机名/目录存在就行,里面不用放所有文件,不存在的文件会自动用角色默认的 - 全局配置时别搞反路径顺序,不然优先级就错了
- 这两种方式都能替代你原来的三个任务,更简洁还符合Ansible的设计逻辑
内容的提问来源于stack exchange,提问作者Andrius
相关产品推荐
相关产品推荐

