Deploy VMs using Ansible



  • @desnudopenguino Thanks 👍 .

    I've updated the first post with some more info and clarified some confusing stuff.



  • I hate to be one of those double posters... Forgive me, as I have not been following the whole split of xenserver opensource vs. closed source. Just not sure which forum gets checked more often these days.

    I was testing out this ansible module with XenServer 7.1 CU2 and running into some errors.
    Posted about it here:

    https://discussions.citrix.com/topic/396848-deploy-vms-using-ansible/?csrfKey=b09a1d8e79f3ea686583c72352cef53d



  • @jthompson333 No problem. I'm following both forums so I'll try to respond same day.



  • First post has been updated with new info. Another module has been merged upstream. Also some bugs were fixed.



  • A milestone has been achieved 😱 . All of my modules have been merged upstream. I've updated the first post with new info.

    That will most probably be all for Ansible 2.8. I'm keeping some improvements and possibly more modules for Ansible 2.9. Currently, I'm thinking about what other modules could be useful so I could implement them. Any suggestion or wish would be much appreciated.



  • Great news , i will test your module in our DR environment and will provide any feedbacks (good or bad ) , please bear with me .....



  • @bvitnik I can confirm the most simple of tasks where I used your module to create a new VM based on an existing template.

    I'm still figuring out how to use this best.

    Does setting an IP work on any template (e.g. Linux Ubuntu) with XenTools installed?

    MM



  • @jedimarcus Network configuration (IP, subnet, gateway) only works for Windows guests because there is proper support for it in XenServer Guest Tools for Windows. There is no such support (as far as I know) in XenServer Guest Tools for *nix based systems. Unlike tools for Windows, tools for *nix based systems only contain a few xenstore tools and a daemon (xe-daemon) that collects OS metrics. There is no management agent.

    My idea is to write a proper agent for *nix based systems at some point but it won't be any time soon. Maybe Citrix (or Vates 😉 ?) will implement one before I do.

    For now, you can use custom based network configuration trough xenstore and custom scripts. It's described in Notes section of the module documentation.



  • Hello all,

    I try to create a playbook to deploy a Windows Server 2016 VM.
    I see a lot of examples with this parameter : register: deploy.
    But there is no reference in the parameters guide. Maybe a mistake ?



  • @Ced76 "register" is not a module parameter. It's Ansible task parameter. Take a look at Ansible documentation for registered variables:

    https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#registering-variables

    Basically what "register: deploy" does is that is says "define a variable called deploy and put a return value of the module in it". A return value of the module in this case are numerous VM facts you can find in "deploy.instance" (sub)variable. Registered variable is accessible in any subsequent task of the same play. Also "deploy" here is just a random name chosen. You can name your registered variables however you like.



  • @bvitnik Understood. Sorry but i'm newbie on Ansible 🙂 Doesn't see that this variable was not in the xenxerver_guest module part.
    I try to create a lab with these objectives :
    1- Provision Windows Server 2016 VMs on XCP-NG (or XenServer) after building my own Windows Server 2016 template (using best practices)
    2- Define some roles on these VMs (Active Directory, IIS, SQL Server etc.)

    Hope it'll be possible ...

    Thanks.



  • Hi all,

    Working perfect ! I've deployed 4 VMs from a custom WS2016 template under XCP-NG (version 7.5) 🙂
    Nothing to do : just press <Enter> to execute the script.

    Here is my first version if people want to try 😉

    ---
    - name: Deploy Windows Server 2016
      hosts: localhost
      connection: local
      vars_prompt:
        - name: "XenServer_IP_var"
          prompt: "Enter XenServer IP Address"
          private: no
          default: "***.***.***.***"
        - name: "XenServer_user_var"
          prompt: "Enter XenServer username"
          private: no
          default: "root"
        - name: "XenServer_pass_var"
          prompt: "Enter XenServer password"
          private: yes
      vars:
        template_var: "Windows Server 2016 Template (64-bit)"
        folder_var: "Ansible Build Lab"
        validate_certs_var : no
        state_var: poweredon
        linked_clone_var: yes
        VMs_var:
          - guest_var: "Lab-AD1"
            hardware_var:
              num_CPU_var: 1
              num_CPU_cores_per_socket_var: 1
              memory_MB_var: 4096
            disk_var:
              disk1_var:
                size_var: 50
                name_var: "Lab-AD1 : SYSTEM"
              disk2_var:
                size_var: 4
                name_var: "Lab-AD1 : PAGEFILE"
            network_var:
              name_var: "VLAN 801"
              type_var: "static"
              ip_var: "***.***.***.***"
              netmask_var: "***.***.***.***"
              gateway_var: "***.***.***.***"
          - guest_var: "Lab-BTS1"
            hardware_var:
              num_CPU_var: 2
              num_CPU_cores_per_socket_var: 1
              memory_MB_var: 8192
            disk_var:
              disk1_var:
                size_var: 50
                name_var: "Lab-BTS1 : SYSTEM"
              disk2_var:
                size_var: 4
                name_var: "Lab-BTS1 : PAGEFILE"
            network_var:
              name_var: "VLAN 801"
              type_var: "static"
              ip_var: "***.***.***.***"
              netmask_var: "***.***.***.***"
              gateway_var: "***.***.***.***"
          - guest_var: "Lab-IIS1"
            hardware_var:
              num_CPU_var: 1
              num_CPU_cores_per_socket_var: 1
              memory_MB_var: 4096
            disk_var:
              disk1_var:
                size_var: 50
                name_var: "Lab-IIS1 : SYSTEM"
              disk2_var:
                size_var: 4
                name_var: "Lab-IIS1 : PAGEFILE"
            network_var:
              name_var: "VLAN 801"
              type_var: "static"
              ip_var: "***.***.***.***"
              netmask_var: "***.***.***.***"
              gateway_var: "***.***.***.***"
          - guest_var: "Lab-SQL1"
            hardware_var:
              num_CPU_var: 2
              num_CPU_cores_per_socket_var: 1
              memory_MB_var: 8192
            disk_var:
              disk1_var:
                size_var: 50
                name_var: "Lab-SQL1 : SYSTEM"
              disk2_var:
                size_var: 4
                name_var: "Lab-SQL1 : PAGEFILE"
            network_var:
              name_var: "VLAN 801"
              type_var: "static"
              ip_var: "***.***.***.***"
              netmask_var: "***.***.***.***"
              gateway_var: "***.***.***.***"
        note_var: "Provisioned by Ansible"
        SR_var: "Hardware HBA virtual disk storage"
      tasks:
        - name: Create VM Lab-AD1
          xenserver_guest:
            hostname: "{{ XenServer_IP_var }}"
            username: "{{ XenServer_user_var }}"
            password: "{{ XenServer_pass_var }}"
            validate_certs: "{{ validate_certs_var }}"
            folder: "{{ folder_var }}"
            state: "{{ state_var }}"
            template: "{{ template_var }}"
            linked_clone: "{{ linked_clone_var }}"
            name_desc: "{{ note_var }}"
            name: "{{ item['guest_var'] }}"
            disks:
            - size_gb: "{{ item['disk_var']['disk1_var']['size_var'] }}"
              name: "{{ item['disk_var']['disk1_var']['name_var'] }}"
              sr: "{{ SR_var }}"
            - size_gb: "{{ item['disk_var']['disk2_var']['size_var'] }}"
              name: "{{ item['disk_var']['disk2_var']['name_var'] }}"
              sr: "{{ SR_var }}"
            hardware:
              num_cpus: "{{ item['hardware_var']['num_CPU_var'] }}"
              num_cpu_cores_per_socket: "{{ item['hardware_var']['num_CPU_cores_per_socket_var'] }}"
              memory_mb: "{{ item['hardware_var']['memory_MB_var'] }}"
            networks:
            - name: "{{ item['network_var']['name_var'] }}"
              type: "{{ item['network_var']['type_var'] }}"
              ip: "{{ item['network_var']['ip_var'] }}"
              netmask: "{{ item['network_var']['netmask_var'] }}"
              gateway: "{{ item['network_var']['gateway_var'] }}"
          with_items: "{{ VMs_var }}"
          when: item['guest_var'] == "Lab-AD1"
        - name: Create VM Lab-BTS1
          xenserver_guest:
            hostname: "{{ XenServer_IP_var }}"
            username: "{{ XenServer_user_var }}"
            password: "{{ XenServer_pass_var }}"
            validate_certs: "{{ validate_certs_var }}"
            folder: "{{ folder_var }}"
            state: "{{ state_var }}"
            template: "{{ template_var }}"
            linked_clone: "{{ linked_clone_var }}"
            name_desc: "{{ note_var }}"
            name: "{{ item['guest_var'] }}"
            disks:
            - size_gb: "{{ item['disk_var']['disk1_var']['size_var'] }}"
              name: "{{ item['disk_var']['disk1_var']['name_var'] }}"
              sr: "{{ SR_var }}"
            - size_gb: "{{ item['disk_var']['disk2_var']['size_var'] }}"
              name: "{{ item['disk_var']['disk2_var']['name_var'] }}"
              sr: "{{ SR_var }}"
            hardware:
              num_cpus: "{{ item['hardware_var']['num_CPU_var'] }}"
              num_cpu_cores_per_socket: "{{ item['hardware_var']['num_CPU_cores_per_socket_var'] }}"
              memory_mb: "{{ item['hardware_var']['memory_MB_var'] }}"
            networks:
            - name: "{{ item['network_var']['name_var'] }}"
              type: "{{ item['network_var']['type_var'] }}"
              ip: "{{ item['network_var']['ip_var'] }}"
              netmask: "{{ item['network_var']['netmask_var'] }}"
              gateway: "{{ item['network_var']['gateway_var'] }}"
          with_items: "{{ VMs_var }}"
          when: item['guest_var'] == "Lab-BTS1"
        - name: Create VM Lab-IIS1
          xenserver_guest:
            hostname: "{{ XenServer_IP_var }}"
            username: "{{ XenServer_user_var }}"
            password: "{{ XenServer_pass_var }}"
            validate_certs: "{{ validate_certs_var }}"
            folder: "{{ folder_var }}"
            state: "{{ state_var }}"
            template: "{{ template_var }}"
            linked_clone: "{{ linked_clone_var }}"
            name_desc: "{{ note_var }}"
            name: "{{ item['guest_var'] }}"
            disks:
            - size_gb: "{{ item['disk_var']['disk1_var']['size_var'] }}"
              name: "{{ item['disk_var']['disk1_var']['name_var'] }}"
              sr: "{{ SR_var }}"
            - size_gb: "{{ item['disk_var']['disk2_var']['size_var'] }}"
              name: "{{ item['disk_var']['disk2_var']['name_var'] }}"
              sr: "{{ SR_var }}"
            hardware:
              num_cpus: "{{ item['hardware_var']['num_CPU_var'] }}"
              num_cpu_cores_per_socket: "{{ item['hardware_var']['num_CPU_cores_per_socket_var'] }}"
              memory_mb: "{{ item['hardware_var']['memory_MB_var'] }}"
            networks:
            - name: "{{ item['network_var']['name_var'] }}"
              type: "{{ item['network_var']['type_var'] }}"
              ip: "{{ item['network_var']['ip_var'] }}"
              netmask: "{{ item['network_var']['netmask_var'] }}"
              gateway: "{{ item['network_var']['gateway_var'] }}"
          with_items: "{{ VMs_var }}"
          when: item['guest_var'] == "Lab-IIS1"
        - name: Create VM Lab-SQL1
          xenserver_guest:
            hostname: "{{ XenServer_IP_var }}"
            username: "{{ XenServer_user_var }}"
            password: "{{ XenServer_pass_var }}"
            validate_certs: "{{ validate_certs_var }}"
            folder: "{{ folder_var }}"
            state: "{{ state_var }}"
            template: "{{ template_var }}"
            linked_clone: "{{ linked_clone_var }}"
            name_desc: "{{ note_var }}"
            name: "{{ item['guest_var'] }}"
            disks:
            - size_gb: "{{ item['disk_var']['disk1_var']['size_var'] }}"
              name: "{{ item['disk_var']['disk1_var']['name_var'] }}"
              sr: "{{ SR_var }}"
            - size_gb: "{{ item['disk_var']['disk2_var']['size_var'] }}"
              name: "{{ item['disk_var']['disk2_var']['name_var'] }}"
              sr: "{{ SR_var }}"
            hardware:
              num_cpus: "{{ item['hardware_var']['num_CPU_var'] }}"
              num_cpu_cores_per_socket: "{{ item['hardware_var']['num_CPU_cores_per_socket_var'] }}"
              memory_mb: "{{ item['hardware_var']['memory_MB_var'] }}"
            networks:
            - name: "{{ item['network_var']['name_var'] }}"
              type: "{{ item['network_var']['type_var'] }}"
              ip: "{{ item['network_var']['ip_var'] }}"
              netmask: "{{ item['network_var']['netmask_var'] }}"
              gateway: "{{ item['network_var']['gateway_var'] }}"
          with_items: "{{ VMs_var }}"
          when: item['guest_var'] == "Lab-SQL1"
    


  • Thanks for sharing!



  • @Ced76

    Ced thanks for the script.



  • This post is deleted!

Log in to reply
 

XCP-ng Pro Support