使用 Ansible 替换列表占位符

使用 Ansible 替换列表占位符

我有一个非常简单的 ansible 剧本,如下所示:

- hosts: myhost
  tasks:
  - include_vars:
      file: ./resolved.yml

  - name: resolve placeholders
    tags: resolution
    template:
      src: "./placeholders.yml"
      dest: "/tmp/res.yml"

给定以下带有占位符的 YAML:

---
test:
  config: {{ prop.resolveme }}

以及以下机密 YAML 文件:

---
prop:
  resolveme:
    - 8.8.8.8
    - 1.1.1.1
    - 192.168.0.1

解析后的 YAML 文件如下所示:

---
test:
  config: [u'8.8.8.8', u'1.1.1.1', u'192.168.0.1']

(注意:如果我仅使用逗号分隔的列表,它就会按预期工作)。

为什么会发生这种情况?我在 YAML 规范中找不到任何可以解释此行为的内容,所以我认为这一定是 Ansible 解析器所做的事情(似乎与 unicode 有关?)。是否可以使用 Ansible 参数插值来获取我想要的列表结构,还是我应该更喜欢以逗号分隔的项目列表?

答案1

我无法在 Linux 中ansible [core 2.11.6]使用python version = 3.8.5和重现您的问题jinja version = 3.0.1。请尝试显式转换为细绳.下面的模板

---
test:
  config: {{ prop.resolveme }}
  config: {{ prop.resolveme|map('string') }}

给出

---
test:
  config: ['8.8.8.8', '1.1.1.1', '192.168.0.1']
  config: ['8.8.8.8', '1.1.1.1', '192.168.0.1']

如果这没有帮助,你可以尝试暴力破解

---
test:
    config: [{% for i in prop.resolveme %}'{{ "%s"|format(i) }}'{% if not loop.last %}, {% endif%}{% endfor %}]

相关内容