Ansiblevariables未定义,除非设置为默认值

我正在试图添加一个新的variables到一个现有的充分的Ansible文件,大量使用angular色的git仓库。 所以,无论哪里foo被引用,在下面

 vars_files: - vars/aws.yml - vars/aws-credentials.yml 

我已经添加了新的一行

  - vars/rpm-repo.yml 

我创build了内容为vars/rpm-repo.yml

 --- yum_rpm_dir: https://example.com/repo/noarch 

这个YAML是根据这个答案给出的命令来检查一个文件是否是有效的YAML。

而在roles/foo/tasks/main.yml我已经改变了一个yum任务来安装这个:

 name: "{{ yum_rpm_dir }}/rest-api-{{ rest_api_version }}-1.noarch.rpm" 

(这个明确的URL的目的是解决我们RPM存储库中的一个错误。)

但是我得到:

 fatal: [1.2.3.4]: FAILED! => {"failed": true, "msg": "'yum_rpm_dir' is undefined"} 

所以我想,显然我还没有理解variables如何与Ansible中的angular色交互的复杂性,所以我将它添加为默认值,并且肯定会起作用。

所以我把上面的文件复制到了roles/foo/defaults/main.yml中。

这工作,但它是一个黑客。 把它变成一个variables的重点是它的价值可以被多个angular色使用而不被复制和粘贴。

tl; dr:如何正确设置Ansible中的一个variables,以便它可以被angular色接收?

你没有指定你正在使用哪个版本的ansible ,而且有从1.x到2.x的重要变化。

从在线文档 ,答案

如何正确设置Ansible中的variables以便可以通过angular色来获取?

将会:

在1.x中,优先级如下(最后列出的variables获得优先级):

  • “angular色违约”,失去优先权,最容易被忽视
  • 在库存中定义的variables
  • 有关系统的事实
  • “最重要的一切”(命令行开关,游戏中的variables,包括variables,angular色variables等)
  • 连接variables(ansible_user等)
  • 额外的variables(-e在命令行中)总是赢

在2.x中,优先顺序更具体(最后列出的variables获得优先级):

  • angular色默认值(每个angular色的任务都会看到他们自己angular色的默认值,angular色外部定义的任务会看到最后一个angular色的默认值)
  • 库存variables(库存文件中定义的variables或dynamic库存提供的variables)
  • 库存group_vars
  • 库存host_vars
  • 剧本group_vars
  • playbook host_vars
  • 主机事实
  • 玩瓦尔
  • 玩vars_prompt
  • 玩vars_files
  • 注册增值税
  • set_facts
  • angular色和包括变数
  • 块variables(仅用于块中的任务)
  • 任务variables(仅限于任务)
  • 额外的变数(总是优先)

对特定用例的回答要求您提供var文件的位置(因为它不能从所提供的数据中推断)在目录结构中。 根据放置的文件的位置,它们具有不同的优先级。

我个人更喜欢将group_vars下的数据group_vars (查看首选布局的最佳实践文档),因此我可以将数据分配给主机组,这主要是因为这通常直接映射到angular色。

问题只是我错过了一个使用fooangular色的文件。

foo的引用不是这样的:

  roles: - foo 

但是像这样:

  roles: - { role: foo, rest_api_version: "{{ blah_version }}" } 

所以我忽略了它。 一旦我在fooangular色“调用”之前将相同的引用添加到了vars文件中,它就没有默认文件。