feat: trying to automate creating lxc container
This commit is contained in:
parent
41796896c3
commit
1846541902
33
.forgejo/worfkows/lxc-creator.yml
Normal file
33
.forgejo/worfkows/lxc-creator.yml
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
name: Lxc Creation
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
terraform:
|
||||||
|
runs-on: self-hosted
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup Terraform
|
||||||
|
uses: hashicorp/setup-terraform@v3
|
||||||
|
with:
|
||||||
|
terraform_version: "1.9.0"
|
||||||
|
|
||||||
|
- name: Terraform Init
|
||||||
|
run: terraform init
|
||||||
|
working-directory: ./terrafrom
|
||||||
|
|
||||||
|
- name: Terraform Plan
|
||||||
|
run: terraform plan
|
||||||
|
working-directory: ./terrafrom
|
||||||
|
env:
|
||||||
|
TF_VAR_pm_api_token_secret: ${{ secrets.PM_API_TOKEN_SECRET }}
|
||||||
|
|
||||||
|
- name: Terraform Apply
|
||||||
|
if: github.ref == 'refs/heads/main'
|
||||||
|
run: terraform apply -auto-approve
|
||||||
|
working-directory: ./terrafrom
|
||||||
|
env:
|
||||||
|
TF_VAR_pm_api_token_secret: ${{ secrets.PM_API_TOKEN_SECRET }}
|
||||||
116
terraform/main.tf
Normal file
116
terraform/main.tf
Normal file
|
|
@ -0,0 +1,116 @@
|
||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
proxmox = {
|
||||||
|
source = "bpg/proxmox"
|
||||||
|
version = "~> 0.66.0"
|
||||||
|
}
|
||||||
|
random = {
|
||||||
|
source = "hashicorp/random"
|
||||||
|
version = "~> 3.6"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
provider "proxmox" {
|
||||||
|
endpoint = var.pm_api_url
|
||||||
|
api_token = "${var.pm_api_token_id}=${var.pm_api_token_secret}"
|
||||||
|
insecure = var.pm_tls_insecure
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "random_integer" "vm_id" {
|
||||||
|
min = 200
|
||||||
|
max = 9999
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "random_password" "root_password" {
|
||||||
|
length = 16
|
||||||
|
special = true
|
||||||
|
override_special = "!#$%&*()-_=+[]?"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "random_password" "user_password" {
|
||||||
|
length = 16
|
||||||
|
special = true
|
||||||
|
override_special = "!#$%&*()-_=+[]?"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "proxmox_virtual_environment_container" "debian_container" {
|
||||||
|
node_name = var.target_node
|
||||||
|
vm_id = random_integer.vm_id.result
|
||||||
|
started = true
|
||||||
|
unprivileged = true
|
||||||
|
start_on_boot = true
|
||||||
|
|
||||||
|
description = <<-EOT
|
||||||
|
Managed by Terraform
|
||||||
|
Container ID: ${random_integer.vm_id.result}
|
||||||
|
Hostname : lxc-${random_integer.vm_id.result}
|
||||||
|
Root user : root
|
||||||
|
Root pass : ${random_password.root_password.result}
|
||||||
|
User : ${var.container_user}
|
||||||
|
User pass : ${random_password.user_password.result}
|
||||||
|
EOT
|
||||||
|
|
||||||
|
initialization {
|
||||||
|
hostname = "lxc-${random_integer.vm_id.result}"
|
||||||
|
|
||||||
|
ip_config {
|
||||||
|
ipv4 {
|
||||||
|
address = "dhcp"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
user_account {
|
||||||
|
password = random_password.root_password.result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cpu {
|
||||||
|
cores = var.container_cores
|
||||||
|
}
|
||||||
|
|
||||||
|
memory {
|
||||||
|
dedicated = var.container_memory
|
||||||
|
}
|
||||||
|
|
||||||
|
disk {
|
||||||
|
datastore_id = var.container_storage
|
||||||
|
size = var.container_disk_size
|
||||||
|
}
|
||||||
|
|
||||||
|
network_interface {
|
||||||
|
name = "eth0"
|
||||||
|
bridge = "vmbr0"
|
||||||
|
}
|
||||||
|
|
||||||
|
operating_system {
|
||||||
|
template_file_id = var.container_template
|
||||||
|
type = "debian"
|
||||||
|
}
|
||||||
|
|
||||||
|
features {
|
||||||
|
nesting = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
output "container_id" {
|
||||||
|
description = "Proxmox container ID"
|
||||||
|
value = random_integer.vm_id.result
|
||||||
|
}
|
||||||
|
|
||||||
|
output "container_name" {
|
||||||
|
description = "Container hostname"
|
||||||
|
value = "lxc-${random_integer.vm_id.result}"
|
||||||
|
}
|
||||||
|
|
||||||
|
output "root_password" {
|
||||||
|
description = "Auto-generated root password"
|
||||||
|
value = random_password.root_password.result
|
||||||
|
sensitive = true
|
||||||
|
}
|
||||||
|
|
||||||
|
output "user_password" {
|
||||||
|
description = "Auto-generated user password"
|
||||||
|
value = random_password.user_password.result
|
||||||
|
sensitive = true
|
||||||
|
}
|
||||||
8
terraform/run
Normal file
8
terraform/run
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
terraform init
|
||||||
|
export TF_VAR_pm_api_token_secret=""
|
||||||
|
terraform plan
|
||||||
|
terraform apply -auto-approve
|
||||||
|
#terraform output root_password
|
||||||
|
#terraform output user_password
|
||||||
17
terraform/terraform.tfvars
Normal file
17
terraform/terraform.tfvars
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
pm_api_url = "https://192.168.8.119:8006/api2/json"
|
||||||
|
pm_api_token_id = "root@pam!terraform"
|
||||||
|
# The token secret will be read from environment variable TF_VAR_pm_api_token_secret
|
||||||
|
pm_tls_insecure = true # Set to true to skip certificate validation for self-signed certificates
|
||||||
|
|
||||||
|
# Container configuration
|
||||||
|
target_node = "pve"
|
||||||
|
#container_hostname = "debian-lxc"
|
||||||
|
container_template = "local:vztmpl/debian-13-standard_13.1-2_amd64.tar.zst"
|
||||||
|
# Root password will be read from environment variable TF_VAR_container_root_password
|
||||||
|
# User password will be read from environment variable TF_VAR_container_user_password
|
||||||
|
|
||||||
|
# Resources
|
||||||
|
container_cores = 1
|
||||||
|
container_memory = 1028
|
||||||
|
container_storage = "local-lvm"
|
||||||
|
container_disk_size = 8
|
||||||
64
terraform/variables.tf
Normal file
64
terraform/variables.tf
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
variable "pm_api_url" {
|
||||||
|
description = "Proxmox API URL"
|
||||||
|
type = string
|
||||||
|
default = "https://your-proxmox-ip:8006/api2/json"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "pm_api_token_id" {
|
||||||
|
description = "Proxmox API token ID"
|
||||||
|
type = string
|
||||||
|
default = "root@pam!your-token-name"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "pm_api_token_secret" {
|
||||||
|
description = "Proxmox API token secret"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "pm_tls_insecure" {
|
||||||
|
description = "Disable TLS verification"
|
||||||
|
type = bool
|
||||||
|
default = true
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "target_node" {
|
||||||
|
description = "Proxmox target node"
|
||||||
|
type = string
|
||||||
|
default = "your-node-name"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "container_template" {
|
||||||
|
description = "OS template for the container"
|
||||||
|
type = string
|
||||||
|
default = "local:vztmpl/debian-12-standard_12.7-1_amd64.tar.zst"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "container_user" {
|
||||||
|
description = "Username for the custom user"
|
||||||
|
type = string
|
||||||
|
default = "myuser"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "container_cores" {
|
||||||
|
description = "Number of CPU cores for the container"
|
||||||
|
type = number
|
||||||
|
default = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "container_memory" {
|
||||||
|
description = "Memory in MB for the container"
|
||||||
|
type = number
|
||||||
|
default = 512
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "container_storage" {
|
||||||
|
description = "Storage name for the container"
|
||||||
|
type = string
|
||||||
|
default = "local-lvm"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "container_disk_size" {
|
||||||
|
description = "Disk size for the container in GB"
|
||||||
|
type = number
|
||||||
|
default = 8
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue