
В предыдущей статье мы рассмотрели взаимодействие с VMware с помощью Python. В этой же обсудим взаимодействие с VMware с помощью Ansible.
Ansible — система управления конфигурациями, написанная на языке программирования Python с использованием декларативного языка разметки для описания конфигураций. Про Ansible на Хабре уже есть множество статей, но стоит еще раз упомянуть, что одним из ключевых свойств playbook'a является идемпотентность. Это значит, что сколько бы раз подряд вы не запускали свой playbook, результат будет один и тот же.
Ansible модули используют библиотеку pyVmomi и чаще всего требуют Python версии выше 2.6.
Вы можете установить pyVmomi, используя pip:
pip install pyvmomi
Использование плагина динамической инвентаризации VMware
Согласно документации лучший способ взаимодействия с существующими хостами — это использование плагина динамической инвентаризации VMware.
Для использования данного плагина необходимо внести в файл ansible.cfg следующие правки:
[inventory] enable_plugins = vmware_vm_inventory
Затем создать файл в рабочей папке, имя которого заканчивается на .vmware.yml или .vmware.yaml. Например:
plugin: vmware_vm_inventory strict: False hostname: 10.10.10.10 username: admin@vsphere.local password: AdminSecur3P@ssw0rd validate_certs: False with_tags: True
После чего выполнить:
ansible-inventory --list -i <filename>.vmware.yml
Модули
vmware_guest
Этот модуль используется для:
- создания новых виртуальных машин из шаблонов или других виртуальных машин
- управления состоянием питания виртуальной машины
- изменением различных компонентов виртуальной машины
- переименование виртуальной машины
- удаление виртуальной машины со связанными компонентами
- и многого другого
Основные параметры:
| hostname |
DNS-имя или IP-адрес хоста ESXI-сервера |
|---|---|
| username |
логин пользователя для подключения |
| password |
пароль пользователя для подключения |
| validate_certs |
проверка валидации сертификата |
| datacenter |
datacenter виртуальной машины |
| cluster |
кластер виртуальной машины |
| name |
имя целевой виртуальной машины |
| template |
имя виртуальной машины или шаблона, который будет клонирован |
| folder |
целевое расположение виртуальной машины |
| annotation |
описание или примечание для виртуальной машины |
| datastore |
целевой datastore |
| networks |
настройки сети для новой машины |
| customization |
параметр, позволяющий кастомизировать гостевую ОС |
| hardware |
кастомизация hardware машины |
Следующий пример клонирует машину, применит сетевые настройки и дождется момента, когда на ней будет доступна сеть:
- name: Клонирование машины из шаблона vmware_guest: hostname: "{{ vcenter_server }}" username: "{{ vcenter_user }}" password: "{{ vcenter_pass }}" validate_certs: False datacenter: datacenter1 cluster: cluster1 name: VMNAME template: TemplateName folder: /dc1/vm/targetFolder annotation: "Моя машина, клонированная из TemplateName" datastore: DATASTORE1 networks: - name: VM Network ip: '10.10.100.100' netmask: '255.255.252.0' gateway: '10.10.100.10' dns_servers: [1.1.1.1, 8.8.8.8] type: static customization: hostname: "VMNAME.domain.ru" dns_servers: [1.1.1.1, 8.8.8.8] wait_for_ip_address: yes
Подробная документация и дополнительные примеры доступны по ссылке.
Для возможности кастомизации операционной системы есть несколько условий:
- Операционная система должна быть в списке поддерживаемых. Ознакомиться с матрицей поддержки операционных систем можно по ссылке
- Установленные VMware Tools
- На Linux-base дистрибутивах должен быть установлен Perl
- Установлена соответствующая версии ОС Microsoft System Preparation (Sysprep) для Windows-дистрибутивов
vmware_guest_info
Данный модуль позволяет получить данные о виртуальной машине, что дает возможность комбинировать его с предыдущим.
Например, так выглядит переименование виртуальной машины:
- name: Получаем uuid машины по имени vmware_guest_facts: hostname: "{{ vcenter_server }}" username: "{{ vcenter_user }}" password: "{{ vcenter_pass }}" validate_certs: False datacenter: datacenter1 folder: /dc1/vm/targetFolder name: VMNAME register: vm_facts - name: Переименование машины vmware_guest: hostname: "{{ vcenter_server }}" username: "{{ vcenter_user }}" password: "{{ vcenter_pass }}" validate_certs: False cluster: cluster1 uuid: "{{ vm_facts.instance.hw_product_uuid }}" name: NEW_VM_NAME
Главным плюсом является то, что после клонирования машины имеется возможность продолжить настройку уже операционной системы, например установить rabbitmq, настроить правила firewall и др. В случае необходимости есть возможность написать свой модуль для Ansible на Python. Взаимодействие Python c VMware было рассмотрено в предыдущей статье.
Объединим все примеры выше и поставим себе такую задачу:
- Развернуть виртуальную машину с ОС Windows из шаблона
- Задать атрибут owner виртуальной машины
- Установить на нее 7-zip с помощью модуля win_get_url
- Установить на нее postgresql с помощью модуля win_chocolatey
- name: Клонирование VM из шаблона vmware_guest: hostname: "{{ vcenter_server }}" username: "{{ vcenter_user }}" password: "{{ vcenter_pass }}" validate_certs: False datacenter: datacenter1 cluster: cluster1 name: VMNAME template: TemplateName folder: /dc1/vm/targetFolder annotation: "Моя машина, клонированная из TemplateName" datastore: DATASTORE1 networks: - name: VM Network ip: '10.10.100.100' netmask: '255.255.252.0' gateway: '10.10.100.10' dns_servers: [1.1.1.1, 8.8.8.8] type: static customization: hostname: "VMNAME.domain.ru" dns_servers: [1.1.1.1, 8.8.8.8] wait_for_ip_address: yes register: vm_facts - name: Установка аттрибута owner vmware_guest_custom_attributes: hostname: "{{ vcenter_server }}" username: "{{ vcenter_user }}" password: "{{ vcenter_pass }}" validate_certs: False name: VMNAME uuid: "{{ vm_facts.instance.hw_product_uuid }}" state: present attributes: - name: "Owner" value: IIvanov # Добавление нового ansible-хоста - name: Add new host add_host: name: '10.10.100.100' ansible_host: '10.10.100.100' ansible_user: "{{ login }}" ansible_password: "{{ password }}" ansible_connection: winrm ansible_winrm_transport: basic # Ожидание загрузки машины и ответа от нее - name: Ansible ping win_ping: delegate_to: '10.10.100.100' register: result until: result.ping == "pong" retries: 20 delay: 6 # Установка 7-Zip с помощью win_package - name: Скачивание 7-zip win_get_url: url: https://www.7-zip.org/a/7z1701-x64.msi dest: C:\temp\7z.msi delegate_to: '10.10.100.100' - name: Установка 7-zip win_package: path: C:\temp\7z.msi state: present delegate_to: '10.10.100.100' - name: Установка postgresql с помощью chocolatey win_chocolatey: name: postgresql state: present delegate_to: '10.10.100.100'
Данный подход хорошо ложится на модель «Инфраструктура как код (IaC)», согласно которой в процессе развертывания и настройки инфраструктуры используются те же практики и методологии, что и в разработке ПО. Playbook'и удобно хранить в системах контроля версий, что позволяет отслеживать изменения требований к инфраструктуре хронологически. Можно так же использовать методологию code-review для обеспечения качественного написания скриптов.
Результатом может служить быстрое, документированное и воспроизводимое развертывание тестовых, staging, production машин и сред.
