HimeraSearchDB
Carding_EbayThief
triada
CrackerTuch
d-shop

НОВОСТИ Автоматизация задач администрирования API VMware vSphere с использованием Ansible

Bonnie
Оффлайн
Регистрация
12.04.17
Сообщения
19.095
Реакции
107
Репутация
0
tv8hnnkbtd6xaejjwtdwodwplga.jpeg



В мы рассмотрели взаимодействие с 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: [email protected]
password: AdminSecur3P@ssw0rd
validate_certs: False
with_tags: True


После чего выполнить:


ansible-inventory --list -i .vmware.yml

Модули


vmware_guest



Этот модуль используется для:

  • создания новых виртуальных машин из шаблонов или других виртуальных машин
  • управления состоянием питания виртуальной машины
  • изменением различных компонентов виртуальной машины
  • переименование виртуальной машины
  • удаление виртуальной машины со связанными компонентами
  • и многого другого


Основные параметры:

hostnameDNS-имя или 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


Подробная документация и дополнительные примеры доступны по .


Для возможности кастомизации операционной системы есть несколько условий:

  1. Операционная система должна быть в списке поддерживаемых. Ознакомиться с матрицей поддержки операционных систем можно по
  2. Установленные VMware Tools
  3. На Linux-base дистрибутивах должен быть установлен Perl
  4. Установлена соответствующая версии ОС 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:
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 с помощью chokolatey
win_chocolatey:
name: postgresql
state: present
delegate_to: '10.10.100.100'


Данный подход хорошо ложится на модель «Инфраструктура как код (IaC)», согласно которой в процессе развертывания и настройки инфраструктуры используются те же практики и методологии, что и в разработке ПО. Playbook'и удобно хранить в системах контроля версий, что позволяет отслеживать изменения требований к инфраструктуре хронологически. Можно так же использовать методологию code-review для обеспечения качественного написания скриптов.


Результатом может служить быстрое, документированное и воспроизводимое развертывание тестовых, staging, production машин и сред.
 
Сверху Снизу