【问题标题】:Loop on list and dictionary循环列表和字典
【发布时间】:2021-02-02 09:17:17
【问题描述】:

我不明白如何在我的脚本中使用loop

我想循环执行我的任务 vswitch (VS_VMKERNEL) 和我的主机列表 (hostname),但我系统性地出现了语法错误。

我需要在 VS VMKERNEL 上循环,因为我想将此任务用于许多不同的 vswitch 和主机

错误是

致命:[本地主机]:失败! => {"msg": "该任务包含一个带有未定义变量的选项。错误是:'str object' has no attribute '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

【问题讨论】:

  • 你的脚本是什么,请在问题中包含它,以及你的错误信息是什么?

标签: python loops ansible


【解决方案1】:

好吧,既然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 }}"

【讨论】:

  • 非常感谢您的帮助。我还不清楚我的问题。我需要在 VS VMKERNEL 上循环,因为我想将此任务用于许多不同的 vswitch 和主机。
【解决方案2】:

我发现有一个“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}}"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 2017-12-04
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    相关资源
    最近更新 更多