initial commit
This commit is contained in:
commit
74412c51a4
9 changed files with 229 additions and 0 deletions
42
README.md
Normal file
42
README.md
Normal file
|
@ -0,0 +1,42 @@
|
|||
# Proxmox Management
|
||||
|
||||
This repo contains script used to manage a multi-tenant proxmox environment for the [Reudnetz w.V.]().
|
||||
These scripts were created because ansible currently lacks modules to configure users and groups.
|
||||
|
||||
**Please take note of all the orgas, users and vms you've created -- this collection does not keep track of that**
|
||||
|
||||
## Overview
|
||||
|
||||
We use users, groups, resource pools, and roles to build a multi-tenante proxmox instance.
|
||||
|
||||
The idea is that virtual machines/containers are created by an admin and moved into a resource pool that is
|
||||
|
||||
|
||||
## Requirements
|
||||
|
||||
* zfs storage pool for customer compartments:
|
||||
* _change in `create_organisation`_
|
||||
|
||||
* storage pool for customer vm disks:
|
||||
* `zfs create rpool/customer-disks`
|
||||
* `pvesm add zfspool customer-disks --pool rpool/customer-disks --content images`
|
||||
* _change in `create_vm`_
|
||||
|
||||
* bridge for customer vms
|
||||
* _change in `create_vm`_
|
||||
* needs to be tag aware
|
||||
* vms tag there traffic with the vmid
|
||||
|
||||
## Create a new VM
|
||||
|
||||
information you need to get beforehand from the custome:
|
||||
- organisation
|
||||
- username
|
||||
- mail
|
||||
|
||||
**step 1: create an organisation**
|
||||
* (if one does not already exist)
|
||||
* `./create_organisation <name>`
|
||||
|
||||
**step 2: create the user account**
|
||||
|
32
create_organisation
Executable file
32
create_organisation
Executable file
|
@ -0,0 +1,32 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
ZFS_PARENT_PATH=rpool/customer
|
||||
|
||||
ORGA=$1
|
||||
|
||||
usage() {
|
||||
printf "usage: %s <organisation_name>\n" $0
|
||||
}
|
||||
|
||||
# check if we where correctly called
|
||||
[ $# != 1 ] && usage && exit 1
|
||||
|
||||
# create group for organisation
|
||||
pveum group add "${ORGA}" --comment "group for the organisation '${ORGA}'"
|
||||
|
||||
# create resource pool for the organisation
|
||||
pveum pool add "${ORGA}" --comment "pool for the organisation '${ORGA}'"
|
||||
|
||||
# allow group to access resource pool
|
||||
pveum acl modify "/pool/${ORGA}/" --roles PVEVMUser,PVEDatastoreAdmin,RDNTZVMSnapshot --groups "${ORGA}"
|
||||
|
||||
# create zfs filesystem for isos, backups and stuff
|
||||
zfs create -o quota=150G -p "${ZFS_PARENT_PATH}/${ORGA}-images"
|
||||
|
||||
# create proxmox storage ontop of zfs filesystem
|
||||
pvesm add dir "${ORGA}-images" --path "/${ZFS_PARENT_PATH}/${ORGA}-images" --content vztmpl,iso,backup,backup
|
||||
|
||||
# add storage into storage pool
|
||||
pveum pool modify "${ORGA}" --storage "${ORGA}-images"
|
21
create_user
Executable file
21
create_user
Executable file
|
@ -0,0 +1,21 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
USER="$1@pve"
|
||||
MAIL="$2"
|
||||
ORGA="$3"
|
||||
PASS="$(openssl rand -base64 24)"
|
||||
|
||||
usage() {
|
||||
printf "usage: $0 <username> <mail> <organisation>\n" $0
|
||||
}
|
||||
|
||||
# check usage
|
||||
[ $# != 3 ] && usage && exit 1
|
||||
|
||||
# create user
|
||||
pveum user add "${USER}" --comment "user account for '${USER}'" --email "${MAIL}" --groups "${ORGA}" --password "${PASS}"
|
||||
|
||||
# print password for user
|
||||
echo "${PASS}"
|
43
create_vm
Executable file
43
create_vm
Executable file
|
@ -0,0 +1,43 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
CPUS=1
|
||||
MEMORY=512
|
||||
BRIDGE=vmbr0
|
||||
STORAGE=customer-disks
|
||||
OS_TYPE=l26
|
||||
DISK_IMAGE=/root/images/debian-12-genericcloud-amd64.qcow2
|
||||
|
||||
ID=$1
|
||||
NAME=$2
|
||||
ORGA=$3
|
||||
|
||||
usage() {
|
||||
printf "usage: %s <id> <name> <organisation>\n" $0
|
||||
}
|
||||
|
||||
[ $# != 3 ] && usage && exit 1
|
||||
|
||||
# create vm
|
||||
qm create "${ID}" \
|
||||
--cpu x86-64-v3 \
|
||||
--cores ${CPUS} \
|
||||
--memory ${MEMORY} \
|
||||
--name "${NAME}" \
|
||||
--net0 "bridge=${BRIDGE},model=virtio,tag=${ID}" \
|
||||
--onboot 1 \
|
||||
--ostype ${OS_TYPE} \
|
||||
--pool "${ORGA}" \
|
||||
--scsihw virtio-scsi-pci \
|
||||
--sata0 media=cdrom,file=none \
|
||||
--ide2 ${STORAGE}:cloudinit
|
||||
|
||||
# import debian cloud image
|
||||
qm set ${ID} --virtio0 ${STORAGE}:0,import-from=${DISK_IMAGE}
|
||||
|
||||
# resize imported disk to 50GB
|
||||
qm disk resize ${ID} virtio0 50G
|
||||
|
||||
# change boot device to debian cloud image
|
||||
qm set ${ID} --boot order=virtio0
|
27
delete_organisation
Executable file
27
delete_organisation
Executable file
|
@ -0,0 +1,27 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
ORGA=$1
|
||||
|
||||
usage() {
|
||||
printf "usage: %s <organisation_name>\n" $0
|
||||
}
|
||||
|
||||
# check if we where correctly called
|
||||
[ $# != 1 ] && usage && exit 1
|
||||
|
||||
# remove storage from storage pool
|
||||
pveum pool modify "${ORGA}" --storage "${ORGA}-images" --delete
|
||||
|
||||
# remove proxmox storage object
|
||||
pvesm remove "${ORGA}-images"
|
||||
|
||||
# nuke zfs filesystem with isos and backups
|
||||
zfs destroy rpool/customer/${ORGA}-images
|
||||
|
||||
# delete resource pool for the organisation
|
||||
pveum pool delete "${ORGA}"
|
||||
|
||||
# delete group
|
||||
pveum group delete "${ORGA}"
|
13
delete_user
Executable file
13
delete_user
Executable file
|
@ -0,0 +1,13 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
USER=$1
|
||||
|
||||
usage() {
|
||||
printf "usage: %s <username>\n"
|
||||
}
|
||||
|
||||
[ $# != 1 ] && usage && exit 1
|
||||
|
||||
pveum user delete "${USER}"
|
13
delete_vm
Executable file
13
delete_vm
Executable file
|
@ -0,0 +1,13 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
ID=$1
|
||||
|
||||
usage() {
|
||||
printf "usage: %s <id>\n" $0
|
||||
}
|
||||
|
||||
[ $# != 1 ] && usage && exit 1
|
||||
|
||||
qm destroy "${ID}"
|
11
get_linklocal_for_vm
Executable file
11
get_linklocal_for_vm
Executable file
|
@ -0,0 +1,11 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
mac_to_ipv6_ll() {
|
||||
IFS=':'; set $1; unset IFS
|
||||
echo "fe80::$(printf %02x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6"
|
||||
}
|
||||
|
||||
|
||||
mac_to_ipv6_ll $(qm config $1 | grep -oE ..:..:..:..:..:.. | tr '[:upper:]' '[:lower:]')
|
27
manage_autostart
Executable file
27
manage_autostart
Executable file
|
@ -0,0 +1,27 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
PARAM=$1
|
||||
|
||||
qm list | tail -n +2 | awk '{ print $1 }' | while read vmid
|
||||
do
|
||||
case $PARAM in
|
||||
0|1)
|
||||
qm set $vmid --onboot $PARAM
|
||||
;;
|
||||
"")
|
||||
qm config $vmid | grep -e onboot: -e name:
|
||||
;;
|
||||
*)
|
||||
cat << EOF
|
||||
usage: manage autostart behaviour of vms on node
|
||||
|
||||
$0 show autstart state for alle vms on node
|
||||
$0 <0|1> disables or enables autostart for all vms on node
|
||||
$0 help this help
|
||||
EOF
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
Loading…
Reference in a new issue