我不明白如何将 loop
用于我的脚本。
我想循环我的任务 vswitch
(VS_VMKERNEL
) 和我的主机列表 (hostname
),但我有一个系统性的语法错误。
我需要在 VS VMKERNEL 上循环,因为我想将此任务用于许多不同的 vswitch 和主机
错误是
<块引用>致命:[本地主机]:失败! => {"msg": "该任务包含一个带有未定义变量的选项。错误是:'str object' 没有属性 'name'\n\n错误似乎在 '/root/dev-ansible/tasks /LAB-010-Vswitch.yml':第 1 行,第 3 列,但可能\n位于文件中的其他位置,具体取决于确切的语法问题。\n\n有问题的行似乎是:\n\n\n- 名称:添加 Vswitch VMKERNEL\n ^ 这里\n"}
#task######################################
- name: Adding Vswitch VMKERNEL
vmware_vswitch:
hostname: '{{ item.1 }}'
username: '{{ useresxi }}'
password: '{{ passesxi }}'
switch: "{{ item.0.name }}"
nics: "{{ item.0.uplink1|default(omit)}}"
nics: "{{ item.0.uplink2|default(omit)}}"
mtu: "{{ item.0.mtu }}"
validate_certs: no
delegate_to: localhost
loop: "{{ VS_VMKERNEL|product(hostname)|list }}"
#loop: "{{ VS_VMKERNEL|subelements('hostname') }}"
#loop: "{{ VS_VMKERNEL|product(hostname)|list }}"
#loop: "{{ VS_VMKERNEL|dictsort('hostname') }}"
#vars################################################
# ESXI Infra
hostname:
- '192.168.218.50'
- '192.168.218.51'
useresxi: root
passesxi: "-------"
#vswitch base
VS_VMKERNEL:
name: VS-VMKERNEL
uplink2: vmnic5
mtu: 1500
答案 0 :(得分:0)
好吧,由于 VS_VMKERNEL
是一个简单的字典,而不是字典列表或列表字典,您可以按原样使用它,无需在它和 hostname
列表之间使用组合。
这个任务应该做:
- name: Adding Vswitch VMKERNEL
vmware_vswitch:
hostname: '{{ item }}'
username: '{{ useresxi }}'
password: '{{ passesxi }}'
switch: "{{ VS_VMKERNEL.name }}"
nics: "{{ VS_VMKERNEL.uplink1 | default(omit) }}"
nics: "{{ VS_VMKERNEL.uplink2 | default(omit) }}"
mtu: "{{ VS_VMKERNEL.mtu }}"
validate_certs: no
delegate_to: localhost
loop: "{{ hostname }}"
答案 1 :(得分:0)
我发现“with_nested”有效!但是列表中有变量。
我的实际解决方案
- name: Add a VMware vSwitch with multiple NICs
community.vmware.vmware_vswitch:
hostname: "{{ item[1]}}"
username: "{{ esxi_username }}"
password: "{{ esxi_password }}"
switch: "{{ item[0].name }}"
nics: "{{ item[0].nic1|default(omit)}}"
nics: "{{ item[0].nic2|default(omit)}}"
mtu: "{{ item[0].mtu }}"
number_of_ports: 2
validate_certs: no
delegate_to: localhost
loop: "{{vs|product(hostname)|list}}"