Jinja 模板中的盐粒

Salt grains in Jinja template

我想在 SaltStack 中做一些简单的事情:使用公式管理 /etc/apt/sources.list 文件。这是我的 formula/init.sls 文件中的相关部分:

/etc/apt/sources.list:
  - file.managed:
    - template: jinja
    - source: salt://pkg/files/etc/apt/sources.list
    - user: root
    - group: root
    - mode: 0644

refresh-apt:
  cmd.wait:
    - name: '/usr/bin/apt-get -y update'
    - watch:
      - file: /etc/apt/sources.list

这是文件 pkg/files/etc/apt/sources.list:

{{ pillar['headers']['salt']['file'] }}

deb http://{{ grains['aws_package_zone'] }}.ec2.archive.ubuntu.com/ubuntu/ {{ grains['oscodename'] }} main universe multiverse
deb-src http://{{ grains['aws_package_zone'] }}.ec2.archive.ubuntu.com/ubuntu/ {{ grains['oscodename'] }} main universe multiverse

deb http://{{ grains['aws_package_zone'] }}.ec2.archive.ubuntu.com/ubuntu/ {{ grains['oscodename'] }}-updates main universe multiverse
deb-src http://{{ grains['aws_package_zone'] }}.ec2.archive.ubuntu.com/ubuntu/ {{ grains['oscodename'] }}-updates main universe multiverse

deb http://{{ grains['aws_package_zone'] }}.ec2.archive.ubuntu.com/ubuntu/ {{ grains['oscodename'] }}-backports main universe multiverse
deb-src http://{{ grains['aws_package_zone'] }}.ec2.archive.ubuntu.com/ubuntu/ {{ grains['oscodename'] }}-backports main universe multiverse

deb http://security.ubuntu.com/ubuntu {{ grains['oscodename'] }}-security main universe multiverse
deb-src http://security.ubuntu.com/ubuntu {{ grains['oscodename'] }}-security main universe multiverse

在这种情况下,grains['aws_package_zone'] return 是字符串 us-west-2(或您所在区域的任何代码),grains['oscodename'] 将 return 该版本的 Ubuntu 代号名称:trusty、xenial 等

显然 Salt 不喜欢这样,因为当我尝试 运行 state.highstate 时出现以下错误:

machine.fqdn:
    Data failed to compile:
----------
    ID /etc/apt/sources.list in SLS pkg is not a dictionary

不确定我做错了什么...有什么建议吗?对不起,如果这是基本的。

正如安德鲁在他的评论中提到的,问题在于 /etc/apt/sources.list 定义中的额外“-”:

...
/etc/apt/sources.list:
  - file.managed: <<-- remove this dash; should be just 'file.managed'
    - template: jinja
...