如何覆盖 ansible playbook 变量?

如何覆盖 ansible playbook 变量?

我有一个类似于下面的剧本,它使用基本访问控制列表变量。我们假设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,因此您的陈述实际上是错误的。唯一正确的评估是,额外的变量始终会覆盖所有内容。

实际上有很多方法可以实现您的目标。但是对于您的情况,我会这样做。

  1. 删除剧本中的 play var 条目
  2. 输入默认值group_vars/all.yml(在库存或剧本级别):
    base_acl: "playbook"
    
  3. 覆盖每个相关主机的默认值host_vars/<your_host>.yml(无论是在库存还是剧本级别):
    base_acl: "override value"
    

请注意,上述方法也可以覆盖特定组的默认值group_vars/<your_group>.yml(无论是在库存还是剧本级别)。

相关内容