Podman & Bash pour créer des pseudos VM

Print Friendly, PDF & Email

C’était un script que j’ai partagé en tout premier sur la chaine youtube Xavki. Et avec le temps il a mal vieilli malheureusement. Le script en lui-même reste encore valable mais docker ne permet plus de faire le travail.

En effet, depuis l’arrivée des cgroup v2, docker ne permet plus de passer un priviledged à true et de bénéficier à l’intérieur de conteneur des montages nécessaires pour systemd.

Du coup, il me restait deux solutions :

  • soit utiliser lxc/lxd et ses conteneurs de type système
  • soit passer à podman en lançant les conteneurs en tant que root

Finalement, j’ai choisi le deuxième.

Donc c’était partie pour podman pour qui je ne pensais pas y confier tant de choses lol. En effet, ce script m’est très utile pour faire des tests et des dev en tout genre.

Alors du coup j’en ai profité pour revoir le script et vous proposer une nouvelle mouture.

Et la voici :

#!/usr/bin/bash

###############################################################
#  TITRE: 
#
#  AUTEUR:   Xavier
#  VERSION: 
#  CREATION:  
#  MODIFIE: 
#
#  DESCRIPTION: 
###############################################################

set -eo pipefail

# Variables ###################################################

CONTAINER_USER=$(sudo printenv SUDO_USER)
ANSIBLE_DIR="ansible_dir"

# Functions ###################################################

help(){
  echo "
Usage: $0 
-c <number> : create container and add the number of containers
-i : information (ip and name)
-s : start all containers created by this script
-t : same to stop all containers
-d : same for drop all containers
-a : create an inventory for ansible with all ips
  "
}

createContainers(){
  CONTAINER_NUMBER=$1
  CONTAINER_HOME=/home/${CONTAINER_USER}
  CONTAINER_CMD="sudo podman exec "

	# Calcul du id à utiliser
  id_already=`sudo podman ps -a --format '{{ .Names}}' | awk -v user="${CONTAINER_USER}" '$1 ~ "^"user {count++} END {print count}'`
  id_min=$((id_already + 1))
  id_max=$((id_already + ${CONTAINER_NUMBER}))
  
	# Création des conteneurs en boucle
	for i in $(seq $id_min $id_max);do
		sudo podman run -d --systemd=true --publish-all=true -v /srv/data:/srv/data --name ${CONTAINER_USER}-debian-$i -h ${CONTAINER_USER}-debian-$i docker.io/priximmo/buster-systemd-ssh
		${CONTAINER_CMD} ${CONTAINER_USER}-debian-$i /bin/sh -c "useradd -m -p sa3tHJ3/KuYvI ${CONTAINER_USER}"
		${CONTAINER_CMD} ${CONTAINER_USER}-debian-$i /bin/sh -c "mkdir -m 0700 ${CONTAINER_HOME}/.ssh && chown ${CONTAINER_USER}:${CONTAINER_USER} ${CONTAINER_HOME}/.ssh"
		sudo podman cp ${HOME}/.ssh/id_rsa.pub ${CONTAINER_USER}-debian-$i:${CONTAINER_HOME}/.ssh/authorized_keys
		${CONTAINER_CMD} ${USERNAME}-debian-$i /bin/sh -c "chmod 600 ${CONTAINER_HOME}/.ssh/authorized_keys && chown ${CONTAINER_USER}:${CONTAINER_USER} ${CONTAINER_HOME}/.ssh/authorized_keys"
		${CONTAINER_CMD} ${CONTAINER_USER}-debian-$i /bin/sh -c "echo '${CONTAINER_USER}   ALL=(ALL) NOPASSWD: ALL'>>/etc/sudoers"
		${CONTAINER_CMD} ${CONTAINER_USER}-debian-$i /bin/sh -c "service ssh start"
	done

	infosContainers

  exit 0
}

infosContainers(){
	echo ""
	echo "Informations des conteneurs : "
	echo ""
  sudo podman ps -aq | awk '{system("sudo podman inspect -f \"{{.Name}} -- IP: {{.NetworkSettings.IPAddress}}\" "$1)}'
	echo ""
  exit 0
}

dropContainers(){
  sudo podman ps -a --format {{.Names}} | awk -v user=${CONTAINER_USER} '$1 ~ "^"user {print $1" - dropping...";system("sudo podman rm -f "$1)}'
  infosContainers
}

startContainers(){
  sudo podman ps -a --format {{.Names}} | awk -v user=${CONTAINER_USER} '$1 ~ "^"user {print $1" - starting...";system("sudo podman start "$1)}'
  infosContainers
}

stopContainers(){
  sudo podman ps -a --format {{.Names}} | awk -v user=${CONTAINER_USER} '$1 ~ "^"user {system(print $1" - stopping...";"sudo podman stop "$1)}'
  infosContainers
}

createAnsible(){
	echo ""
  mkdir -p ${ANSIBLE_DIR}
  echo "all:" > ${ANSIBLE_DIR}/00_inventory.yml
  echo "  vars:" >> ${ANSIBLE_DIR}/00_inventory.yml
  echo "    ansible_python_interpreter: /usr/bin/python3" >> ${ANSIBLE_DIR}/00_inventory.yml
  echo "  hosts:" >> ${ANSIBLE_DIR}/00_inventory.yml
  sudo podman ps -aq | awk '{system("sudo podman inspect -f \"    {{.NetworkSettings.IPAddress}}:\" "$1)}' >> ${ANSIBLE_DIR}/00_inventory.yml
  mkdir -p ${ANSIBLE_DIR}/host_vars
  mkdir -p ${ANSIBLE_DIR}/group_vars
	echo ""
}


# Let's Go !! #################################################

if [ "$#" -eq  0 ];then
help
fi

while getopts ":c:ahitsd" options; do
  case "${options}" in 
		a)
			createAnsible
			;;
    c)
			createContainers ${OPTARG}
      ;;
		i)
			infosContainers
			;;
		s)
			startContainers
			;;
		t)
			stopContainers
			;;
		d)
			dropContainers
			;;
    h)
      help
      exit 1
      ;;
    *)
      help
      exit 1
      ;;
  esac
done

Voilà je vous laisse en faire la relecture et vous pouvez bien sûr en trouver l’explication dans la revue faite dans la vidéo youtube.

Découvrez  Un peu de tutoriels GitLab pour se former