From 05c509cd9a1e920e818597e0f230735a65e64c6b Mon Sep 17 00:00:00 2001 From: Patrick Marchand Date: Tue, 12 Nov 2019 08:31:26 -0500 Subject: [PATCH] Added experimental kvm-guest role Can handle adding volumes with DRBD over LVM and provision new virtual machines using these volumes. --- kvm-guest/handlers/main.yml | 19 ++++++++++ kvm-guest/tasks/llvm_over_drbd.yml | 60 ++++++++++++++++++++++++++++++ kvm-guest/tasks/main.yml | 37 ++++++++++++++++++ kvm-guest/templates/drbd_vm.res.j2 | 28 ++++++++++++++ 4 files changed, 144 insertions(+) create mode 100644 kvm-guest/handlers/main.yml create mode 100644 kvm-guest/tasks/llvm_over_drbd.yml create mode 100644 kvm-guest/tasks/main.yml create mode 100644 kvm-guest/templates/drbd_vm.res.j2 diff --git a/kvm-guest/handlers/main.yml b/kvm-guest/handlers/main.yml new file mode 100644 index 00000000..3e912344 --- /dev/null +++ b/kvm-guest/handlers/main.yml @@ -0,0 +1,19 @@ +- name: 'primary DRBD was changed' + command: 'drbdadm adjust all' + delegate_to: "{{ kvm-guest__primary }}" + +- name: 'secondary DRBD was changed' + command: 'drbdadm adjust all' + delegate_to: "{{ kvm-guest__secondary }}" + +- name: 'new primary DRBD' + command: ""drbdadm create-md '{{ kvm-guest__name }}'"" + delegate_to "{{ kvm-guest__primary }}" + listen: 'primary DRBD was changed' + when: kvm-guest__drbd_primary_ressource.stat.exists == False + +- name: 'new secondary DRBD' + command: ""drbdadm create-md '{{ kvm-guest__name }}'"" + delegate_to "{{ kvm-guest__secondary }}" + listen: 'secondary DRBD was changed' + when: kvm-guest__drbd_secondary_ressource.stat.exists == False diff --git a/kvm-guest/tasks/llvm_over_drbd.yml b/kvm-guest/tasks/llvm_over_drbd.yml new file mode 100644 index 00000000..516d4ad0 --- /dev/null +++ b/kvm-guest/tasks/llvm_over_drbd.yml @@ -0,0 +1,60 @@ +--- + +- name: "create logical volumes for {{ kvm-guest__name }} on kvm cloud" + block: + - name: "create logical volumes on {{ kvm-guest__primary }}" + lvol: + vg: "{{ item.group }}"' + lv: "{{ item.name }}" + size: "{{ item.size }}" + with_items: "{{ kvm-guest__volumes }}" + delegate_to: "{{ kvm-guest__primary }}" + + - name: 'create logical volumes on {{ kvm-guest__secondary }}"' + lvol: + vg: "{{ item.group }}"' + lv: "{{ item.name }}" + size: "{{ item.size }}" + with_items: "{{ kvm-guest__volumes }}" + delegate_to: "{{ kvm-guest__secondary }}" + +- name: "create DRBD ressources for {{ kvm-guest__name }} on kvm cloud" + block: + - name: "check if DRBD ressource definition on {{ kvm-guest__primary }} exists" + stat: + path: "/etc/drbd.d/{{ kvm-guest__name }}.res" + delegate_to: "{{ kvm-guest__primary }}" + register: kvm-guest__drbd_primary_ressource + + - name: "check if DRBD ressource definition on {{ kvm-guest__secondary }} exists" + stat: + path: "/etc/drbd.d/{{ kvm-guest__name }}.res" + delegate_to: "{{ kvm-guest__secondary }}" + register: kvm-guest__drbd_secondary_ressource + + - name: "update DRBD ressource definition on {{ kvm-guest__primary }}" + template: + src: 'drbd_vm.res.j2' + dest: "/etc/drbd.d/{{ kvm-guest__name }}.res" + validate: 'drbdadm -d adjust all' + delegate_to: "{{ kvm-guest__primary }}" + notifies: 'primary DRBD was changed' + + - name: 'update DRBD ressource definition on {{ kvm-guest__secondary }}"' + template: + src: 'drbd_vm.res.j2' + dest: "/etc/drbd.d/{{ kvm-guest__name }}.res" + validate: 'drbdadm -d adjust all' + delegate_to: "{{ kvm-guest__secondary }}" + notifies: 'secondary DRBD was changed' + + - name: 'synchronize DRBD ressources' + command: "drbdadm -- --overwrite-data-of-peer primary {{ kvm-guest__name }}" + delegate_to: "{{ kvm-guest__primary }}" + +- name: "Define {{ kvm-guest__name }}" + virt: + command: define + xml: "{{ lookup('template', 'vm_template.xml.j2') }}" + autostart: true + delegate_to: "{{ kvm-guest__primary }}" diff --git a/kvm-guest/tasks/main.yml b/kvm-guest/tasks/main.yml new file mode 100644 index 00000000..5f871a51 --- /dev/null +++ b/kvm-guest/tasks/main.yml @@ -0,0 +1,37 @@ +--- + +- name: "create logical volumes for {{ kvm-guest__name }} on kvm cloud" + block: + - name: "create logical volumes on {{ kvm-guest__primary }}" + lvol: + vg: "{{ item.group }}"' + lv: "{{ item.name }}" + size: "{{ item.size }}" + with_items: "{{ kvm-guest__volumes }}" + delegate_to: "{{ kvm-guest__primary }}" + register: kvm-guest_primary_lvm + + - name: 'create logical volumes on {{ kvm-guest__secondary }}"' + lvol: + vg: "{{ item.group }}"' + lv: "{{ item.name }}" + size: "{{ item.size }}" + with_items: "{{ kvm-guest__volumes }}" + delegate_to: "{{ kvm-guest__secondary }}" + when: kvm-guest_primary_lvm + +- name: "create DRBD ressources for {{ kvm-guest__name }} on kvm cloud" + block: + - name: "create DRBD ressource on {{ kvm-guest__primary }}" + template: + src: 'drbd_vm.res.j2' + dest: "/etc/drbd.d/{{ kvm-guest__name }}.res" + delegate_to: "{{ kvm-guest__primary }}" + register: kvm-guest_primary_lvm + + - name: 'create DRBD ressource on {{ kvm-guest__secondary }}"' + template: + src: 'drbd_vm.res.j2' + dest: "/etc/drbd.d/{{ kvm-guest__name }}.res" + delegate_to: "{{ kvm-guest__secondary }}" + when: kvm-guest_primary_lvm diff --git a/kvm-guest/templates/drbd_vm.res.j2 b/kvm-guest/templates/drbd_vm.res.j2 new file mode 100644 index 00000000..1333865f --- /dev/null +++ b/kvm-guest/templates/drbd_vm.res.j2 @@ -0,0 +1,28 @@ +resource "{{ kvm-guest__name }}" { + net { + cram-hmac-alg "sha1"; + shared-secret "{{ kvm-guest__drbd_secret }}"; + # Si pas de lien dediƩ 10G, passer en protocol A + # Et desactiver allow-two-primaries; + protocol C; + allow-two-primaries; + # Tuning perf. + #max-buffers 8000; + #max-epoch-size 8000; + #sndbuf-size 0; + } +{% for volume in kvm-guest__volumes %} + volume {{ loop.index }} { + device minor {{ volume.device }}; + disk /dev/{{ volume.group }}/{{ volume.name }}; + meta-disk internal; + } +{% endfor %} + + on {{ kvm-guest__primary }} { + address {{ kvm-guest__primary_ip }}:{{ kvm-guest__port }}; + } + on {{ kvm-guest__secondary }} { + address {{ kvm-guest__secondary_ip }}:{{ kvm-guest__port }}; + } +}