docs: add pve, opentofu, cloudinit article
This commit is contained in:
parent
c48ee905df
commit
ecaea9db49
7 changed files with 544 additions and 0 deletions
|
@ -0,0 +1,10 @@
|
||||||
|
#cloud-config
|
||||||
|
hostname: test-debian-12
|
||||||
|
users:
|
||||||
|
- name: ephase
|
||||||
|
gecos: My simple user
|
||||||
|
ssh_authorized_keys:
|
||||||
|
- ssh-ed25519 AAbB...
|
||||||
|
lock_passwd: false
|
||||||
|
sudo: ['ALL=(ALL) NOPASSWD:ALL']
|
||||||
|
shell: /bin/bash
|
|
@ -0,0 +1,6 @@
|
||||||
|
#cloud-config
|
||||||
|
package_update: true
|
||||||
|
packages:
|
||||||
|
- qemu-guest-agent
|
||||||
|
runcmd:
|
||||||
|
- systemctl enable --now qemu-guest-agent
|
|
@ -0,0 +1,85 @@
|
||||||
|
resource "proxmox_virtual_environment_download_file" "debian_12" {
|
||||||
|
content_type = "iso"
|
||||||
|
datastore_id = "local"
|
||||||
|
file_name = "debian-12-generic-amd64.img"
|
||||||
|
node_name = var.pve_node
|
||||||
|
url = var.debian_image_url
|
||||||
|
checksum = var.debian_image_checksum
|
||||||
|
checksum_algorithm = var.debian_image_checksum_algorithm
|
||||||
|
overwrite = true
|
||||||
|
overwrite_unmanaged = true
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "proxmox_virtual_environment_file" "user_config" {
|
||||||
|
content_type = "snippets"
|
||||||
|
datastore_id = "local"
|
||||||
|
node_name = var.pve_node
|
||||||
|
|
||||||
|
source_raw {
|
||||||
|
data = file("cloud-init/user-config.yaml")
|
||||||
|
file_name = "user-config.yaml"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "proxmox_virtual_environment_file" "vendor_config" {
|
||||||
|
content_type = "snippets"
|
||||||
|
datastore_id = "local"
|
||||||
|
node_name = var.pve_node
|
||||||
|
|
||||||
|
source_raw {
|
||||||
|
data = file("cloud-init/vendor-config.yaml")
|
||||||
|
file_name = "vendor-config.yaml"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "proxmox_virtual_environment_vm" "debian_12_test" {
|
||||||
|
depends_on = [
|
||||||
|
proxmox_virtual_environment_file.user_config,
|
||||||
|
proxmox_virtual_environment_file.vendor_config
|
||||||
|
]
|
||||||
|
name = "debian-12"
|
||||||
|
description = "Debian 12 created with Terraform"
|
||||||
|
tags = ["terraform", "debian"]
|
||||||
|
node_name = var.pve_node
|
||||||
|
|
||||||
|
cpu {
|
||||||
|
cores = 2
|
||||||
|
}
|
||||||
|
memory {
|
||||||
|
dedicated = 2048
|
||||||
|
floating = 2048
|
||||||
|
}
|
||||||
|
|
||||||
|
disk {
|
||||||
|
datastore_id = "local-lvm"
|
||||||
|
file_id = proxmox_virtual_environment_download_file.debian_12.id
|
||||||
|
interface = "virtio0"
|
||||||
|
iothread = true
|
||||||
|
discard = "on"
|
||||||
|
ssd = true
|
||||||
|
}
|
||||||
|
network_device {
|
||||||
|
bridge = "vmbr0"
|
||||||
|
model = "virtio"
|
||||||
|
}
|
||||||
|
operating_system {
|
||||||
|
type = "l26"
|
||||||
|
}
|
||||||
|
agent {
|
||||||
|
enabled = true
|
||||||
|
}
|
||||||
|
initialization {
|
||||||
|
ip_config {
|
||||||
|
ipv4 {
|
||||||
|
address = "dhcp"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# Link cloud-init yaml files
|
||||||
|
user_data_file_id = proxmox_virtual_environment_file.user_config.id
|
||||||
|
vendor_data_file_id = proxmox_virtual_environment_file.vendor_config.id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
output "debian_12_test_ip_address" {
|
||||||
|
value = proxmox_virtual_environment_vm.debian_12_test.ipv4_addresses
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
|
||||||
|
terraform {
|
||||||
|
required_version = "> 1.6.0"
|
||||||
|
required_providers {
|
||||||
|
proxmox = {
|
||||||
|
source = "bpg/proxmox"
|
||||||
|
version = "0.64.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
provider "proxmox" {
|
||||||
|
endpoint = var.pve_endpoint
|
||||||
|
username = var.pve_username
|
||||||
|
password = var.pve_password
|
||||||
|
insecure = var.pve_insecure
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
variable "pve_insecure" {
|
||||||
|
type = bool
|
||||||
|
description = "Enable insecure connexion"
|
||||||
|
default = true
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "pve_endpoint" {
|
||||||
|
type = string
|
||||||
|
description = "API endpoint URL"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "pve_password" {
|
||||||
|
type = string
|
||||||
|
description = "Password"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "pve_username" {
|
||||||
|
type = string
|
||||||
|
description = "Username"
|
||||||
|
}
|
||||||
|
variable "pve_node" {
|
||||||
|
type = string
|
||||||
|
description = "Node where install elements"
|
||||||
|
default = ""
|
||||||
|
}
|
||||||
|
variable "debian_image_url" {
|
||||||
|
type = string
|
||||||
|
description = "The URL for the latest Debian 12 Bookworm qcow2 image"
|
||||||
|
default = ""
|
||||||
|
}
|
||||||
|
variable "debian_image_checksum_algorithm" {
|
||||||
|
type = string
|
||||||
|
description = "Checksum algo used by image"
|
||||||
|
default = "sha512"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "debian_image_checksum" {
|
||||||
|
type = string
|
||||||
|
description = "SHA Digest of the image"
|
||||||
|
default = ""
|
||||||
|
}
|
Binary file not shown.
After Width: | Height: | Size: 200 KiB |
385
content/articles/2024/pve_opentofu_debian_cloudinit/index.md
Normal file
385
content/articles/2024/pve_opentofu_debian_cloudinit/index.md
Normal file
|
@ -0,0 +1,385 @@
|
||||||
|
Title: Instancier une machine virtuelle Debian dans Proxmox avec OpenTofu et Cloud-Init
|
||||||
|
Category: sysadmin
|
||||||
|
Tags: OpenTofu, Debian, Cloud-Init
|
||||||
|
Date: 2024-11-08 0:04
|
||||||
|
Cover: assets/backgrounds/turris_ssh_cle.jpg
|
||||||
|
status: published
|
||||||
|
|
||||||
|
Installer une machine virtuelle dans [Proxmox VE][proxmox] n'est pas une tâche
|
||||||
|
très sympa. Mais heureusement il est possible de l'automatiser en
|
||||||
|
utilisant [OpenTofu][opentofu] et [Cloud-Init][cloudinit]. C'est ce que nous
|
||||||
|
allons faire dans cet article en installant une machine Debian.
|
||||||
|
|
||||||
|
## Préparer OpenTofu
|
||||||
|
|
||||||
|
Je pars du principe que vous avez déjà une installation fonctionnelle de
|
||||||
|
[Proxmox VE][proxmox] et d'OpenTofu.
|
||||||
|
|
||||||
|
Pour permettre à OpenTofu de communiquer avec notre instance, nous utiliserons
|
||||||
|
le provider écrit par *Pavel Boldyrev* dont le code est disponible [sur
|
||||||
|
GitHub][bgp_pve_terraform]
|
||||||
|
|
||||||
|
Commençons par créer un dossier pour notre projet OpenTofu et à l'intérieur un
|
||||||
|
fichier `provider.tf` avec le contenu suivant:
|
||||||
|
|
||||||
|
```terraform
|
||||||
|
{! content/articles/2024/pve_opentofu_debian_cloudinit/files/provider.tf !}
|
||||||
|
```
|
||||||
|
|
||||||
|
Le premier bloc nous permet de déclarer les *providers* utilisés, bon ici nous
|
||||||
|
en avons un seul...
|
||||||
|
|
||||||
|
Le second est là pour configurer notre *provider Proxmox* en lui donnant les
|
||||||
|
informations utiles pour qu'il se connecte à l'API. Nous utilisons des variables
|
||||||
|
que nous définirons... Maintenant!
|
||||||
|
|
||||||
|
## Définir nos variables
|
||||||
|
|
||||||
|
Maintenant que notre *provider* est configuré, nous pouvons passer à la
|
||||||
|
définition de nos variables dans le fichier `variables.tf`:
|
||||||
|
|
||||||
|
```terraform
|
||||||
|
{! content/articles/2024/pve_opentofu_debian_cloudinit/files/variables.tf !}
|
||||||
|
```
|
||||||
|
|
||||||
|
Afin de donner des valeurs à nos variables, ajoutons le fichier `
|
||||||
|
terraform.tfvars` qui sera lu automatiquement par *OpenTofu*:
|
||||||
|
|
||||||
|
```terraform
|
||||||
|
# PVE informations
|
||||||
|
pve_endpoint = "https://192.168.0.200"
|
||||||
|
pve_username = "root"
|
||||||
|
pve_password = "Mysup3rPassW0rd"
|
||||||
|
pve_node = "pve01"
|
||||||
|
pve_insecure = true
|
||||||
|
|
||||||
|
# Debian images
|
||||||
|
debian_image_url = "https://cloud.debian.org/images/cloud/bookworm/20241004-1890/debian-12-generic-amd64-20241004-1890.qcow2"
|
||||||
|
debian_image_checksum = "da84d609d7ec5645dae1df503ea72037b2a831401d1b42ce2e7ec2a840b699f07ca8aea630853a3d5430839268c2bd337be45d89498264c36a9b5e12872c59ee"
|
||||||
|
```
|
||||||
|
|
||||||
|
Pour la partie informations d'identifications au serveur PVE, remplacez les
|
||||||
|
valeurs données par les vôtres.
|
||||||
|
|
||||||
|
Pour l'image, il suffit de regarder sur le dépôt [Debian relatif aux images
|
||||||
|
cloud][debian-cloudimages]. Pour le choix de la *somme de contrôle* à utiliser,
|
||||||
|
il suffit de regarder dans le fichier `SHA512SUMS` situé dans le dossier des
|
||||||
|
images et de choisir la bonne ligne.
|
||||||
|
|
||||||
|
## Petit détour par Cloud-Init
|
||||||
|
|
||||||
|
Laisson de côté *OpenTofu* un moment pour passer un peu de temps sur *Cloud
|
||||||
|
Init*. Cloud-Init permet **d'automatiser l'initialisation d'instance cloud**. Il
|
||||||
|
est utilisé par de nombreuses distribution Linux et FreeBSD.
|
||||||
|
|
||||||
|
Cette phase d'initialisation comprend entre autres la création d'utilisateur, la
|
||||||
|
mise à jour des dépôts logiciels, l'installation de paquets. Les ordres sont
|
||||||
|
donnés au service *Cloud-Init* (lancé dans notre machine virtuelle) par
|
||||||
|
l'intermédiaire de fichiers disponibles dans un lecteur amovible à l'intérieur
|
||||||
|
de notre machine virtuelle.
|
||||||
|
|
||||||
|
Pour notre exemple, nous allons:
|
||||||
|
|
||||||
|
* créer un utilisateur et installer sa clé publique SSH
|
||||||
|
* définir le nom d'hôte de la machine
|
||||||
|
* mettre à jour les dépôts logiciel
|
||||||
|
* installer `qemu-guest-agent` et activer le service associé
|
||||||
|
|
||||||
|
Le dernier point nous permettra s'activer les intégrations de notre machine
|
||||||
|
virtuelle de test avec notre hyperviseur.
|
||||||
|
|
||||||
|
### Vendor config
|
||||||
|
|
||||||
|
Cloud-Init utilise (entre autres) des fichers YAML pour gérer les configurations
|
||||||
|
à appliquer. Le fichier `vendor-config` sert à appliquer les configurations
|
||||||
|
relative **au fournisseur de l'infrastructure**: dans notre cas *Proxmox VE*.
|
||||||
|
|
||||||
|
Ce `vendor-config` nous permettra d'installer et configurer *l'agent Qemu*. Cet
|
||||||
|
agent permet une meilleure intégration de notre machine virtuelle dans
|
||||||
|
l'hyperviseur. Par exemple *Terraform* sera capable de récupérer et afficher
|
||||||
|
l'adresse IP de la machine créée.
|
||||||
|
|
||||||
|
Pour cela, ajoutons le répertoire `cloudinit` à notre projet et à l'intérieur le
|
||||||
|
fichier `vendor-config.yaml` avec le contenu suivant:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
{! content/articles/2024/pve_opentofu_debian_cloudinit/files/cloudinit/vendor-config.yaml !}
|
||||||
|
```
|
||||||
|
|
||||||
|
Ce fichier parle de lui même:
|
||||||
|
|
||||||
|
* mise a jour des dépôts;
|
||||||
|
* installation du paquet `qemu-guest-agent`;
|
||||||
|
* activation du service associé via la directive `runcmd`;
|
||||||
|
|
||||||
|
### User config
|
||||||
|
|
||||||
|
Le fichier `user-config` est destiné à appliquer les configurations voulues
|
||||||
|
par l'utilisateur **qui instancie la machine**. Nous allons nous en servir pour
|
||||||
|
ajouter un utilisateur à notre machine.
|
||||||
|
|
||||||
|
Ajoutons le fichier `user-config.yaml` dans le répertoire `cloudinit/` avec le
|
||||||
|
contenu suivant:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
{!content/articles/2024/pve_opentofu_debian_cloudinit/files/cloudinit/user-config.yaml!}
|
||||||
|
```
|
||||||
|
|
||||||
|
La plupart des éléments (si ce n'est tous) doivent vous parler, `hostname`
|
||||||
|
permet de définir le nom de la machines et `users` les comptes utilisateurs. Il
|
||||||
|
faut bien entendu personnaliser ce fichier en fonction de vos besoins.
|
||||||
|
|
||||||
|
La documentation de Cloud-Init donne un [exemple complet][cloudinit_doc] des
|
||||||
|
paramètres disponibles.
|
||||||
|
|
||||||
|
## Notre script OpenTofu
|
||||||
|
|
||||||
|
### Téléchargement de l'image Debian
|
||||||
|
|
||||||
|
Il nous reste maintenant notre script `main.tf` à créer. Commençons par le
|
||||||
|
téléchargement de l'image Debian:
|
||||||
|
|
||||||
|
```terraform
|
||||||
|
{! content/articles/2024/pve_opentofu_debian_cloudinit/files/main.tf!lines=1-11}
|
||||||
|
```
|
||||||
|
|
||||||
|
Ce bloc permet le téléchargement de l'image dans le stockage défini par
|
||||||
|
`datastore_id` dans le fichier donné par le paramètre `file_name`.
|
||||||
|
|
||||||
|
Le paramètres `overwrite` défini le comportement de PVE si le fichier image
|
||||||
|
existe déjà dans `datastore_id`:
|
||||||
|
|
||||||
|
* `false`: aucune action se sera effectuée, le fichier reste tel quel;
|
||||||
|
* `true`: si la taille du fichier local (sur PVE) et celle du fichier distant
|
||||||
|
(donnée par l'entête HTTP`Content-Length`) sont différentes, alors l'image
|
||||||
|
sera téléchargée à nouveau et le fichier local écrasé.
|
||||||
|
|
||||||
|
`overwrite_unmanaged` permet de remplacer l'image disque si elle existe sur
|
||||||
|
`datastore_id` et n'est pas gérée par OpenTofu.
|
||||||
|
|
||||||
|
### Les fichiers Cloud-Init
|
||||||
|
|
||||||
|
Pour permettre à PVE de stocker les fichiers Cloud-Init envoyés par OpenTofu,
|
||||||
|
nous devons activer le stockage des *snippets* depuis l'interface web de Proxmox
|
||||||
|
VE. Il nous suffit d'aller dans *Datacenter* puis *Stockage* et de double
|
||||||
|
cliquer sur *local*.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Ouvrons ensuite la liste déroulante *Content* et ajoutons *Snippets* puis
|
||||||
|
validons avec *OK*.
|
||||||
|
|
||||||
|
Une fois le stockage des snippets activés, ajoutons les instructions suivantes à
|
||||||
|
notre fichier `main.tf`:
|
||||||
|
|
||||||
|
```terraform
|
||||||
|
{!content/articles/2024/pve_opentofu_debian_cloudinit/files/main.tf!lines=13-33}
|
||||||
|
```
|
||||||
|
|
||||||
|
Nous utilisons pour cela la ressource `proxmox_virtual_environment_file`:
|
||||||
|
|
||||||
|
* `content_type` permet de définir le type d'objet à stocker (images disque,
|
||||||
|
image de conteneur, snippet);
|
||||||
|
* `source_raw` permet de définir la source, nous aurions pu utiliser la notation
|
||||||
|
suivante pour l'option `data`[^data_option]:
|
||||||
|
|
||||||
|
raw {
|
||||||
|
data = <<-EOF
|
||||||
|
#cloud-config
|
||||||
|
users:
|
||||||
|
- name: ephase
|
||||||
|
# [...]
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
[^data_option]:mais personnellement je préfère la fonction `file()` permettant
|
||||||
|
de lire le contenu depuis un fichier externe. Il est ainsi plus aisé - par
|
||||||
|
exemple - de passer un linter sur le fichier YAML.
|
||||||
|
|
||||||
|
### Définition de notre machine virtuelle
|
||||||
|
|
||||||
|
Maintenant nous pouvons définir notre machine virtuelle par la définition d'une
|
||||||
|
ressource `proxmox_virtual_environment_vm`.
|
||||||
|
|
||||||
|
```terraform
|
||||||
|
{! content/articles/2024/pve_opentofu_debian_cloudinit/files/main.tf!lines=35-80 }
|
||||||
|
```
|
||||||
|
|
||||||
|
Première chose importante, l'option `depends_on` qui permet à OpenTofu
|
||||||
|
d'attendre que les définitions des deux fichiers *Cloud-Init* soient effectuée
|
||||||
|
avant de définir notre machine. Sans cette option, il arrive que la machine
|
||||||
|
démarre sans que les fichiers Cloud-Init ne soient prêt, ainsi les
|
||||||
|
personnalisations ne sont pas appliquées.
|
||||||
|
|
||||||
|
Ensuite nous trouvons un ensemble d'options qui définissent les paramètres de
|
||||||
|
notre machine:
|
||||||
|
|
||||||
|
* les blocs `cpu {}` et `memory {}` pour les options relative au calcul comme le
|
||||||
|
nombre de cœurs CPU ou la taille de la mémoire;
|
||||||
|
* le bloc `disk {}` permet de définir un périphérique de stockage;
|
||||||
|
* le bloc `network_device` permet de définir un périphérique réseau.
|
||||||
|
|
||||||
|
Pour `disk` et `network_device`, il est possible de définir **plusieurs blocs**
|
||||||
|
afin d'instancier plusieurs périphériques. Je vous invite à aller voir la
|
||||||
|
documentation [du module][bgp-pve-vm-doc] sur son dépôt GitHub.
|
||||||
|
|
||||||
|
#### Agent Qemu
|
||||||
|
|
||||||
|
**Le bloc `agent` est important**, il permet d'activer le **service
|
||||||
|
d'intégration du côté *Proxmox VE***. Invité et hôte pourront échanger des
|
||||||
|
informations et activer des fonctionnalités avancées.
|
||||||
|
|
||||||
|
Côté invité, c'est les instructions données dans le fichier `vendor-config` qui
|
||||||
|
s'occupe de l'installation de l'agent comme nous l'avons vu.
|
||||||
|
|
||||||
|
#### Paramétrage de Cloud-Init
|
||||||
|
|
||||||
|
C'est dans le bloc `initialization` que se font les paramétrages des éléments de
|
||||||
|
*Cloud-Init* relatifs à notre machine virtuelle.
|
||||||
|
|
||||||
|
Le bloc `ip_config` permet de définir les paramètres réseau. Le paramétrage se
|
||||||
|
fait comme les autres blocs, via des valeurs affectées à des options. Mais il
|
||||||
|
est aussi possible d'utiliser des fichiers YAML comme ce que nous avons définis
|
||||||
|
plus haut. Pour `ip_config`, nous aurions pu utiliser `network_data_file_id` et
|
||||||
|
donner un identifiant de fichier.
|
||||||
|
|
||||||
|
C'est ce que nous faisons pour `vendor_data_file_id` et `user_data_file_id` qui
|
||||||
|
prennent comme valeurs les identifiants des fichiers définis dans les blocs
|
||||||
|
`proxmox_virtual_environment_file`:
|
||||||
|
|
||||||
|
```terraform
|
||||||
|
{!content/articles/2024/pve_opentofu_debian_cloudinit/files/main.tf!lines=77-79}
|
||||||
|
```
|
||||||
|
|
||||||
|
Nous passons en paramètre les *id* de fichiers.
|
||||||
|
|
||||||
|
### Output
|
||||||
|
|
||||||
|
Afin de connaitre l'adresse IP de la machine qui va être créée, ajoutons un bloc
|
||||||
|
`output` à la racine de notre fichier `main.tf`:
|
||||||
|
|
||||||
|
```terraform
|
||||||
|
{!content/articles/2024/pve_opentofu_debian_cloudinit/files/main.tf!lines=83-85}
|
||||||
|
```
|
||||||
|
## Application de notre script OpenTofu
|
||||||
|
|
||||||
|
Maintenant que tout est en place nous pouvons nous lancer dans l'exécution de
|
||||||
|
notre script. D'abord il faut initialiser Opentofu, c'est à cette étape qu'il va
|
||||||
|
télécharger les modules:
|
||||||
|
|
||||||
|
```text
|
||||||
|
tofu init
|
||||||
|
Initializing the backend...
|
||||||
|
|
||||||
|
Initializing provider plugins...
|
||||||
|
- Reusing previous version of bpg/proxmox from the dependency lock file
|
||||||
|
- Installing bpg/proxmox v0.64.0...
|
||||||
|
- Installed bpg/proxmox v0.64.0 (signed, key ID F0582AD6AE97C188)
|
||||||
|
|
||||||
|
Providers are signed by their developers.
|
||||||
|
If you'd like to know more about provider signing, you can read about it here:
|
||||||
|
https://opentofu.org/docs/cli/plugins/signing/
|
||||||
|
|
||||||
|
OpenTofu has been successfully initialized!
|
||||||
|
|
||||||
|
You may now begin working with OpenTofu. Try running "tofu plan" to see
|
||||||
|
any changes that are required for your infrastructure. All OpenTofu commands
|
||||||
|
should now work.
|
||||||
|
|
||||||
|
If you ever set or change modules or backend configuration for OpenTofu,
|
||||||
|
rerun this command to reinitialize your working directory. If you forget, other
|
||||||
|
commands will detect it and remind you to do so if necessary.
|
||||||
|
```
|
||||||
|
|
||||||
|
Vous pouvez lancer `tofu plan` afin de vérifier les actions effectuées par notre
|
||||||
|
script, mais passons ici directement à l'action pour notre configuration:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
tofu apply
|
||||||
|
# [...]
|
||||||
|
Plan: 4 to add, 0 to change, 0 to destroy.
|
||||||
|
|
||||||
|
Changes to Outputs:
|
||||||
|
+ debian_12_test_ip_address = (known after apply)
|
||||||
|
|
||||||
|
Do you want to perform these actions?
|
||||||
|
OpenTofu will perform the actions described above.
|
||||||
|
Only 'yes' will be accepted to approve.
|
||||||
|
|
||||||
|
Enter a value:
|
||||||
|
```
|
||||||
|
|
||||||
|
Puis entrer *yes* afin de valider, les actions seront alors:
|
||||||
|
|
||||||
|
```text
|
||||||
|
proxmox_virtual_environment_file.vendor_config: Creating...
|
||||||
|
proxmox_virtual_environment_file.user_config: Creating...
|
||||||
|
proxmox_virtual_environment_download_file.debian_12: Creating...
|
||||||
|
proxmox_virtual_environment_file.vendor_config: Creation complete after 1s [id=local:snippets/vendor-config.yaml]
|
||||||
|
proxmox_virtual_environment_file.user_config: Creation complete after 1s [id=local:snippets/user-config.yaml]
|
||||||
|
proxmox_virtual_environment_download_file.debian_12: Creation complete after 8s [id=local:iso/debian-12-generic-amd64.img]
|
||||||
|
proxmox_virtual_environment_vm.debian_12_test: Creating...
|
||||||
|
proxmox_virtual_environment_vm.debian_12_test: Still creating... [10s elapsed]
|
||||||
|
proxmox_virtual_environment_vm.debian_12_test: Still creating... [20s elapsed]
|
||||||
|
proxmox_virtual_environment_vm.debian_12_test: Still creating... [30s elapsed]
|
||||||
|
proxmox_virtual_environment_vm.debian_12_test: Still creating... [40s elapsed]
|
||||||
|
proxmox_virtual_environment_vm.debian_12_test: Still creating... [50s elapsed]
|
||||||
|
proxmox_virtual_environment_vm.debian_12_test: Still creating... [1m0s elapsed]
|
||||||
|
proxmox_virtual_environment_vm.debian_12_test: Still creating... [1m10s elapsed]
|
||||||
|
proxmox_virtual_environment_vm.debian_12_test: Creation complete after 1m15s [id=100]
|
||||||
|
|
||||||
|
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
|
||||||
|
|
||||||
|
Outputs:
|
||||||
|
|
||||||
|
debian_12_test_ip_address = tolist([
|
||||||
|
tolist([
|
||||||
|
"127.0.0.1",
|
||||||
|
]),
|
||||||
|
tolist([
|
||||||
|
"192.168.0.112",
|
||||||
|
]),
|
||||||
|
])
|
||||||
|
```
|
||||||
|
|
||||||
|
Notre machine est en place avec l'adresse `192.168.0.112`, c'est grâce à
|
||||||
|
**l'intégration de l'agent Qemu** qu'OpenTofu obtient cette information et nous
|
||||||
|
l'affiche. Maintenant vérifions que notre utilisateur existe et que la clé
|
||||||
|
publique que nous avons fournie dans `user-config.yaml` fonctionne:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
ssh ephase@192.168.0.112 -i ~/.ssh/id_ed25519
|
||||||
|
# [...]
|
||||||
|
ephase@debian-12-test:~$ hostnamectl hostname
|
||||||
|
test-debian-12
|
||||||
|
ephase@debian-12-test:~$ sudo id
|
||||||
|
uid=0(root) gid=0(root) groups=0(root)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
Notre connexion fonctionne, notre utilisateur existe bien, le nom d'hôte est
|
||||||
|
bien celui voulu et le paramétrage de `sudo` fonctionne aussi.
|
||||||
|
|
||||||
|
## En conclusion
|
||||||
|
|
||||||
|
En partant d'une image Debian minimale, nous avons réussi à créer une machine
|
||||||
|
virtuelle paramétrée en automatisant autant que possible les actions à effectuer
|
||||||
|
à l'aide de briques logicielles open-sources. Bien sûr nous avons juste effleuré
|
||||||
|
les possibilités offertes par tous ces éléments, mais j'espère vous avoir donné
|
||||||
|
l'envie d'aller plus loin.
|
||||||
|
|
||||||
|
|
||||||
|
Merci à [Heuzef][heuzef] et [RavenRamirez][alois] pour les relectures,
|
||||||
|
corrections et conseils.
|
||||||
|
|
||||||
|
[heuzef]:https://heuzef.com/
|
||||||
|
[alois]:https://aloisbouny.fr/
|
||||||
|
|
||||||
|
[opentofu]: https://opentofu.org/
|
||||||
|
[cloudinit]: https://cloud-init.io/
|
||||||
|
[cloudinit_doc]: https://cloudinit.readthedocs.io/en/latest/reference/examples.html
|
||||||
|
[proxmox]: https://www.proxmox.com/
|
||||||
|
[bgp_pve_terraform]: https://github.com/bpg/terraform-provider-proxmox
|
||||||
|
[srobert]: https://blog.stephane-robert.info/docs/virtualiser/type1/proxmox/terraform/#configuration-de-proxmox
|
||||||
|
[debian-cloudimages]: https://cloud.debian.org/images/cloud/
|
||||||
|
[bgp-pve-vm-doc]: https://github.com/bpg/terraform-provider-proxmox/blob/main/docs/resources/virtual_environment_vm.md
|
Loading…
Add table
Add a link
Reference in a new issue