Merhaba,
Bu makalede terraform üzerinde local value ve output kullanımını ve ne işe yaradığını göreceğiz.
Local value'ler bir terraform dosyası içerisindeki bir değerin birden fazla yerde kullanılması gerektiğinde tanımlanan ve kullanılmaktadır.
Output ise oluşturmuş olduğumuz bir nesne hakkında bilgi almak istediğimizde kullanılmaktadır. Output diğer yazılım dillerinde ki ekrana yazdırma görevi görür. Python'daki printf, C# 'ta Console.WriteLine() gibi.
Terraform dosyamızın içerisine aşağıdaki gibi 2 adet local değişkeni tanımlıyoruz.
locals {
appName = "testapps"
namespace = "testnamespace"
}
Kubernetes üzerinde bir service ve bir pod oluşturacağım ve bunların isimlerini ve namespace lerini bu değişkenler üzerinden alacağım. Kullanım şekli "local.degiskenismi" kullanılmaktadır. Bu sayede sadece local değişkenlerinin değerini değiştirerek farklı bir isimde ve namespace üzerinde bu objeleri oluşturabilirim.
locals {
appName = "testapps"
namespace = "testnamespace"
}
resource "kubernetes_service" "example" {
metadata {
name = "terraform-example"
namespace = local.namespace
}
spec {
selector = {
app = local.appName
}
session_affinity = "ClientIP"
port {
port = 8080
target_port = 80
}
type = "LoadBalancer"
}
}
resource "kubernetes_pod" "example" {
metadata {
name = "terraform-example"
namespace = local.namespace
labels = {
app = local.appName
}
}
spec {
container {
image = "nginx"
name = local.appName
}
}
Örneğin; farklı bir örnekte sunucunun oluşturulacağı lokasyonu local değişkenlerden alabiliriz. Bu sayede bu değişkenin değerini değiştirerek farklı bir lokasyonda oluşturabiliriz. Burada bir noktada kullanıldığı görülmekte fakat bunu belki 5-6 yerde kullanabiliriz. Böyle olunca bize kolaylık sağlamaktadır.
locals {
location = "australiaeast"
}
resource "azurerm_resource_group" "this" {
name = "rg-mom-spells"
location = local.location
}
Aşağıdaki şekilde de bir kullanım sağlayabiliriz. Bir terraform resourcenin değerini farklı bir resource'den alabiliriz. Örneğin; aşağıdaki service nin selector değerini pod üzerinde tanımlanan label değerinden almışız. Bu kullanım da yaygın bir kullanımdır.
resource "kubernetes_service" "example" {
metadata {
name = "terraform-example"
}
spec {
selector = {
app = kubernetes_pod.example.metadata.0.labels.app
}
session_affinity = "ClientIP"
port {
port = 8080
target_port = 80
}
type = "LoadBalancer"
}
}
resource "kubernetes_pod" "example" {
metadata {
name = "terraform-example"
labels = {
app = "MyApp"
}
}
spec {
container {
image = "nginx:1.21.6"
name = "test"
}
}
}
Şimdi output'a bakalım. Örneğin; load balancer tipinde bir servis oluşturduk ve bu load balancerın değerini bu objeler oluştuktan sonra görmek istiyoruz. Kullanım şekli "terraform_resource.resource_name.parametreler"
şeklindedir. kubernetes_service ve example yukarıda ki örnekte oluşturduğumuz servis objesidir. Ondan sonra parametrelerde objeye göre değişmektedir.
kubernetes_service.example.status[0].load_balancer[0].ingress[0].ip
Output objesi aşağıdaki şekilde oluşturulmaktadır.
output "LoadBalancer_IP" {
value = "Bu servisin Load Balancer IP Adresi = {kubernetes_service.example.status[0].load_balancer[0].ingress[0].ip}"
}
Bu şekilde kullanım bize aşağıdaki şekilde bir çıktı vermektedir.
Bu servisin Load Balancer IP Adresi = 192.168.1.163
Mesela istersek oluşturulan pod'un hangi node üzerinde oluştuğunuda bu output ile görebiliriz. Bu değerler terraform providerlara göre değişmektedir.
kubernetes_pod.example.spec[0].node_name
Daha fazla bilgi için terraformun resmi sitesinden ulaşabilirsiniz.
Locals : https://developer.hashicorp.com/terraform/language/values/locals
Output : https://developer.hashicorp.com/terraform/language/values/outputs
Herkese iyi günler.
Top comments (0)