diff --git a/ansible.cfg b/ansible.cfg index ed865bf..b064acb 100755 --- a/ansible.cfg +++ b/ansible.cfg @@ -1,2 +1,2 @@ [defaults] -inventory = hosts +inventory = hosts.yml diff --git a/hosts b/hosts deleted file mode 100755 index 85a89ab..0000000 --- a/hosts +++ /dev/null @@ -1,18 +0,0 @@ -[local] -localhost - -[vm] -ubuntu@localhost - -[local:vars] -ansible_connection=local -vm_name=mirror-env -vm_mem=2G -vm_disk_size=10G -ovmf_location=/usr/share/edk2-ovmf/x64/OVMF_CODE.fd - -[vm:vars] -ansible_connection=ssh -ansible_port=7777 -ansible_user=ubuntu -ansible_password=ubuntu diff --git a/hosts.yml b/hosts.yml new file mode 100644 index 0000000..12d4e47 --- /dev/null +++ b/hosts.yml @@ -0,0 +1,19 @@ +local: + hosts: + localhost + vars: + ansible_connection: local + userdata: {{playbook_dir}}/userdata + virtual_machines: + - name: mirror-env + ram: 2G + disk_size: 10G + +vm: + hosts: + ubuntu@localhost + vars: + ansible_connection: ssh + ansible_port: 7777 + ansible_user: ubuntu + ansible_password: ubuntu diff --git a/mirror-vm b/mirror-vm deleted file mode 100755 index b2a1c34..0000000 --- a/mirror-vm +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/make -sf - -# script for managing the vm for the csc mirror dev environment - -# dependencies =-=-=-=-=-=-=-= -# qemu, genisoimage, ovmf (find the location of OVMF_CODE.fd on your system) - -# user config variables =-=-= -disk_size=10G -vm_mem=2G -ovmf_location=/usr/share/edk2-ovmf/x64/OVMF_CODE.fd -install_iso=./ubuntu-20.04.2-live-server-amd64.iso -ssh_port=7777 - -.PHONY: help create clean run-install run - -help: - echo help|create|clean|run-install|run - -.ONESHELL: -create: - for i in {1..6}; do - qemu-img create -f qcow2 drive$$i ${disk_size}; done - genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data - -clean: - rm drive* seed.iso - -run-install: - qemu-system-x86_64 -cdrom ${install_iso} -enable-kvm -boot order=d \ - -drive file=drive1,if=virtio,id=a,media=disk,format=qcow2 \ - -drive file=drive2,if=virtio,id=b,media=disk,format=qcow2 \ - -drive file=drive3,if=virtio,id=c,media=disk,format=qcow2 \ - -drive file=drive4,if=virtio,id=d,media=disk,format=qcow2 \ - -drive file=drive5,if=virtio,id=e,media=disk,format=qcow2 \ - -drive file=drive6,if=virtio,id=f,media=disk,format=qcow2 \ - -drive file=seed.iso,if=virtio,format=raw \ - -bios ${ovmf_location} \ - -m ${vm_mem} - -post-install: - - -run: - qemu-system-x86_64 -enable-kvm -boot order=d \ - -drive file=drive1,if=virtio,id=a,media=disk,format=qcow2 \ - -drive file=drive2,if=virtio,id=b,media=disk,format=qcow2 \ - -drive file=drive3,if=virtio,id=c,media=disk,format=qcow2 \ - -drive file=drive4,if=virtio,id=d,media=disk,format=qcow2 \ - -drive file=drive5,if=virtio,id=e,media=disk,format=qcow2 \ - -drive file=drive6,if=virtio,id=f,media=disk,format=qcow2 \ - -bios ${ovmf_location} \ - -m ${vm_mem} \ - -net user,hostfwd=tcp::${ssh_port}-:22 \ - -net nic - diff --git a/qemu-vm.yml b/mirror-vm.yml similarity index 78% rename from qemu-vm.yml rename to mirror-vm.yml index 0e26d0c..5a8fce1 100644 --- a/qemu-vm.yml +++ b/mirror-vm.yml @@ -2,4 +2,4 @@ - hosts: local become: true roles: - - qemu-vm + - vm diff --git a/playbook.yml b/playbook.yml deleted file mode 100644 index f9140cf..0000000 --- a/playbook.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -- hosts: all - become: true - roles: - - setup - - zfs - - rsync diff --git a/roles/qemu-vm/tasks/main.yml b/roles/qemu-vm/tasks/main.yml deleted file mode 100644 index 7561e84..0000000 --- a/roles/qemu-vm/tasks/main.yml +++ /dev/null @@ -1,48 +0,0 @@ ---- -- name: "{{vm_name}} - Gathering info" - stat: - path: "{{playbook_dir}}/vm/{{vm_name}}" - register: vm_stat - -- name: "{{vm_name}} - Checking if VM already exists" - meta: end_play - when: vm_stat.stat.exists == true - -# Start vm install -- name: "{{vm_name}} - Create directory for VM" - file: - state: directory - path: "{{playbook_dir}}/vm/{{vm_name}}" - -- name: "{{vm_name}} - Create disk images" - shell: - cmd: "for i in {1..6}; do qemu-img create -f qcow2 {{playbook_dir}}/vm/{{vm_name}}/drive${i} {{vm_disk_size}}; done" - -- name: "{{vm_name}} - Creating cloud-init iso" - command: "genisoimage -output {{playbook_dir}}/vm/{{vm_name}}/seed.iso -volid cidata -joliet -rock {{role_path}}/files/user-data {{role_path}}/files/meta-data" - -# Autoinstall ubuntu on vm -- name: "{{vm-name}} - Check if iso exists" - stat: - path: "{{role_path}}/files/ubuntu20_04.iso" - register: iso_stat - -- name: "{{vm-name}} - Fetching ubuntu iso" - get_url: - url: https://releases.ubuntu.com/20.04.3/ubuntu-20.04.3-live-server-amd64.iso - dest: "{{role_path}}/files/ubuntu20_04.iso" - when: iso_stat.stat.exists == false - -- name: "{{vm_name}} - Starting VM install" - command: > - qemu-system-x86_64 -cdrom {{role_path}}/files/ubuntu20_04.iso -enable-kvm -boot order=d - -drive file={{playbook_dir}}/vm/{{vm_name}}/drive1,if=virtio,id=a,media=disk,format=qcow2 - -drive file={{playbook_dir}}/vm/{{vm_name}}/drive2,if=virtio,id=b,media=disk,format=qcow2 - -drive file={{playbook_dir}}/vm/{{vm_name}}/drive3,if=virtio,id=c,media=disk,format=qcow2 - -drive file={{playbook_dir}}/vm/{{vm_name}}/drive4,if=virtio,id=d,media=disk,format=qcow2 - -drive file={{playbook_dir}}/vm/{{vm_name}}/drive5,if=virtio,id=e,media=disk,format=qcow2 - -drive file={{playbook_dir}}/vm/{{vm_name}}/drive6,if=virtio,id=f,media=disk,format=qcow2 - -drive file={{playbook_dir}}/vm/{{vm_name}}/seed.iso,if=virtio,format=raw - -bios {{ovmf_location}} - -m {{vm_mem}} - diff --git a/roles/qemu-vm/files/meta-data b/roles/vm/files/meta-data similarity index 100% rename from roles/qemu-vm/files/meta-data rename to roles/vm/files/meta-data diff --git a/roles/qemu-vm/files/user-data b/roles/vm/files/user-data similarity index 100% rename from roles/qemu-vm/files/user-data rename to roles/vm/files/user-data diff --git a/roles/vm/tasks/main-libvirt.yml b/roles/vm/tasks/main-libvirt.yml new file mode 100644 index 0000000..62181e9 --- /dev/null +++ b/roles/vm/tasks/main-libvirt.yml @@ -0,0 +1,106 @@ +``` +- name: Create mirror Vm + hosts: localhost + connection: local + tasks: + - name: Check for ubuntu iso + stat: + path: {{ playbook_dir }}/ubuntu.iso + register: isoexists + ignore_errors: true + - name: Check for ubuntu iso seed + stat: + path: {{ playbook_dir }}/ubuntu-seed.qcow2 + register: seedexists + ignore_errors: true + - name: Check if storage pool exists + command: virsh pool-info mirror + register: poolexists + ignore_errors: true + - name: Check if mirbr0 network exists + command: virsh net-info mirbr0 + register: netexists + ignore_errors: true + - name: Check if mirror VM exists + command: virsh dumpxml mirror + register: vmexists + ignore_errors: true +- name: enable and start libvirt daemon + systemd: + name: libvirtd + enabled: true + state: started +- name: Download ubuntu iso + # make sure curl is installed ? + command: > + curl + -o {{ playbook_dir }}/ubuntu.iso + https://releases.ubuntu.com/20.04/ubuntu-20.04.2-live-server-amd64.iso + when: isoexists.stat.exists == False +- name: Create ubuntu iso + # install cloud-localds (cloud-image-utils) + # + # Installing VMs from Ready Images + # https://www.x386.xyz/index.php/2021/01/06/kvm-on-ubuntu-server-1/ + command: > + cloud-localds + # --network-config {{ playbook_dir }}/templates/network + {{ playbook_dir }}/ubuntu-seed.qcow2 + {{ playbook_dir }}/templates/user-data + when: seedexists.stat.exists == False +- name: Create storage pool and virtual disks for mirror + file: + path: {{ playbook_dir }}/disks + state: directory + owner: root + group: root + mode: 0711 + command: "virsh {{ item }}" + with_items: + - pool-define-as mirror dir --target="{{ playbook_dir }}/disks" + - pool-build mirror + - pool-start mirror + - pool-autostart mirror + command: "virsh vol-create-as mirror {{ item }}" + with_items: + - mirror_root1.qcow2 10G + - mirror_root2.qcow2 10G + - mirror_disk1.qcow2 10G + - mirror_disk2.qcow2 10G + - mirror_disk3.qcow2 10G + - mirror_disk4.qcow2 10G + when: not poolexists.rc == 0 +- name: Create bridge network + # net.ipv4.ip_forward = 1 + command: "virsh {{ item }}" + with_items: + - net-define {{ playbook_dir }}/templates/network.xml + - net-autostart mirbr0 + - net-start mirbr0 + when: not netexists.rc == 0 +- name: Create mirror VM + command: > + virt-install + --name=mirror + --memory=2048 + --vcpus=1 + --boot uefi + --os-type linux --os-variant ubuntu20.04 + --disk path={{ playbook_dir }}/ubuntu-seed.qcow2,device=cdrom + --disk vol=mirror/mirror_root1.qcow2 + --disk vol=mirror/mirror_root2.qcow2 + --disk vol=mirror/mirror_disk1.qcow2 + --disk vol=mirror/mirror_disk2.qcow2 + --disk vol=mirror/mirror_disk3.qcow2 + --disk vol=mirror/mirror_disk4.qcow2 + --network bridge=mirbr0 + --graphics vnc,port=5911,listen=127.0.0.1 + --noautoconsole + when: not vmexists.rc == 0 + # in the vm to disable cloud-init run + # sudo touch /etc/cloud/cloud-init.disabled + + # next + # wait ? seconds (hope that vm is made in forgroud) + # update ssh config to allow root login (and add passwd to root) + # copy pub key and relogin as root diff --git a/roles/vm/tasks/main.yml b/roles/vm/tasks/main.yml new file mode 100644 index 0000000..2cd8ad9 --- /dev/null +++ b/roles/vm/tasks/main.yml @@ -0,0 +1,6 @@ +--- +- name: Configure all VMs + include_tasks: vm.yml + loop: {{ virtual_machines }} + loop_control: + loop_var: vm diff --git a/roles/vm/tasks/vm.yml b/roles/vm/tasks/vm.yml new file mode 100644 index 0000000..60e7997 --- /dev/null +++ b/roles/vm/tasks/vm.yml @@ -0,0 +1,108 @@ +--- +# Gather info +- name: Check if vm was created already + stat: + path: {{userdata}}/{{vm.name}} + register: vmexists + ignore_errors: true +- name: Check for ubuntu iso + stat: + path: {{role_path}}/files/ubuntu20_04.iso + register: isoexists + ignore_errors: true +- name: Check for ubuntu iso seed + stat: + path: {{userdata}}/{{vm.name}}/seed.qcow2 + register: seedexists + ignore_errors: true +- name: Check if storage pool exists + command: virsh pool-info mirror + register: poolexists + ignore_errors: true +- name: Check if mirbr0 network exists + command: virsh net-info mirbr0 + register: netexists + ignore_errors: true +- name: Check if mirror VM exists + command: virsh dumpxml mirror + register: vmexists + ignore_errors: true + +# Setting up VM +- name: Create directory for VM + file: + state: directory + path: {{userdata}}/{{vm.name}} + where: vmexists.stat.exists == false + +- name: Fetching ubuntu iso + get_url: + url: https://releases.ubuntu.com/20.04.3/ubuntu-20.04.3-live-server-amd64.iso + dest: {{role_path}}/files/ubuntu20_04.iso + when: isoexists.stat.exists == false + +- name: Create ubuntu iso + # install cloud-localds (cloud-image-utils) + # + # Installing VMs from Ready Images + # https://www.x386.xyz/index.php/2021/01/06/kvm-on-ubuntu-server-1/ + command: > + cloud-localds + # --network-config {{ playbook_dir }}/templates/network + {{userdata}}/{{vm.name}}/seed.qcow2 + {{role_path}}/templates/user-data + when: seedexists.stat.exists == false + +- name: Create storage pool and virtual disks for mirror + command: "virsh {{item}}" + with_items: + - pool-define-as mirror dir --target="{{userdata}}/{{vm.name}}/" + - pool-build mirror + - pool-start mirror + - pool-autostart mirror + command: "virsh vol-create-as mirror {{item}}" + with_items: + - mirror_root1.qcow2 {{vm.disk_size}} + - mirror_root2.qcow2 {{vm.disk_size}} + - mirror_disk1.qcow2 {{vm.disk_size}} + - mirror_disk2.qcow2 {{vm.disk_size}} + - mirror_disk3.qcow2 {{vm.disk_size}} + - mirror_disk4.qcow2 {{vm.disk_size}} + when: not poolexists.rc == 0 + +- name: Create bridge network + # net.ipv4.ip_forward = 1 + command: "virsh {{item}}" + with_items: + - net-define {{role_path}}/templates/network.xml + - net-autostart mirbr0 + - net-start mirbr0 + when: not netexists.rc == 0 + +- name: Create mirror VM + command: > + virt-install + --name=mirror + --memory=2048 + --vcpus=1 + --boot uefi + --os-type linux --os-variant ubuntu20.04 + --disk path={{userdata}}/{{vm.name}}/seed.qcow2,device=cdrom + --disk vol=mirror/mirror_root1.qcow2 + --disk vol=mirror/mirror_root2.qcow2 + --disk vol=mirror/mirror_disk1.qcow2 + --disk vol=mirror/mirror_disk2.qcow2 + --disk vol=mirror/mirror_disk3.qcow2 + --disk vol=mirror/mirror_disk4.qcow2 + --network bridge=mirbr0 + --graphics vnc,port=5911,listen=127.0.0.1 + --noautoconsole + when: not vmexists.rc == 0 + # in the vm to disable cloud-init run + # sudo touch /etc/cloud/cloud-init.disabled + + # next + # wait ? seconds (hope that vm is made in forgroud) + # update ssh config to allow root login (and add passwd to root) + # copy pub key and relogin as root + diff --git a/roles/vm/templates/network b/roles/vm/templates/network new file mode 100644 index 0000000..fc1d957 --- /dev/null +++ b/roles/vm/templates/network @@ -0,0 +1,12 @@ +# set up static ip +# https://askubuntu.com/questions/1029531/how-to-setup-a-static-ip-on-ubuntu-server-18-04 + +#cloud-config +version: 2 +ethernets: + enp1s0: + dhcp4: false + addresses: [ 192.168.0.221/24 ] + gateway4: 192.168.0.1 + nameservers: + addresses: [ 192.168.0.1,8.8.8.8 ] diff --git a/roles/vm/templates/network.xml b/roles/vm/templates/network.xml new file mode 100644 index 0000000..6aa9f1b --- /dev/null +++ b/roles/vm/templates/network.xml @@ -0,0 +1,14 @@ + + mirbr0 + + + + + + + + + + + + diff --git a/roles/vm/templates/user-data b/roles/vm/templates/user-data new file mode 100644 index 0000000..4684dea --- /dev/null +++ b/roles/vm/templates/user-data @@ -0,0 +1,60 @@ +#cloud-config +autoinstall: + version: 1 + identity: + hostname: mirror + username: ubuntu + # mkpasswd --method=SHA-512 --rounds=4096 + # password is just ubuntu + password: "$6$exDY1mhS4KUYCE/2$zmn9ToZwTKLhCw.b4/b.ZRTIZM30JZ4QrOQ2aOXJ8yk96xpcCof0kxKwuX1kqLG/ygbJ1f8wxED22bTL4F46P0" + locale: en_US + ssh: + allow-pw: true + authorized-keys: [] + install-server: true + storage: + config: + # disks =-=-=-=-=-=-= + - {id: vda, name: '', path: /dev/vda, type: disk, ptable: gpt, + preserve: false, grub_device: false} + - {id: vdb, name: '', path: /dev/vdb, type: disk, ptable: gpt, + preserve: false, grub_device: false} + # partitions =-=-=-=-=-= + # vda1 + - {id: vda1, type: partition, size: 500M, device: vda, number: 1, + preserve: false, wipe: superblock, flag: boot, grub_device: true} + - {id: vda1-format, type: format, volume: vda1, + fstype: fat32, preserve: false} + # vda2 + - {id: vda2, type: partition, size: 9G, device: vda, number: 2, + preserve: false, wipe: superblock, flag: '', grub_device: false} + # vdb1 + - {id: vdb1, type: partition, size: 500M, device: vdb, number: 1, + preserve: false, wipe: superblock, flag: boot, grub_device: true} + - {id: vdb1-format, type: format, volume: vdb1, + fstype: fat32, preserve: false} + # vdb2 + - {id: vdb2, type: partition, size: 9G, device: vdb, number: 2, + preserve: false, wipe: superblock, flag: '', grub_device: false} + # raid =-=-=-=-=-= + - id: md0 + name: md0 + type: raid + raidlevel: raid1 + devices: [vda2, vdb2] + spare_devices: [] + preserve: false + # lvm =-=-=-=-=-= + - id: vg0 + name: vg0 + type: lvm_volgroup + devices: [md0] + preserve: false + # partition + - {id: vg0-root, name: root, type: lvm_partition, size: 8G, + preserve: false, volgroup: vg0} + - {id: vg0-root-format, type: format, volume: vg0-root, + fstype: ext4, preserve: false} + # mount points =-=-=-=-=-= + - {id: boot-mount, type: mount, path: /boot/efi, device: vda1-format} + - {id: root-mount, type: mount, path: /, device: vg0-root-format}