Ansible 导入和包含角色在变量优先级方面的差异

Ansible 导入和包含角色在变量优先级方面的差异,ansible,Ansible,我在group\u vars/all.yml中定义了一个变量var\u all,在roles/./vars/main.yml中定义了另一个变量variables\u role\u var1。在剧本中使用import\u role和include\u role覆盖它们似乎遵循不同的优先规则,并产生不同的值 我假设第一个角色块将输出以下调试消息: "msg": "var_for_all = From group_vars/all.yml, variables_role_var1 = from rol

我在
group\u vars/all.yml
中定义了一个变量
var\u all
,在
roles/./vars/main.yml
中定义了另一个变量
variables\u role\u var1
。在剧本中使用
import\u role
include\u role
覆盖它们似乎遵循不同的优先规则,并产生不同的值

我假设第一个角色块将输出以下调试消息:

"msg": "var_for_all = From group_vars/all.yml, variables_role_var1 = from role vars/ dir"
但将输出作为:

"msg": "var_for_all = From playbook import_role_test2, variables_role_var1 = from role vars/ dir"
有人能解释一下我的行为吗?如果我遗漏了什么,能告诉我吗? 已经彻底检查过了,而且

我的剧本

- hosts: localhost
  gather_facts: no
  tasks:
    - name: import_role_test1
      import_role:
        name: variables
        tasks_from: precedence

    - name: import_role_test2
      import_role:
        name: variables
        tasks_from: precedence
      vars: 
        var_for_all: From playbook import_role_test2
        variables_role_var1: From playbook import_role_test2

    - name: include_role_test3
      include_role:
        name: variables
        tasks_from: precedence
      vars: 
        var_for_all: From playbook import_role_test3
        variables_role_var1: From playbook import_role_test3

我无法重现结果。请参阅该行下面的代码和结果

  • 测试3的结果可以用“任务变量(仅针对任务)”的形式来解释

  • 试验2的结果也可以用优先级17来解释。“任务变量(仅针对任务)”的定义

  • 测试1中“变量\角色\变量1”的结果可以用优先级15来解释。“角色变量(在role/vars/main.yml中定义)”。我无法解释测试1中“var_for_all”的结果。这可能是Ansible的问题。第一个和第二个测试都导入角色,“Ansible在剧本解析期间预处理所有静态导入。”


给予


当主机显式扩展变量时,情况可能会发生变化

shell> cat roles/variables/tasks/precedence.yml 
- set_fact:
    var_for_all: "{{ var_for_all }}"
    variables_role_var1: "{{ variables_role_var1 }}"
- debug:
    msg:
      - "{{ var_for_all }}"
      - "{{ variables_role_var1 }}"
给予


我认为问题比较简单:

所有在初始化时运行的
import.*
语句和任何类型的
vars
(*)也将被初始化,无论它是否存在失败条件或跳过实际执行的任何情况

(*)例如:
vars/main.yml
导入任务的文件或
import\u角色的
vars
属性

  • 一个非常简单的例子:
    -调试:
    变量:foo
    -何时:假
    导入用户角色:
    姓名:任何职位
    变量:
    福:“樱桃”
    
  • 结果是:
    TASK [fun : debug] ******************************************************************
    task path: roles/fun/tasks/main.yml:1
    ok: [test.local] => {
        "foo": "Cherry"
    }
    

(这就是为什么我将“我的全部
导入”角色替换为
包含\u角色的原因)

谢谢。你得到了我得到的确切结果。我认为存在一些问题。有关信息。显然,这是一个bug还是缺少文档还没有决定。我认为这是一个bug。在计算时,变量值的变化是不可接受的,例如,
var\u for_all:“{{var\u for_all}}”
。请参阅更新的test2。有。
shell> cat roles/variables/tasks/precedence.yml 
- set_fact:
    var_for_all: "{{ var_for_all }}"
    variables_role_var1: "{{ variables_role_var1 }}"
- debug:
    msg:
      - "{{ var_for_all }}"
      - "{{ variables_role_var1 }}"
    "msg": [
        "From playbook import_role_test2",
        "From roles/variables/vars/main.yml"
    ]

    "msg": [
        "From playbook import_role_test2",
        "From roles/variables/vars/main.yml"
    ]

    "msg": [
        "From playbook import_role_test3",
        "From playbook import_role_test3"
    ]
TASK [fun : debug] ******************************************************************
task path: roles/fun/tasks/main.yml:1
ok: [test.local] => {
    "foo": "Cherry"
}