【问题标题】:Ansible task vars override set_fact varsAnsible 任务变量覆盖 set_fact 变量
【发布时间】:2020-08-26 13:28:42
【问题描述】:

在我的一个 ansible 剧本中,我为所有剧本设置了一个变量:

    set_fact:
      domain_path: "{{ X.X.domain_path }}"

在剧本中,我的一项任务使用了一个角色,该角色需要一个不同于我在开始时定义的 domain_path 变量

 include_role:
    name: role_X
  vars:
    domain_path: "/a/different/path"

当我尝试在角色之后的另一个块中使用 domain_path 时,它没有给我 set_fact 值,而是我不想要的 tasks 值。

如果需要,我可以提供更多详细信息

【问题讨论】:

  • 它对我有用。试试我在答案中发布的简单示例。你的代码或数据肯定有其他问题。
  • 你的代码缩进不对。

标签: ansible


【解决方案1】:

问:“task vars override set_fact vars”

答:task vars(优先级 17)不能覆盖 set_facts(优先级 19)的其余部分。见Variable precedence: Where should I put a variable?。查看角色。很可能 role (and include_role) params(优先级 20)会覆盖该变量。

我无法重现该问题。我创建了一个新角色,只有一项任务

shell> cat roles/role_X/tasks/main.yml
- debug:
    var: domain_path

剧本

shell> cat pb.yml
- hosts: localhost
  tasks:
    - set_fact:
        domain_path: "X.X.domain_path"
    - debug:
        var: domain_path
    - include_role:
        name: role_X
      vars:
        domain_path: "/a/different/path"
    - debug:
        var: domain_path

按预期提供

shell> ansible-playbook pb.yml | grep domain_path
  domain_path: X.X.domain_path
  domain_path: /a/different/path
  domain_path: X.X.domain_path

【讨论】:

  • 确实是我使用的角色。它有一个 domain_path 的 set_fact,它覆盖了我的 set_fact
【解决方案2】:

对于不同的用例使用相同的变量名不是一个好习惯。您应该更改一个(或两个)变量的名称,以免它们发生冲突。

如果有需要,您始终可以使用一个值来设置另一个值,前提是这是您在任务中某个时刻的目标。

【讨论】:

  • 我明白你在说什么,我同意我会改变这一点,但是它不能回答为什么任务级别 var 会覆盖 set_fact 级别 var
猜你喜欢
  • 2018-02-27
  • 1970-01-01
  • 2022-10-21
  • 2019-05-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2020-03-15
相关资源
最近更新 更多