ML
    • Recent
    • Categories
    • Tags
    • Popular
    • Users
    • Groups
    • Register
    • Login

    Ansible Create KVM Guests

    IT Discussion
    kvm ansible automation
    5
    9
    13.5k
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • stacksofplatesS
      stacksofplates
      last edited by

      The Ansible virt module doesn't have a clone option and the creation of guests is a little limited. Because of this we have to use the shell or command modules and try to make them idempotent. This is a simple example and the dictionary can be expanded to a lot more customization. There is a way to use libvirt as a dynamic inventory and set group and host vars on guests, but I'm not going into that here.

      ---
      - name: create VMs
        hosts: kvm
        become: true
        vars_files:
          - vms.yml
      
        tasks:
          - name: get VM disks
            command: "ls {{ vm_location }}"
            register: disks
            changed_when: "disks.rc != 0"
      
          - name: create disk
            command: >
                     virt-builder --format qcow2 centos-7.4
                     -o {{ vm_location}}/{{ item.key }}.{{ item.value.file_type }}
                     --root-password password:{{ root_pass }}
            when: item.key not in disks.stdout
            with_dict: "{{ guests }}"
      
          - name: get list of VMs
            virt:
              command: "list_vms"
            register: vms 
      
          - name: create vm
            command: >
                      virt-install --import --name {{ item.key }}
                      --memory {{ item.value.mem }} --vcpus {{ item.value.cpus }}
                      --disk {{ vm_location }}/{{ item.key }}.{{ item.value.file_type }}
                      --noautoconsole --os-variant {{ item.value.os_type }}
            when: item.key not in vms.list_vms
            with_dict: "{{ guests }}"
      
          - name: start vm
            virt:
              name: "{{ item.key }}"
              state: running
            with_dict: "{{ guests }}"
      

      So we do a few checks to make sure the disk isn't already in the directory and another check to make sure the VM isn't already created. The dictionary is in the referenced vars_file:

      ---
      vm_location: "/data/VMs"
      root_pass: "password"
      
      guests:
        test:
          mem: 512
          cpus: 1
          os_type: rhel7
          file_type: qcow2
        test2:
          mem: 512
          cpus: 1
          os_type: rhel7
          file_type: qcow2
      

      Obviously you wouldn't put the password in plain text, you'd either use ansible-vault, a vars prompt, or a survey in tower.

      And here's our output. I had already created a system called test so it skips over to give us idempotence.

      0_1507164665705_kvm.png

      1 Reply Last reply Reply Quote 2
      • H
        humax159
        last edited by

        I might be missing some basic step. But in order to make it work what else is needed? on ly running this returns
        'PLAY [create VMs] **************************************************************
        skipping: no hosts matched'

        matteo nunziatiM 2 Replies Last reply Reply Quote 0
        • matteo nunziatiM
          matteo nunziati @humax159
          last edited by

          @humax159 said in Ansible Create KVM Guests:

          I might be missing some basic step. But in order to make it work what else is needed? on ly running this returns
          'PLAY [create VMs] **************************************************************
          skipping: no hosts matched'

          Did you create and populate the hosts file?

          1 Reply Last reply Reply Quote 1
          • matteo nunziatiM
            matteo nunziati @humax159
            last edited by

            @humax159 namely did you create the "kvm" label for your virtualization server?!

            stacksofplatesS 1 Reply Last reply Reply Quote 0
            • stacksofplatesS
              stacksofplates @matteo nunziati
              last edited by

              @matteo-nunziati said in Ansible Create KVM Guests:

              @humax159 namely did you create the "kvm" label for your virtualization server?!

              Yeah if you copy this line for line there has to be a host or group called KVM.

              If you only have a single host your inventory needs to have the hostname/ip.

              [hosts]
              kvm.example.com
              

              Or this

              [hosts]
              10.0.0.5 ansible_host=kvm
              
              1 Reply Last reply Reply Quote 0
              • jmooreJ
                jmoore
                last edited by

                Good information

                1 Reply Last reply Reply Quote 0
                • stacksofplatesS
                  stacksofplates
                  last edited by

                  After I wrote this I found a module that someone wrote (Ansible lets you create custom modules) and it includes the clone feature. When I get time I'll try to write that up.

                  1 Reply Last reply Reply Quote 2
                  • F
                    fabionoth
                    last edited by fabionoth

                    Hi @stacksofplates. Did you find something about virt module.
                    Here's https://docs.ansible.com/ansible/latest/modules/virt_module.html#virt-module link.

                    But, I cannot build a machine? with creating command.
                    by the way: your article is awesome.

                    stacksofplatesS 1 Reply Last reply Reply Quote 0
                    • stacksofplatesS
                      stacksofplates @fabionoth
                      last edited by

                      @fabionoth said in Ansible Create KVM Guests:

                      Hi @stacksofplates. Did you find something about virt module.
                      Here's https://docs.ansible.com/ansible/latest/modules/virt_module.html#virt-module link.

                      But, I cannot build a machine? with creating command.
                      by the way: your article is awesome.

                      Yeah that's why I wrote this. That virt module doesn't support cloning systems. I never got around to linking that module. I'll see if I can find it again. You just need to put it in your local module library and then you can call it like any other module.

                      1 Reply Last reply Reply Quote 0
                      • 1 / 1
                      • First post
                        Last post