如何在Ansible任务中使用Jinja2创建的数组配置VMware磁盘
问题:通过数组动态生成vmware_guest模块的磁盘配置
现有变量
定义了如下数组,用于控制虚拟机磁盘的数量与大小:
vm_disk_gb: - sda: 50 - sdb: 30 - sdc: 50
期望的磁盘配置格式
希望在vmware_guest模块中生成以下格式的磁盘配置:
disk: - size_gb: "50" type: "eagerzeroedthick" datastore: "s1p1d2-vSAN" - size_gb: "30" type: "eagerzeroedthick" datastore: "s1p1d2-vSAN" - size_gb: "50" type: "eagerzeroedthick" datastore: "s1p1d2-vSAN" networks: ...
尝试过的错误写法
曾尝试通过拼接字符串生成磁盘配置,但未成功:
vmware_guest_disks: "[{ (% for vm_disk in {{ vm_disk_gb }} %) 'size_gb':'{{ vm_disk_gb[vm_disk] | default(50) }}', 'type': 'eagerzeroedthick'. 'datastore': 's1p1d2-vSAN' (% endfor %)}]"
并在模块中引用:
disk: "{{ vmware_guest_disks }}" networks:
错误原因
- 错误地将Jinja2循环放在字符串中,导致Ansible无法正确解析语法
- 循环标签使用了
(% ... %),正确的Jinja2循环标签应为{% ... %} - 字典项结尾用了句号(
.)而非逗号(,),语法错误 - 循环变量引用错误:
vm_disk是列表中的单键字典,不能直接作为vm_disk_gb的索引
正确解决方案
直接在vmware_guest模块的disk参数中使用Jinja2循环生成磁盘项,无需提前拼接字符串:
- name: 创建VMware虚拟机 vmware_guest: hostname: "{{ vcenter_hostname }}" username: "{{ vcenter_username }}" password: "{{ vcenter_password }}" validate_certs: false name: "{{ vm_name }}" guest_id: centos7_64Guest disk: {% for disk in vm_disk_gb %} - size_gb: "{{ disk.values() | first }}" type: "eagerzeroedthick" datastore: "s1p1d2-vSAN" {% endfor %} networks: - name: "{{ vm_network }}" # 其他网络配置项 state: poweredon
说明
disk.values() | first用于提取每个单键字典中的磁盘大小值(如从{sda:50}中取出50)- 如果需要基于磁盘名做默认值处理,可调整为:
或者保留磁盘名的引用逻辑:size_gb: "{{ (disk.values() | first) | default(50) }}"{% set disk_name = disk.keys() | first %} size_gb: "{{ vm_disk_gb | selectattr(disk_name, 'defined') | map(attribute=disk_name) | first | default(50) }}"
内容的提问来源于stack exchange,提问作者Isabella
相关产品推荐
相关产品推荐

