我有一个类似于下面的剧本,它使用基本访问控制列表变量。我们假设base_acl: "默认acl.j2。我有一个主机,我想使用不同的基本访问控制列表价值。我看过了ansible 优先级文档,除了使用之外没有其他方法可以做到这一点--额外变量在命令行上,我不想这么做。
我尝试定义基本访问控制列表在一个主机变量文件(根据上面的链接应该具有更高的优先级?)对于有问题的主机,然而运行时该剧本仍然会打印“playbook”作为变量值。
有没有办法告诉 ansible 给予主机变量优先于剧本变量?
---
- hosts: all
gather_facts: no
vars:
base_acl : "playbook"
tasks:
- debug: msg="variable is {{ base_acl }}"
答案1
我已经尝试在 host_vars 文件中为相关主机定义 base_acl(根据上面的链接应该具有更高的优先级?),但是在运行时,play 仍然会为变量值打印“playbook”。
从您在问题中引用的链接:
...
8 - 库存文件或脚本主机变量
9 - 库存 host_vars/*
10 - 剧本 host_vars/*
11 - 主机事实/缓存的 set_facts
12 - 游戏变量
...
22 - 额外变量(例如,-e“user=my_user”)(始终优先)
因此,由于数字最高的获胜,并且所有主机相关条目(8 到 11)的数字都小于 12,因此您的陈述实际上是错误的。唯一正确的评估是,额外的变量始终会覆盖所有内容。
实际上有很多方法可以实现您的目标。但是对于您的情况,我会这样做。
- 删除剧本中的 play var 条目
- 输入默认值
group_vars/all.yml
(在库存或剧本级别):base_acl: "playbook"
- 覆盖每个相关主机的默认值
host_vars/<your_host>.yml
(无论是在库存还是剧本级别):base_acl: "override value"
请注意,上述方法也可以覆盖特定组的默认值group_vars/<your_group>.yml
(无论是在库存还是剧本级别)。