Сборка виртуальной машины с использованием Ansible Tower, и я хочу иметь возможность создавать дополнительные диски только тогда, когда определены их переменные - PullRequest
0 голосов
/ 20 сентября 2019

В настоящее время я создаю шаблоны игровых книжек Ansible в AWS и VSphere, и я хотел бы иметь возможность определять несколько дополнительных дисков, но только тогда, когда они определены с помощью переменных.

Playbook:

---
- hosts: localhost
  connection: local
  gather_facts: False

  tasks:

  - name: Launch Windows 2016 VM Instance
    vmware_guest:
      validate_certs: no
      datacenter: "{{ vm_datacenter }}"
      folder: "{{ vm_folder }}"
      name: "{{ vm_servername }}"
      state: poweredon
      template: "{{ vm_template }}"
      cluster: "{{ vm_cluster }}"
      disk:
       - size_gb: "{{ vm_disk_size0 | default(80) }}"
         type: "{{ vm_disk_type0 | default(thin) }}"
         datastore: "{{ vm_disk_datastore0 }}"
       - size_gb: "{{ vm_disk_size1 }}"
         type: "{{ vm_disk_type1 }}"
         datastore: "{{ vm_disk_datastore1 }}"
       - size_gb: "{{ vm_disk_size2 }}"
         type: "{{ vm_disk_type2 }}"
         datastore: "{{ vm_disk_datastore2 }}"
       - size_gb: "{{ vm_disk_size3 }}"
         type: "{{ vm_disk_type3 }}"
         datastore: "{{ vm_disk_datastore3 }}"
      hardware:
        memory_mb: "{{ vm_memory_mb | default(8192) }}"
        num_cpus: "{{ vm_num_cpus | default(4) }}"
      networks:
      - name: "{{ vm_network }}"
        start_connected: yes
        vlan: "{{ vm_network }}"
        device_type: vmxnet3
        type: dhcp
        domain: "{{ vm_domain }}"
      customization:
        hostname: "{{ vm_servername }}"
        orgname: Redacted
        password: "{{ winlocal_admin_pass }}"
        timezone: 255
      wait_for_ip_address: yes 
    register: vm  

Переменные:

vm_disk_datastore0: C6200_T2_FCP_3Days
vm_disk_size0: 80
vm_disk_type0: thin
vm_disk_datastore1: "C6200_T2_FCP_3Days"
vm_disk_size1: "50"
vm_disk_type1: "thin"
vm_disk_datastore2: "C6200_T2_FCP_3Days"
vm_disk_size2: "20"
vm_disk_type2: "thin"
vm_disk_datastore3: ""
vm_disk_size3: ""
vm_disk_type3: ""

Ошибка:

{
    "_ansible_parsed": false,
    "exception": "Traceback (most recent call last):\n  File \"/var/lib/awx/.ansible/tmp/ansible-tmp-1568948672.23-135785453591577/AnsiballZ_vmware_guest.py\", line 113, in <module>\n    _ansiballz_main()\n  File \"/var/lib/awx/.ansible/tmp/ansible-tmp-1568948672.23-135785453591577/AnsiballZ_vmware_guest.py\", line 105, in _ansiballz_main\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n  File \"/var/lib/awx/.ansible/tmp/ansible-tmp-1568948672.23-135785453591577/AnsiballZ_vmware_guest.py\", line 48, in invoke_module\n    imp.load_module('__main__', mod, module, MOD_DESC)\n  File \"/tmp/ansible_vmware_guest_payload_6vidiw/__main__.py\", line 2396, in <module>\n  File \"/tmp/ansible_vmware_guest_payload_6vidiw/__main__.py\", line 2385, in main\n  File \"/tmp/ansible_vmware_guest_payload_6vidiw/__main__.py\", line 2008, in deploy_vm\n  File \"/tmp/ansible_vmware_guest_payload_6vidiw/__main__.py\", line 1690, in configure_disks\n  File \"/tmp/ansible_vmware_guest_payload_6vidiw/__main__.py\", line 1608, in get_configured_disk_size\nValueError: invalid literal for int() with base 10: ''\n",
    "_ansible_no_log": false,
    "module_stderr": "Traceback (most recent call last):\n  File \"/var/lib/awx/.ansible/tmp/ansible-tmp-1568948672.23-135785453591577/AnsiballZ_vmware_guest.py\", line 113, in <module>\n    _ansiballz_main()\n  File \"/var/lib/awx/.ansible/tmp/ansible-tmp-1568948672.23-135785453591577/AnsiballZ_vmware_guest.py\", line 105, in _ansiballz_main\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n  File \"/var/lib/awx/.ansible/tmp/ansible-tmp-1568948672.23-135785453591577/AnsiballZ_vmware_guest.py\", line 48, in invoke_module\n    imp.load_module('__main__', mod, module, MOD_DESC)\n  File \"/tmp/ansible_vmware_guest_payload_6vidiw/__main__.py\", line 2396, in <module>\n  File \"/tmp/ansible_vmware_guest_payload_6vidiw/__main__.py\", line 2385, in main\n  File \"/tmp/ansible_vmware_guest_payload_6vidiw/__main__.py\", line 2008, in deploy_vm\n  File \"/tmp/ansible_vmware_guest_payload_6vidiw/__main__.py\", line 1690, in configure_disks\n  File \"/tmp/ansible_vmware_guest_payload_6vidiw/__main__.py\", line 1608, in get_configured_disk_size\nValueError: invalid literal for int() with base 10: ''\n",
    "changed": false,
    "module_stdout": "",
    "rc": 1,
    "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error"
}

