Ansible Yaml锚和Jinja2模板

时间:2019-03-21 01:25:02

标签: ansible yaml jinja2

如何在不对磁盘数量进行硬编码的情况下覆盖磁盘属性?

这是我想要的(该角色的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:
    (...)

1 个答案:

答案 0 :(得分:0)

<<的文档,Merge Key Language Independent Type指出:

  

“ <<”合并键用于指示应将一个或多个指定映射的所有键插入当前映射。

但是您可以在序列而不是map上指定锚点new-disk

您可能想做:

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

您似乎想从size_gb: 1000中选择item,但是由于引号不在jinja2语法之外,因此替换(如果可行)将导致:

  - <<: *new_disk
    'size_gb: 1000'

要使其正常工作,必须:

  - <<: *new_disk
    size_gb: 1000

所以请确保您除去那些引号。

考虑到您的商品,使用item.disk[0]进行的选择也很奇怪,我本来希望像item.vms.usage001.disk[0]这样的东西,但这可能是我缺乏jinja2的专门知识。