Files
esh-pfi-infrastructure/playbooks/nh3-pve-2-cloudinit-vm.yaml
T

90 lines
4.1 KiB
YAML

# Generic: create a Debian 13 genericcloud VM on nh3-pve-2 with cloud-init (user vh with the operator's keys plus
# the infra-ops bootstrap key, static address on VLAN 50). Same steps as playbooks/nh3-albok-vm.yaml, parameterised.
# scripts/elway infra-ops@10.100.250.62 --playbook playbooks/nh3-pve-2-cloudinit-vm.yaml \
# --var vmid=111 --var name=nh3-svos --var ip=10.100.50.43/24 --var cores=4 --var memory=8192 --var disk=100G \
# --var tags=svos --var "description=..."
# Then: bootstrap-infra-ops-user.yaml AS vh, then the host's own base playbook (which takes the bootstrap key off vh).
vars:
vmid: ""
name: ""
ip: ""
gw: 10.100.50.1
dns: 10.100.50.40 10.250.50.70
cores: "4"
memory: "8192"
disk: 100G
tags: ""
description: ""
img_url: https://cloud.debian.org/images/cloud/trixie/latest
img: debian-13-genericcloud-amd64.qcow2
img_dir: /var/lib/vz/import
steps:
- name: refuse unless this is nh3-pve-2, vmbr0 is VLAN-aware, and the VMID and address are free
sudo: true
shell: |
set -e
test "$(hostname)" = nh3-pve-2
test "$(cat /sys/class/net/vmbr0/bridge/vlan_filtering)" = 1
if ping -c2 -W1 $(echo {{ ip }} | cut -d/ -f1) >/dev/null 2>&1; then echo "{{ ip }} ANSWERS — taken"; exit 1; fi
changed_when: "false"
when: "! qm status {{ vmid }} >/dev/null 2>&1"
- name: fetch the Debian 13 genericcloud image and check it against SHA512SUMS
sudo: true
shell: |
set -e
install -d -m 0755 {{ img_dir }}
cd {{ img_dir }}
curl -fsSL -o SHA512SUMS.trixie {{ img_url }}/SHA512SUMS
curl -fsSL -o {{ img }}.part {{ img_url }}/{{ img }}
want=$(awk '$2=="{{ img }}"{print $1}' SHA512SUMS.trixie)
test -n "$want"
echo "$want {{ img }}.part" | sha512sum -c -
mv {{ img }}.part {{ img }}
when: "! qm status {{ vmid }} >/dev/null 2>&1"
- name: create VM {{ vmid }} ({{ name }})
sudo: true
shell: |
set -e
qm create {{ vmid }} --name {{ name }} --ostype l26 --cpu x86-64-v3 --cores {{ cores }} --memory {{ memory }} \
--scsihw virtio-scsi-single --agent enabled=1 --onboot 1 --tags {{ tags }} \
--net0 virtio,bridge=vmbr0,tag=50,firewall=1 \
--serial0 socket --vga serial0 \
--description "{{ description }}"
qm set {{ vmid }} --scsi0 vmstore:0,import-from={{ img_dir }}/{{ img }},discard=on,ssd=1,iothread=1
qm disk resize {{ vmid }} scsi0 {{ disk }}
qm set {{ vmid }} --ide2 vmstore:cloudinit --boot order=scsi0
creates: /etc/pve/qemu-server/{{ vmid }}.conf
- name: cloud-init — user vh, keys, static address, resolvers
sudo: true
shell: |
set -e
k=$(mktemp)
cat > "$k" <<'EOF'
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN+1HBwfXrkfTYWdcnWCjLJ6VLAGC87gxH5h5vKaaA3c infra-ops@pfi-fleet
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKGm/lJslGEL2xDBY/7LdUc0Q4GyuxwFtGspYTe6WsVE lkrav@VHHomeG13
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDP/AwgaLghPoQi9RDt+m/9H9jLHDoP93WgzczlhZlSvZoQ5qDpWu5oAQlRwImiWhVL1ClK4FwEz9JULsta7Uq3FaiQvs2ltevrW/EpNbhAfxZa4Z1ELrPAOO8SSlhZ+Zer33SPkfJD9t3Hi9TXheCaANiEtE6hH1nCVLpHWQdbzy+L7EyG8z+/RzNXwwIL8f0BZ8n7FvFujgwc1OQTXlg4fiW3FdB3uzJMVRT59IIsPEq/ODGZZ6XGtHy24Ewcsi8l78I+oKaPdMl8ZXNBQrNb0MPIJnHkQwTrzlDKZ0Oh1UKm7I9i9hDMB/M2+aQ+6MxzY5TLZyDvRYd8R3j9Mnrp3ouCnNcklGAkX7i8hNJ2y8xCbwOeP8sMd+VtQ6hBbNa6KAEaAgGuWHHS0KGGO4HjtvDxJH8e7BnGzveIeCUGLVKMrg08w9nqF6Kzf3Y72ou0yCmnu7kKqocS1Pcr+e5E1MdT4brc2BfYkzqExLp8gxQaJ1Zas2OXPNXpAxL58xc= lkraven@nh3-dev
EOF
sed -i 's/^ *//' "$k"
qm set {{ vmid }} --ciuser vh --sshkeys "$k" --ipconfig0 ip={{ ip }},gw={{ gw }} \
--nameserver "{{ dns }}" --searchdomain nh3.internal --ciupgrade 1
rm -f "$k"
when: "! qm config {{ vmid }} | grep -q '^ciuser: vh'"
- name: start VM {{ vmid }}
sudo: true
shell: qm start {{ vmid }}
when: "! qm status {{ vmid }} | grep -q running"
verify:
- name: VM is running with the intended shape
sudo: true
shell: |
qm status {{ vmid }}
qm config {{ vmid }} | grep -E '^(name|cores|cpu|memory|net0|scsi0|ipconfig0|onboot|ciuser):'
qm status {{ vmid }} | grep -q running
changed_when: "false"