In a previous article, we looked at interacting with VMware using Python. In the same, we discuss interaction with VMware using 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
:
:
, , :
- 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:
    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 .