循环列表和字典

时间:2021-02-02 09:17:17

标签: python loops ansible

我不明白如何将 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

2 个答案:

答案 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}}"