首页 > 解决方案 > 带有 Ansible Tower 调查的 Ansible vmware_guest 可选磁盘

问题描述

我有一本用于从 VMware ESXi 6.7 中的模板创建 VM 的剧本。我的剧本在下面。如果 DISK1_SIZE_GB 变量 > 0,我只想配置第二个(以及可能的后续)磁盘。这不起作用。我也尝试过使用'when:DISK1_SIZE_GB is defined',但没有成功。我在 Ansible Tower 中使用调查,第二个磁盘配置是可选答案。在这种情况下,我得到一个关于 0 是无效磁盘大小的错误,或者当我检查变量定义时,我得到一个关于 DISK1_SIZE_GB 未定义的错误。无论哪种方式,“何时”条件似乎都不起作用。如果我对大小进行硬编码,就像在第一个“磁盘”条目中一样,它可以正常工作..如果我从 Ansible Tower 输入有效大小,它也是一样的。我不需要配置额外的磁盘,除非在 Tower 调查中定义了大小。


---
- name: Create a VM from a template
  hosts: localhost
  gather_facts: no
  tasks:
  - name: Clone a template to a VM
    vmware_guest:
      hostname: "{{ lookup('env', 'VMWARE_HOST') }}"
      username: "{{ lookup('env', 'VMWARE_USER') }}"
      password: "{{ lookup('env', 'VMWARE_PASSWORD') }}"
      validate_certs: 'false'
      name: "{{ HOSTNAME }}"
      template: RHEL-Server-7.7
      datacenter: Production
      folder: Templates
      state: poweredon
      hardware:
        num_cpus: "{{ CPU_NUM }}"
        memory_mb: "{{ MEM_MB }}"
      disk:
        - size_gb: 20
          autoselect_datastore: true
        - size_gb: "{{ DISK1_SIZE_GB }}"
          autoselect_datastore: true
          when: DISK1_SIZE_GB > 0
      networks:
      - name: "{{ NETWORK }}"
        type: static
        ip: "{{ IP_ADDR }}"
        netmask: "{{ NETMASK }}"
        gateway: "{{ GATEWAY }}"
        dns_servers: "{{ DNS_SERVERS }}"
        start_connected: true
      wait_for_ip_address: yes

标签: linuxansibleredhatvmwareansible-tower

解决方案


AFAIK 这不能在单个任务中完成。when: DISK1_SIZE_GB is defined尽管ifdisk:是一项任务而不是参数,但您走在正确的轨道上。下面是我将如何处理这个问题。

创建两个调查问题:

  • DISK1_SIZE_GB- 整数 - 必填答案 - 强制使用非零最小值,例如 20(因为您正在部署 RHEL)

  • DISK2_SIZE_GB- 整数 - 可选答案 - 没有最小值或最大值

在现有的 vmware_guest 任务中创建磁盘 1:

disk:
  - size_gb: "{{ DISK1_SIZE_GB }}"
    autoselect_datastore: true

创建一个新的vmware_guest_disk任务,该任务随后立即运行并有条件地添加第二个磁盘:

- name: Add second hard disk if necessary
  vmware_guest_disk:
    hostname: "{{ lookup('env', 'VMWARE_HOST') }}"
    username: "{{ lookup('env', 'VMWARE_USER') }}"
    password: "{{ lookup('env', 'VMWARE_PASSWORD') }}"
    validate_certs: 'false'
    name: "{{ HOSTNAME }}"
    datacenter: Production
    folder: Templates
    state: poweredon
    disk:
      - size_gb: "{{ DISK2_SIZE_GB }}"
        autoselect_datastore: true
  when: DISK2_SIZE_GB is defined

推荐阅读