首页 > 解决方案 > Ansible 任务变量覆盖 set_fact 变量

问题描述

在我的 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 值,而是我不想要的任务值。

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

标签: ansible

解决方案


问:“任务变量覆盖 set_fact 变量”

A: task vars(precedence 17) 在接下来的比赛中不能覆盖set_facts(precedence 19)。请参阅变量优先级:我应该将变量放在哪里?. 查看角色。很可能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

推荐阅读