Ansible,默认变量

时间:2019-01-31 12:35:06

标签: ansible

我正在创建一个新角色。在默认的角色目录中,我使用以下内容创建了main.yml

asterisk:
  install: yes
  branch: 16
  user: pbx
  group: pbx
  srcdir: /usr/src/asterisk/
  url: "http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-{{ asterisk.branch }}-current.tar.gz"
  url_sounds: http://downloads.asterisk.org/pub/telephony/sounds/asterisk-core-sounds-en-ulaw-current.tar.gz
  path_sound: /var/lib/asterisk/sounds/en
  mysql_support: no

然后在host_vars中,我创建hostname.yml文件,该文件为具有以下内容的主机定义了特定变量

asterisk:
  install: no

一个没有告诉我的错误是没有定义aterisk.mysql_support。所以问题是,如何正确使用默认变量?

2 个答案:

答案 0 :(得分:0)

在角色中,您可以在main.yml文件中定义公共变量,该文件将默认为源。您可以在各自的yml文件中定义所有非通用变量

答案 1 :(得分:0)

defaults中,您要定义一个asterisk变量,该变量包含一个内部具有各种键/值对的结构。在host_vars中,为该变量定义一个新值。整体上将替换asterisk,而不仅仅是包含的install属性。因此,如果您有使用asterisk中其他属性的任务而未首先检查它们是否已定义,则它们将失败。

因此,在角色中定义默认值时以使其易于使用的方式构造它们很重要。强制剧本在不使用默认值时重新定义asterisk的剧本是否连贯甚至合适?如果是这样,则您当前的设计很好。否则,您可能希望将其拆分为定义几个不同的变量。

在您的情况下也可能发生的一件事(但有必要确保确定角色中的任务),是您不必关心{{ 1}}为asterisk,因为在这种情况下,应该执行这些操作。确保是否还没有为这些任务使用install = no的情况(即使不执行该任务,我也认为when: asterisk.install可能会得到评估,请当心)。您甚至可以将值name时要执行的所有任务放在有条件包含/导入的单独任务文件中。