使用WHEN定义变量时出现yaml语法错误

时间:2016-10-26 13:38:33

标签: yaml ansible-playbook

我在defaults / main.yml中定义了这些:

- mode : production

- consul_server_address :192.168.1.5
  when : mode == "production"

- consul_server_address :192.168.2.5
  when : mode == "staging"

但我得到了:

The offending line appears to be:

- consul_server_address : 192.168.1.5
  when : mode == "production"
       ^ here

当我在consul_server_address上的冒号后添加空格时,错误将更改为:

ERROR! The default/main.yml file for role 'dnsmasq' must contain a dictionary of 
variables

我花了一些时间在yaml语法上,但我认为这个想法是错误的,我应该使用另一个ansible-playbook解决方案。

2 个答案:

答案 0 :(得分:1)

你用:

开始你的YAML
- mode : production

-表示序列项,因此该行定义YAML文档的根元素是序列。另一个序列项如下:

- consul_server_address : 192.168.1.5

但现在,有一行一个序列项:

when : mode == "production"

这是无效的,因为我们处于缩进级别0,它包含根元素,它是一个序列,可能只包含序列项。但when : …是映射密钥,因此非法。

您可能想要做的是:

- mode : production

- consul_server_address : 192.168.1.5
  when : mode == "production"

- consul_server_address : 192.168.2.5
  when : mode == "staging"

通过正确缩进when行,它们是序列项中包含的映射的键。

答案 1 :(得分:1)

Ansible的IRC频道有人建议我为此目的使用groupvars/hostvars

我编辑了我的hosts广告资源文件并做了类似的事情:

[nginx-staging]
IP_ADDRESS OR FQDN  

[nginx-staging:vars]
...
consul_server_address=192.168.2.5


[nginx-production]
IP_ADDRESS OR FQDN

[nginx-production:vars]
...
consul_server_address=192.168.1.5

它为我提供了一个更简单,更直接的解决方案。