En esta entrada veremos como interactuar con Terraform y los contenedores o CTs, como comúnmente los llamamos.
Nota: para este procedimiento se requiere la plantilla de CT de Debian11 para Proxmox, la cual se puede descargar por la interfaz de proxmox:
O por consola y copiarla en /var/lib/vz/template/cache:
wget -c http://download.proxmox.com/images/system/debian-11-standard_11.0-1_amd64.tar.gz -P /var/lib/vz/template/cache
Lo primero es crear una carpeta dónde vamos a trabajar, el nombre no importa cual sea, sólo que sea un identificativo para el trabajo que haremos. Crearemos un contenedor o CT, llamado test, que se encenderá automaticamente cuando encienda el sistema, y lo prepararemos para que haga ciertas funciones, que definiremos en un script que ejecutará después de que el CT esté completamente funcional.
mkdir test; cd test nano providers.tf
Contenido:
terraform {
required_providers {
proxmox = {
source = "telmate/proxmox"
version = "2.9.10"
}
}
}
# usando el provider
provider "proxmox" {
pm_api_url = var.pve_host
pm_user = var.pve_user
pm_password = var.pve_pass
pm_tls_insecure = true
}
Ahora bien, acá en providers.tf hemos definido el provider, que es el plugin telmate/proxmox, que ya descargamos y está en nuestro home, descrito en la parte 1 de esta serie.
Acá vemos también declaración de variables, que ahora mismo veremos donde están y cómo se usan. Para ello necesitaremos el archivo vars.tf:
nano vars.tf
Contenido:
# servidor proxmox, ajustar según las necesidades
variable "pve_host" {
description = "Proxmox server"
default = "https://192.168.0.250:8006/api2/json"
}
# usuario del proxmox
variable "pve_user" {
description = "Proxmox username"
type = string
sensitive = true
default = "root@pam"
}
# password el proxmox se necesita para que terraform le pase parámetros por la API
variable "pve_pass" {
description = "Proxmox password"
type = string
sensitive = true
default = "ZmVjMjNQNmNlZpU2ZmQ2ZjkyNTMzZDdm"
}
# password del ct
variable "ct_pass" {
description = "Container password"
type = string
sensitive = true
default = "Admin*123"
}
# hostname del ct
variable "hostname" {
default = "test"
}
# dns server
variable "dns_server" {
default = "192.168.0.2"
}
# dominio
variable "dns_domain" {
default = "inutil.cu"
}
# cat .ssh/id_rsa.pub
variable "ssh_key" {
default = "ssh-rsa AAAAB3NzaC1yc2EAaAADAqABAAABgQCyQiMi2HhPtLRS+HFCVwPY41EI5cwAbshyUt3J48MKvWSOW0exgJp6jbSm3xgfZMJ4BfLr8KXo5mx7CS3PcrSlBaWg7ebUsWXKdbgVmehE77+0ZIjvo9McT/xZIJnlb6FYRUcPvww5ay03AWg8D0QBskCeYnfEd4fPadxzvtKWJ5CoG+wabvcv50+QbkOWcBUWUQ3XEp97thb9bQxPeMRRmnJu2g5LwZ9ZKgg5Vu4r4TKaHEnofFxJDLzLBdTu4ms3WjBMiMAdwfykgMQxTBPA2BCSqraMH5q/osGPRKqDnZsqwYgCkF/KBHnZpTmJzIA9Lt2ujQmix4CdOyd0O1ECwqfcx8FLGdZr4lGP0jepHgZ9tsD08HQq629R/ljf8DR7iiVF0LEJLPH2EGf/2ulDFlxyCcC6zMQztQNaCPrLcqAGZPTqNz9erfZ9GllyGJh91T8ucy+yCYYHEkLURuhL4w3GdkPlpuDstY33T7wszOr/lawCNTsTcYZ1764+aC0= koratsuki@happyharry"
}
# Aca va la plantilla que usaremos, puede ser Debian/Ubuntu u otra.
variable "template_name" {
default = "external:vztmpl/debian-11-standard_11.0-1_amd64.tar.gz"
}
Y ahora el archivo main.tf, el cual nos definirá como se crea el CT:
nano main.tf
Contenido:
resource "proxmox_lxc" "test" {
count = 1
onboot = true
start = true
vmid = "201"
hostname = var.hostname
ostype = "debian"
cores = 2
cpulimit = 0
memory = 1024
swap = 512
ostemplate = var.template_name
password = var.ct_pass
pool = ""
ssh_public_keys = var.ssh_key
rootfs {
storage= "external"
size="8G"
}
nameserver = var.dns_server
searchdomain = var.dns_domain
network {
name = "eth0"
bridge = "vmbr0"
ip = "192.168.0.201/24"
gw = "192.168.0.254"
firewall = false
}
features {
nesting = true
}
unprivileged = false
target_node = "pve1"
connection {
type = "ssh"
user = "root"
private_key = file(pathexpand("~/.ssh/id_rsa"))
host = "192.168.0.201"
}
provisioner "file" {
source = "config/script.sh"
destination = "/tmp/script.sh"
}
provisioner "remote-exec" {
inline = [
"chmod +x /tmp/script.sh",
"/tmp/script.sh args",
]
on_failure = continue
}
}
Acá hemos definido lo mismo que hacemos vía web, a la hora de crear un contenedor, pero mediante código, y al final, dentro de la carpeta config hemos creado un script que se copiará al contenedor recién creado y se ejecutará.
nano config/script.sh
Contenido:
#!/bin/bash # deshabilitamos resolved systemctl stop systemd-resolved systemctl disable systemd-resolved systemctl mask systemd-resolved # definimos la zona horaria timedatectl set-timezone America/Havana # Repos locales en caso de tenerlos echo "deb http://repo.inutil.cu/debian/bullseye bullseye main contrib non-free" > /etc/apt/sources.list echo "deb http://repo.inutil.cu/debian/bullseye-security bullseye-security main contrib non-free" >> /etc/apt/sources.list # Removing unused things apt purge -y postfix* rpcbind # Upgrade system apt update ;; apt dist-upgrade -y # Installing stuff apt install -y mc net-tools dnsutils wget git rsync \ p7zip-full htop iftop nethogs telnet screen multitail \ ccze lzma xz-utils rar unrar ;; apt clean
Entonces, listo todo, sólo queda ejecutar todo:
$ terraform init
Entonces, empezamos bien, se inicializó terraform y el plugin para proxmox, Ahora:
$ terraform plan
Acá Terraform te muestra todo el plan que vas a ejecutar, en detalle. Ahora sólo queda ejecutar el provisionado:
$ terraform apply
Terraform nos recordará todo lo anterior y nos avisará que estamos listos, que acepte para empezar:
Y listo, empezará el provisionamiento:
Y con esto, ya tenemos nuestro CT creado y provisionado, actualizado mediante script externo. Nos vemos en la parte 4 de este tutorial, donde haremos lo mismo, pero para VMs. Un saludo y happy hacking!
Referencias:
https://www.terraform.io/language/values/variables
Me complace anunciar la creación de esta útil herramienta (SquidStats), para el análisis y monitoreo…
La inteligencia artificial está revolucionando las industrias al automatizar tareas, predecir patrones y permitiendo tomar…
Uno de los grandes retos al que nos podemos enfrentar cuando una aplicación crece, es…
Percona Monitoring and Management (PMM) es una herramienta de código abierto para la supervisión y…
Qué es lo que deseo hacer en este capítulo? Básicamente un sonoff, quiero encender/apagar las…
Hace algunos meses estoy escuchando hablar del proyecto Home Assistant (HA). En palabras literales del…