L’installation applicative utilise des scripts Ansible. Pour pouvoir les lancer un conteneur a été créé afin de s’assurer de la bonne adéquation de la version requise.
Dockerfile du conteneur :
FROM alpine:3.19
LABEL author="Serge NOEL <serge.noel@easylinux.fr>"
RUN apk add openssh-client libvirt ansible
COPY Files /
WORKDIR /data
VOLUME /data
ENTRYPOINT ["/usr/local/bin/entrypoint"]
Contenu du script entryPoint
#!/bin/sh
echo "Do nothing"
while true
do
echo "."
sleep 30
done
NB :
- ce conteneur est prévu pour fonctionner en interactif, il attend une connection en bash
- une version pré-compilée est disponible ici
Le déploiement des templates Proxmox utilise cet outil
NB : a l’heure de l’écriture de ces lignes
Terraformne fonctionnait pas correctement avec Proxmox cet utilitaire est un contournement
Dockerfile du conteneur :
FROM alpine:3.19
LABEL author="Serge NOEL <serge.noel@easylinux.fr>"
RUN apk add opentofu xorriso openssh-client libvirt
COPY Files /
WORKDIR /data
VOLUME /data
ENTRYPOINT ["/usr/local/bin/entrypoint"]
Contenu du script entryPoint
#!/bin/sh
echo "Do nothing"
while true
do
echo "."
sleep 30
done
Contenu de iaac
#!/usr/bin/python3
import sys, yaml
##########
## main ##
##########
# Nom du fichier de config passé en parametre
aArgs = sys.argv
# Ouvrir le fichier
fYaml = open(aArgs[1],'r')
sYaml = fYaml.read()
fYaml.close()
dYaml = yaml.safe_load(sYaml)
# Connexion au DC
match dYaml['iaac']['infra']['credentials']['type']:
case "proxmox-pwd":
import pmx
hProxmox = pmx.initProxmox(dYaml)
print("Connecté au DC")
for dVM in dYaml['iaac']['infra']['vms']:
print("Analyse de " + dVM['name'])
if pmx.searchVM(hProxmox, dVM) == True:
print(" " + dVM['name'] + " existe")
else:
pmx.createVM(hProxmox, dVM)
case "_":
print("Systeme non géré")
exit(0)
# NOTE: please remember that the template must have Cloud-init (or equivalent)
# pre-installed and pre-configured for first boot. (see above template sections)
Contenu de pmx.py
from proxmoxer import ProxmoxAPI
import time
from urllib import parse as urlparse
def initProxmox(dYaml):
dCred = dYaml['iaac']['infra']['credentials']
hProxmox = ProxmoxAPI(dCred['host'],user=dCred['user'],password=dCred['password'], verify_ssl=dCred['secure'])
return hProxmox
def copyTemplate(hProxmox, VM):
iNewID = int(hProxmox.cluster.nextid.get())
print(" Clone du template ",end='',flush=True)
dCloneTask = hProxmox.nodes(VM['node']).qemu(VM['template-id']).clone.create(newid= iNewID, full=1, name=VM['name'])
while( hProxmox.nodes(VM['node']).tasks(dCloneTask).status.get()['status'] == 'running' ):
print(".",end='',flush=True)
time.sleep(5)
print("OK")
return iNewID
def readKey(sKeyFile):
# SSH_KEYS = "ssh-rsa ..." # contents of '~/ssh/id_rsa.pub'
fKey = open(sKeyFile,'r')
sSshKey = fKey.read()
fKey.close()
sEncodedKey = urlparse.quote(sSshKey, safe='')
return sEncodedKey
def setConfig(hProxmox, iID, VM, sKey):
print(" Configuration de la machine")
# Set the userdata as desired BEFORE starting the machine:
hProxmox.nodes(VM['node']).qemu(iID).config.set(
ciuser=VM['user'],
cores=VM['cpus'],
description=VM['description'],
keyboard="fr",
memory=VM['memory'],
ostype="l26",
sshkeys=sKey,
ipconfig0="ip="+VM['network'][0]['address']+",gw="+VM['network'][0]['gateway'],
nameserver=VM['network'][0]['nameserver'],
searchdomain=VM['network'][0]['domain']
)
def resizeDisk(hProxmox, iID, VM):
print(" Augmentation de la taille du disque")
hProxmox.nodes(VM['node']).qemu(iID).resize.put(disk="virtio0", size=VM['disk'])
def startVm(hProxmox, iID, VM):
print(" Démarrage...")
hProxmox.nodes(VM['node']).qemu(iID).status.start.create()
def createVM(hProxmox, VM):
iNewID = copyPmxTemplate(hProxmox, VM)
iNewID = 100
sKey = readKey(VM['key-file'])
setPmxConfig(hProxmox, iNewID, VM, sKey)
resizePmxDisk(hProxmox, iNewID, VM)
startPmxVm(hProxmox, iNewID, VM)
def searchVM(hProxmox, VM):
# Rechercher si machine existe
dVMs = hProxmox.nodes(VM['node']).qemu.get()
bFound = False
for dVM in dVMs:
if dVM['name'] == VM['name']:
bFound = True
return bFound
Contenu de config.yaml
iaac:
infra:
credentials:
host: '<addr ip>'
secure: False
user: "<login pmx>"
password: "<pmx pass>"
type: "proxmox-pwd"
token: ""
token-id: ""
vms:
- name: "k8s-master-001"
description: "Machine master K8s-03"
cpus: 4
memory: "2048"
disk: "32G"
user: "installer"
key-file: "/root/.ssh/id_rsa.pub"
template-id: 5002
node: "srv-001"
network:
- name: "net0"
address: "192.168.1.200/24"
gateway: "192.168.1.254"
nameserver: "192.168.1.254"
domain: "easylinux.lan"
... autres VMs
NB :
- ce conteneur est prévu pour fonctionner en interactif, il attend une connection en bash
- une version pré-compilée est Ansible.tar
- une version pré-compilée est Opentofu.tar