【问题标题】:ansible parameterised ini lookup in jinja2 templatejinja2模板中的ansible参数化ini查找
【发布时间】:2017-09-29 15:01:18
【问题描述】:

我正在尝试使用 ansible 来获取一个简单的 yaml 文件的内容并将它们模板化为一个更复杂的文件(.kitchen.yml 用于测试厨房,碰巧)

我的配置文件是这样的

test_platforms:
  - ubuntu-16.04
  - ubuntu-14.04

我想将其传递给.kitchen.yml,并让{{ test_platforms }} 中的键与特定图像相关联,例如

......
platforms:
  - name: ubuntu-16.04
    driver_config:
      image: ubuntu:16.04    <--- This is the associated image
      platform: ubuntu
  - name: ubuntu-14.04
    driver_config:
      image: ubuntu:14.04    <--- This is the associated image
      platform: ubuntu
......

我认为我可以通过查找来完成此操作,例如:

platforms:
{% for platform in test_platforms %}
  - name: {{ platform }}       
    driver_config:
      image: {{ lookup('ini', 'test_platforms section=docker file=platforms.ini') }}
      platform: ubuntu
{% endfor %}

...给定一个platforms.ini:

[docker]
ubuntu-16.04=solita/ubuntu-systemd:16.04
ubuntu-14.04=ubuntu-upstart:14.04

我希望我可以使用参数化查找(即“Jinja“for”循环中的“测试平台”将在{{ test platforms }} 变量的值列表中读取,但这似乎不起作用。是有解决这个问题的方法,还是有更好的方法?这似乎是有人已经解决的问题之一,但是我进行的广泛谷歌搜索并没有发现任何东西,而且从文档中似乎并不明显.

【问题讨论】:

  • 我对测试厨房不熟悉。你必须使用platforms.ini吗?您能否将信息放入 ansible 变量文件中?
  • 澄清一下,这是围绕测试厨房的抽象。每次你想将它应用到你想测试的配置管理代码时,都需要添加很多样板配置。我的任务是构建一个可以自动为其他人执行此操作的包装器。

标签: ansible jinja2


【解决方案1】:

我认为您的模板中有一些拼写错误。在以下块中:

platforms:
{% for platform in test_platforms %}
  - name: {{ platform }}       
    driver_config:
      image: {{ lookup('ini', 'test_platforms section=docker file=platforms.ini') }}
      platform: ubuntu
{% endfor %}

有两个问题:(a) 您引用的是 test_platforms(平台列表)而不是 platform(您的循环变量),以及 (b) 您实际上并没有替换 @ 的值987654324@ 变量进入查找表达式。试试这个:

platforms:
{% for platform in test_platforms %}
  - name: {{ platform }}       
    driver_config:
      image: {{ lookup('ini', platform + ' section=docker file=platforms.ini') }}
      platform: ubuntu
{% endfor %}

如果我在一个名为 input.yml 的文件中有它并且我使用这个剧本:

- hosts: localhost
  vars:
    test_platforms:
      - ubuntu-16.04
      - ubuntu-14.04
  tasks:
    - template:
        src: ./input.yml
        dest: ./output.yml

我得到输出:

platforms:
  - name: ubuntu-16.04       
    driver_config:
      image: solita/ubuntu-systemd:16.04
      platform: ubuntu
  - name: ubuntu-14.04       
    driver_config:
      image: ubuntu-upstart:14.04
      platform: ubuntu

【讨论】:

  • 非常感谢!我花了将近一整天的时间试图让这个工作!我知道你不应该在 Stack Overflow 上这样做,但我非常感激!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多