【问题标题】:Ansible yaml anchors and jinja2 templatingAnsible yaml 锚点和 jinja2 模板
【发布时间】:2019-08-11 20:07:05
【问题描述】:

如何在不硬编码磁盘数量的同时覆盖磁盘属性?

这是我希望它(该角色的 tasks/main.yml)执行的操作,但它因语法错误而失败,并且还需要对磁盘数量进行硬编码:

---
- name: anchors
  when: false
  debug:
    new_disk:
      - &new_disk
        size_gb: 80
        type: thin
        datastore: '{{ item.datastore }}'
- name: Deploy usage001 vms
  loop: '{{ vms.usage001 }}
  vmware_guest:
    disk:
      - <<: *new_disk
      - <<: *new_disk
        '{{ item.disk[0] }}'
      - <<: *new_disk
        '{{ item.disk[1] }}

项目的外观:

vms:
  usage001:
    disk:
      - size_gb: 1000
      - size_gb: 600
  usage002:
    (...)

【问题讨论】:

  • 看起来这在 ansible 中是不可能的。我得到了这个解决方法:gist.github.com/agaffney/fe154d6045487c3019c48d6de6e7b179 Tl;Dr: 使用 yaml 块 jinja2 替换发生在该字符串内部,然后使用另一个 jinja2 语句使用 from_yaml 过滤器插入 yaml 字符串。

标签: ansible yaml jinja2


【解决方案1】:

&lt;&lt; 的文档,Merge Key Language Independent Type 声明:

但是您在序列而不是映射上指定锚点new-disk

你可能想这样做:

new_disk: 
  - &new_disk
    size_gb: 80
    type: thin
    datastore: '{{ item.datastore }}'

您似乎想从您的 item 中选择 size_gb: 1000,但由于引号超出了您的 jinja2 语法,因此替换(如果有效)将导致:

  - <<: *new_disk
    'size_gb: 1000'

为了让它发挥作用,它必须是:

  - <<: *new_disk
    size_gb: 1000

所以一定要去掉那些引号。

考虑到您的项目,使用item.disk[0] 的选择似乎也很奇怪,我本来预计会出现item.vms.usage001.disk[0] 之类的东西,但这可能是我缺乏jinja2 特定知识。

【讨论】:

  • 这不是问题。那部分工作正常。问题是,如何整合磁盘列表?来自 jinja2 {{ item.disk }}?作为参考,我的锚语法根据:blog.daemonl.com/2016/02/yaml.html 是有效的
  • 我并不是说您的锚语法不正确。锚点可以放置在任何节点上。合并键的值不正确,因为该键需要一个映射(直接,或更常见的是使用锚定 map 的别名)。您的别名是 sequence,这是错误的,而且您所引用的博客也不是这样做的。无论如何,我不会相信官方 YAML 文档的博客。
  • 好的,公平点。我在上一个回复中只想说的是,即使它不是 official yaml standard,它仍然可以被常见的 yaml 解析器解析并提供正确的输出......
  • 是的,大多数解析器都支持合并键,假设您正确的输入应该可以工作。那么还有什么 jinja2 的东西。我用其他(潜在的)解决方案信息更新了我的答案,但我不知道 jinja2 和 YAML。
  • 关于这个:item.vms.usage001.disk[0],这是特定于 ansible 的东西,yaml 中的循环语句充当循环,vms.usage001 的每个元素都插入到 item 中,就像在 foreach 循环中一样,例如ansible 为每个输入一个接一个地解析该部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多