Ansible:如果有多个 'extra_vars' 文件,变量 order/precedence 是什么?

Ansible: What is the variable order/precedence in case of multiple 'extra_vars' files?

在这个关于“”的老问题中,原发布者回答了这个问题,说多个 vars 文件可以通过使用多个 --extra-vars 参数来完成。

我的后续问题是,在这种情况下,ansible-playbook 命令行有两个 --extra-vars 参数,每个参数指向不同的文件,顺序或优先级是什么那些文件?

此外,如果两个文件中的变量名称相同(例如,my_host)会怎样?

例如,假设我有 2 个文件,extraVars1.ymlextraVars2.yml,在 ansible-playbook 命令行中我有:

ansible-playbook... --extra-vars "@extraVars1.yml" --extra-vars "@extraVars2.yml"

并且 extraVars1.yml 文件有:

my_host: 1.2.3.4

并且 extraVars2.yml 文件有:

my_host: 5.6.7.8

当剧本为 运行 时,my_host 变量的值是多少?

谢谢! 吉姆

根据有关 使用变量Understanding variable precedence

的 Ansible 文档

extra vars (for example, -e "user=my_user") (always win precedence)

In general, Ansible gives precedence to variables that were defined more recently ...

这意味着最后定义的获胜。

让我们在这里用 vars.yml 剧本做一个简短的测试。

---
- hosts: localhost
  become: false
  gather_facts: false

  vars:

    my_host: 9.0.0.0

  tasks:

  - name: Show value
    debug:
      msg: "{{ my_host }}"

ansible-playbook vars.yml 的执行将导致输出

TASK [Show value] ***
ok: [localhost] =>
  msg: 9.0.0.0

ansible-playbook -e "@extraVars1.yml" vars.yml 的执行将导致输出

TASK [Show value] ***
ok: [localhost] =>
  msg: 1.2.3.4

ansible-playbook -e "@extraVars1.yml" -e "@extraVars2.yml" vars.yml 的执行将导致输出

TASK [Show value] ***
ok: [localhost] =>
  msg: 5.6.7.8

ansible-playbook -e "@extraVars2.yml" -e "@extraVars1.yml" vars.yml 的执行将导致输出

TASK [Show value] ***
ok: [localhost] =>
  msg: 1.2.3.4