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

yaml syntax error when defining variables using WHEN

我在 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 的冒号后添加 space 时,错误变为:

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

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

您使用 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 行,它们是序列项中包含的映射的键。

有人在 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

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