我在with_dict模块

时间:2019-07-17 19:07:39

标签: ansible

我正在尝试使用Ansible自动化VMware版本。我期望工作流引擎输出一个文件,该文件将充当var_file并具有可用于使用vmware_guest模块构建VM的所有对象。直到您到达该模块的网络词典部分,然后它分崩离析,它才有效。

我最初尝试使用所有这样的变量来设置vars_file:

---
validate_certs: no
datacenter: this is the DC
cluster: this is the cluster
folder: "this is the folder"
name: some-server
template: template-name
datastore: "datastore-name"
netname: This is the network
ip: 10.6.6.10
netmask: 255.255.255.0
gateway: 10.6.6.1
mac: aa:bb:dd:aa:00:14
domain: domain.com

但是,返回了:

argument networks is of type <type 'dict'> and we were unable to convert to list: <type 'dict'> cannot be converted to a list"}

代码失败的地方是此任务:

- name: Clone a virtual machine from Windows template and customize
  vmware_guest:
    hostname: "{{ hostname }}"
    username: "{{ username }}"
    password: "{{ password }}"
    validate_certs: "{{ validate_certs }}"
    datacenter: "{{ datacenter }}"
    cluster: "{{ cluster }}"
    folder: "{{ folder }}"
    name: "{{name }}"
    template: "{{ template }}"
    datastore: "{{ datastore}}"
    networks:
      name: "{{ netname }}"
      ip: "{{ ip }}"
      netmask: "{{ netmask }}"
      gateway: "{{ gateway }}"
      mac: "{{ mac }}"
      domain: "{{ domain }}"```

我试图像这样在变量文件中创建字典:

---
validate_certs: no
datacenter: this is the DC
cluster: this is the cluster
folder: "this is the folder"
name: some-server
template: template-name
datastore: "datastore-name"
bnetworks:
 name: This is the network
 ip: 10.6.6.10
 netmask: 255.255.255.0
 gateway: 10.6.6.1
 mac: aa:bb:dd:aa:00:14
 domain: americas.global-legal.com

并将任务更改为包括以下内容:

networks:
  name: "{{ item.value.name }}"
  ip: "{{ item.value.ip }}"
  netmask: "{{ item.value.netmask }}"
  gateway: "{{ item.value.gateway }}"
  mac: "{{ item.value.mac }}"
  domain: "{{ item.value.domain }}"
  with_dict: bnetworks```

我收到此错误:

The task includes an option with an undefined variable. The error was: 'item' is undefined

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

  

参数网络的类型为<type 'dict'>,我们无法转换为列表:无法转换为列表“}

一个VM中可能有更多网络,因此需要一个列表。 corect语法如下

- name: Clone a virtual machine from Windows template and customize
  vmware_guest:
    hostname: "{{ hostname }}"
    username: "{{ username }}"
    password: "{{ password }}"
    validate_certs: "{{ validate_certs }}"
    datacenter: "{{ datacenter }}"
    cluster: "{{ cluster }}"
    folder: "{{ folder }}"
    name: "{{name }}"
    template: "{{ template }}"
    datastore: "{{ datastore}}"
    networks:
      - name: "{{ netname }}"
        ip: "{{ ip }}"
        netmask: "{{ netmask }}"
        gateway: "{{ gateway }}"
        mac: "{{ mac }}"
        domain: "{{ domain }}"```

这是一个列表

list:
  - key: value

这是一本字典

dictionary:
  key: value

这是词典列表

dictionary:
  - key1: value-1-1
    key2: value-2-1
  - key1: value-2-1
    key2: value-2-2

  

任务包括带有未定义变量的选项。错误是:“ item”未定义

with_dict 的缩进是错误的。正确的语法如下。

vmware_guest:
  ...
  networks:
    - name: "{{ item.value.name }}"
      ip: "{{ item.value.ip }}"
      netmask: "{{ item.value.netmask }}"
      gateway: "{{ item.value.gateway }}"
      mac: "{{ item.value.mac }}"
      domain: "{{ item.value.domain }}"
with_dict: "{{ bnetworks }}"