可靠的任务变量覆盖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值,而是给我tasks值,这是我不想要的。

如果需要,我可以提供更多细节

Q:"任务变量覆盖set_fact变量">

A:task vars(优先级17(不能在播放的其余部分覆盖set_facts(优先级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

对于不同的用例使用相同的变量名不是一种好的做法。您应该更改其中一个(或两个(变量的名称,这样它们就不会冲突。

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

最新更新