Acebit expanderar
Acebit expanderar – automationsess från Dalarna öppnar i Stockholm
Hur skriver och använder man egna moduler i Terraform
Moduler ger oss flera saker, framförallt kan vi gruppera ihop flera olika resources och “paketera” dom ihop som en resource. På så vis får vi en mer modulär lösning, vi kan definiera upp hur vi vill arbeta med en grupp resurser ihop på ett standardiserat sätt, och i vår tjänstedeklaration kan vi instansiera flera uppsättningar av samma paketering.
När vi ska använda vår modul måste vi göra en typ av include liknande hur vi gör import av moduler i Python. Det är diskuterat best practise är att lägga modulerna i en egen katalog, men att inte bygga djupare katalogstrukturer än så.
Jag tänker att vi skapar en katalog som vi döper till modules, och i den skapar jag en modul som jag kallar för lb. Modulen är en katalog med två filer, main och variables. I main gör vi själva kompositionen av de resurser vi ska paketera. I filen variables definierar vi upp vilka variabler vi behöver för att instansiera modulen en gång, den här filen kan vi se som ett interface som talar om vilka argument vi behöver.
johanlahti@MBP terraform-f5-modules % tree .
.
├── main.tf
├── modules
│ └── lb
│ ├── main.tf
│ └── variables.tf
└── variables.tf
2 directories, 4 files
Vi börjar med att kika på hur vi skulle kunna göra med variables.tf, de variabler vi definierar här kommer vi kunna accessa senare som attribut till objektet var.
#file: /modules/lb/variables.tf
variable "name" {
type = string
}
variable "node_ip" {
type = list
}
variable "node_port" {
type = number
}
variable "vip" {
type = string
}
variable "vip_port" {
type = string
}
Sedan kollar vi på hur vi skulle kunna bygga en enkel lastbalansering i F5. För det behöver vi:
# file: /modules/lb/main.tf
terraform {
required_providers {
bigip = {
source = "F5Networks/bigip"
version = "1.11.0"
}
}
}
# Först skapar vi en pool resource:
resource "bigip_ltm_pool" "pool" {
name = "/Common/pool-${var.name}"
load_balancing_mode = "round-robin"
minimum_active_members = 1
monitors = ["/Common/http"]
}
# För varje node_ip som vi får in som argument gör vi en node attachment:
resource "bigip_ltm_pool_attachment" "attach_node" {
count = length(var.node_ip) # <- Här använder vi count för att skapa lika många som antalet node_ip vi får in senare.
pool = bigip_ltm_pool.pool.name
node = "${var.node_ip[count.index]}:${var.node_port}"
}
# Till sist skapar vi en virtual server som använder poolen ovan.
resource "bigip_ltm_virtual_server" "http" {
name = "/Common/${var.name}"
destination = var.vip
port = var.vip_port
pool = bigip_ltm_pool.pool.name
}
Nu har vi skapat en modul som tar emot argumenten name, node_ip, node_port, vip och vip_port. Eftersom vi angett att node_ip är en lista kan vi använda längden på listan för att skapa flera noder.
Till sist går vi tillbaka till vår main.tf i projektets root och provar att skapa upp ett par instanser av den här modulen.
terraform {
required_providers {
bigip = {
source = "F5Networks/bigip"
version = "1.11.0"
}
}
}
provider "bigip" {
address = var.hostname
username = var.username
password = var.password
}
module "vip1" {
source = "./modules/lb"
name = "acebitvip1"
node_ip = ["192.0.2.1", "192.0.2.2"]
node_port = 80
vip = "1.1.1.1"
vip_port = 443
}
module "vip2" {
source = "./modules/lb"
name = "acebitvip2"
node_ip = ["192.0.2.3", "192.0.2.4"]
node_port = 80
vip = "1.1.1.2"
vip_port = 443
}
Plötsligt har vi definierat upp en standard för hur vi sätter upp lastbalansering och fått ner interfacet till att bara innehålla de parametrar vi anser behöva ändras, resten kan vi hantera inom modulen för att standardisera alla VIPar. När vi jobbar med moduler får vi också en mycket bättre läsbarhet och projekten blir inte alls lika komplexa att arbeta med över tid.
Så himla enkelt!
Acebit expanderar – automationsess från Dalarna öppnar i Stockholm
Acebit rekryterar Isak Ljunggren – Acebit Trainee från Högskolan Dalarna
Även Falu-Kuriren har intresserat sig för Acebit och besökt oss i Falun!
Emanuel Lipschütz ny styrelseordförande i Acebit
Nyligen stötte jag på ett scenario som innebar att ca 200 Meraki-enheter behövde byta inställning från DHCP till statisk IP-adressering. Istället för att gör...
I mina tidigare inlägg om virtuella port-channels kikade vi på vad det är och vilka delar de utgör. Det här avsnittet kommer beröra hur en grundkonfiguration...
Bakgrund Idag tänkt jag skriva några rader om att skriva concurrent kod, eller “samtidighet” om vi prompt ska översätta det till svenska. För att enklare för...
Scrapli Automation - trunk ports