Идея в том, если переменная не определенакогда задание запускается, оно будет пропущено модулем vm_guest.

Это лучший метод?Кто-нибудь может предложить успешный путь вперед?

Обновление : Вероятно, лучшим способом было бы создать экземпляр и затем использовать vm_guest_disk для добавления дополнительных дисков, используя метод, предложенный ниже.Этот модуль доступен в v2.8.

Наша версия Tower - 2.7.9, поэтому я собираюсь использовать более подробный метод множественных вызовов vm_guest через переменную disk_num:

Переменные

num_disks: 0
vm_cluster: C6200_NPE_PC_ST
vm_datacenter: DC2
vm_disk_datastore0: C6200_T2_FCP_3Days
vm_disk_datastore1: ''
vm_disk_datastore2: ''
vm_disk_datastore3: ''
vm_disk_datastore4: ''
vm_disk_size0: 80
vm_disk_type0: thin
vm_disk_type1: ''
vm_disk_type2: ''
vm_disk_type3: ''
vm_disk_type4: ''
vm_domain: corp.local
vm_folder: /DC2/vm/ap-dev
vm_hostname: xyzvmserver.corp.local
vm_memory_mb: 16000
vm_network: C6200_10.110.64.0_24_VL1750
vm_num_cpus: 4
vm_servername: server05
vm_template: Windows2016_x64_AN_ESX_v1.1

Playbook:

---
- hosts: localhost
  connection: local
  gather_facts: False

  tasks:

  - name: Launch Windows 2016 VM Instance - No additional Disk
    vmware_guest:
      validate_certs: no
      datacenter: "{{ vm_datacenter }}"
      folder: "{{ vm_folder }}"
      name: "{{ vm_servername }}"
      state: poweredon
      template: "{{ vm_template }}"
      cluster: "{{ vm_cluster }}"
      disk:
      - size_gb: "{{ vm_disk_size0 }}"
        type: "{{ vm_disk_type0 }}"
        datastore: "{{ vm_disk_datastore0 }}"
      hardware:
        memory_mb: "{{ vm_memory_mb | default(8192) }}"
        num_cpus: "{{ vm_num_cpus }}"
      networks:
      - name: "{{ vm_network }}"
        start_connected: yes
        vlan: "{{ vm_network }}"
        device_type: vmxnet3
        type: dhcp
        domain: "{{ vm_domain }}"
      customization:
        hostname: "{{ vm_servername }}"
        orgname: redacted
        password: "{{ winlocal_admin_pass }}"
        timezone: 255
      wait_for_ip_address: yes 
    register: vm
    when: num_disks == 0

  - name: Launch Windows 2016 VM Instance 1 Additional Disk
    vmware_guest:
      validate_certs: no
      datacenter: "{{ vm_datacenter }}"
      folder: "{{ vm_folder }}"
      name: "{{ vm_servername }}"
      state: poweredon
      template: "{{ vm_template }}"
      cluster: "{{ vm_cluster }}"
      disk:
      - size_gb: "{{ vm_disk_size0 }}"
        type: "{{ vm_disk_type0 }}"
        datastore: "{{ vm_disk_datastore0 }}"
      - size_gb: "{{ vm_disk_size1 }}"
        type: "{{ vm_disk_type1 }}"
        datastore: "{{ vm_disk_datastore1 }}"
      hardware:
        memory_mb: "{{ vm_memory_mb | default(8192) }}"
        num_cpus: "{{ vm_num_cpus }}"
      networks:
      - name: "{{ vm_network }}"
        start_connected: yes
        vlan: "{{ vm_network }}"
        device_type: vmxnet3
        type: dhcp
        domain: "{{ vm_domain }}"
      customization:
        hostname: "{{ vm_servername }}"
        orgname: redacted
        password: "{{ winlocal_admin_pass }}"
        timezone: 255
      wait_for_ip_address: yes 
    register: vm
    when: num_disks == 1

  - name: Launch Windows 2016 VM Instance 2 Additional Disks
    vmware_guest:
      validate_certs: no
      datacenter: "{{ vm_datacenter }}"
      folder: "{{ vm_folder }}"
      name: "{{ vm_servername }}"
      state: poweredon
      template: "{{ vm_template }}"
      cluster: "{{ vm_cluster }}"
      disk:
      - size_gb: "{{ vm_disk_size0 }}"
        type: "{{ vm_disk_type0 }}"
        datastore: "{{ vm_disk_datastore0 }}"
      - size_gb: "{{ vm_disk_size1 }}"
        type: "{{ vm_disk_type1 }}"
        datastore: "{{ vm_disk_datastore1 }}"
      - size_gb: "{{ vm_disk_size2 }}"
        type: "{{ vm_disk_type2 }}"
        datastore: "{{ vm_disk_datastore2 }}"
      hardware:
        memory_mb: "{{ vm_memory_mb | default(8192) }}"
        num_cpus: "{{ vm_num_cpus }}"
      networks:
      - name: "{{ vm_network }}"
        start_connected: yes
        vlan: "{{ vm_network }}"
        device_type: vmxnet3
        type: dhcp
        domain: "{{ vm_domain }}"
      customization:
        hostname: "{{ vm_servername }}"
        orgname: redacted
        password: "{{ winlocal_admin_pass }}"
        timezone: 255
      wait_for_ip_address: yes 
    register: vm
    when: num_disks == 2

и т. Д.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2019

Можно пропустить параметры , используя фильтр default(omit).

Что-то вроде этого должно помочь:

   - size_gb: "{{ vm_disk_size3 | default(omit) }}"
     type: "{{ vm_disk_type3 | default(omit) }}"
     datastore: "{{ vm_disk_datastore3 | default(omit) }}"
0 голосов
/ 20 сентября 2019

Похоже, вы должны собрать свой vm с 1 диском, который, как вы знаете, наверняка будет всегда при запуске воспроизведения, который вы могли бы сделать первой переменной в этом списке:

vms:
  0:
    vm_disk_datastore: "C6200_T2_FCP_3Days"
    vm_disk_size: "80"
    vm_disk_type: "thin"
  1:
    vm_disk_datastore: "C6200_T2_FCP_3Days"
    vm_disk_size: "50"
    vm_disk_type: "thin"
  2:
    vm_disk_datastore: "C6200_T2_FCP_3Days"
    vm_disk_size: "20"
    vm_disk_type: "thin"
  3:
    vm_disk_datastore: ""
    vm_disk_size: ""
    vm_disk_type: ""

Так как я не знаю способа, которым вы можете циклически перебирать аргументы подмодуля, чтобы они присутствовали или нет, соберите ваш vm с тем диском, который, как вы знаете, наверняка будет там.Упомянутый выше, для согласованности, должен быть первым в вашем списке.Или вам нужно будет перестроить логику, чтобы детализировать список, чтобы найти определенное значение, которое вы можете ввести с помощью фильтров jinja, таких как selectattr и map.чтобы добавить дополнительные диски

- name: Add disks to virtual machine
  vmware_guest_disk:
    hostname: "{{ vm_servername }}"
    datacenter: "{{ vm_datacenter }}"
    disk:
      - size_gb: "{{ item.vm_disk_size }}"
        type: "{{ item.vm_disk_type }}"
        datastore: "{{ item.vm_disk_datastore }}"
        state: present
    loop: "{{ vms }}"
    loop_control:
      label: "Disk {{ my_idx}} - {{ item.vm_disk_datastore }}"
      index_var: my_idx
    when:
      - item.vm_disk_datastore != ""
      - item.vm_disk_size != ""
      - item.vm_disk_type != ""
      - my_idx > 0

, которые будут проходить через цикл, извлекающий эту переменную из того места, где вы решили ее определить, а затем перебирать этот список диктонаров, вытягивая значения с правильными метками,но делать это только в том случае, если они имеют значение (если вы планируете делать пробелы в этом списке, если нет, то время даже не нужно).Это также позволит вам расширяться вверх, просто добавляя больше элементов в список без необходимости расширять вашу задачу.Если вам нужно отредактировать первое задание, потому что вы не можете полагаться на порядок следования списков, но вам необходимо ввести переменную, то вам необходимо убедиться, что вы вносите изменения в диски во втором задании, а также не использовать дискдобавлено в первом задании.

Кроме того, в документации по этому модулю говорится, что существующие диски, вызываемые этим модулем, будут настроены на этот размер и не могут быть уменьшены с помощью модуля, поэтому, если вы хотитечтобы избежать этого, вставьте некоторые проверки данных, чтобы сравнить настроенный размер диска с тем, что находится в вашей переменной, чтобы вы могли пропустить задачу, если она будет уменьшена (или если вы просто не хотите, чтобы существующий vm был изменен).

...