giriiş
Terraform modülleri, altyapınızın farklı kaynaklarını tek ve birleşik bir kaynakta gruplandırmanıza olanak tanır. Kaynak tanımlarını her ihtiyaç duyduğunuzda tekrarlamak zorunda kalmadan, olası özelleştirmelerle daha sonra yeniden kullanabilirsiniz; bu, karmaşık yapılara sahip büyük projeler için kullanışlıdır. Tanımladığınız giriş değişkenlerini kullanarak modül örneklerini özelleştirebilir ve çıktıları kullanarak bunlardan bilgi çıkarabilirsiniz. Kendi özel modüllerinizi oluşturmanın yanı sıra, Terraform kayıt defterinde herkese açık olarak yayınlanan önceden oluşturulmuş modülleri de kullanabilirsiniz. Geliştiriciler, oluşturduğunuz modüller gibi girdileri kullanarak bunları kullanabilir ve özelleştirebilir, ancak kaynak kodları bulut içinde ve dışında saklanır. Bu eğitimde, yedeklilik için bir Yük Dengeleyici arkasında birden fazla Droplet başlatan bir Terraform modülü oluşturacaksınız. Ayrıca, birden fazla özelleştirilmiş modül örneğini aynı anda dağıtmak için Hashicorp Yapılandırma Dili'nin (HCL) for_each ve count Döngü özelliklerini kullanacaksınız.
Ön koşullar
- Kişisel bir DigitalOcean erişim kodu
- Terraform sisteminize kurulur ve DO sağlayıcısı ile bir proje oluşturulur.
- Veri türlerine ve HCL döngülerine giriş
- Terraform çıktılarına giriş ve kullanımları
Modül yapısı ve faydaları
Bu bölümde, modüllerin sağladığı avantajları, bir projede genellikle nereye yerleştirildiklerini ve nasıl yapılandırılmaları gerektiğini öğreneceksiniz. Özel Terraform modülleri, genellikle daha büyük projelerde kullanılan ve birlikte dağıtılan bağlantılı bileşenleri kapsüllemek için oluşturulur. Bunlar kendi kendine yeterlidir ve yalnızca ihtiyaç duydukları kaynakları, değişkenleri ve sağlayıcıları bir araya getirir. Modüller genellikle proje kökündeki merkezi bir klasörde, her biri kendi alt klasöründe saklanır. Modüller arasında net bir ayrım sağlamak için, her zaman tek bir amaca sahip olacak şekilde tasarlayın ve asla alt modüller içermediklerinden emin olun. Tek bir kaynağı modül olarak paketlemek gereksiz olabilir ve genel mimarinin basitliğini kademeli olarak ortadan kaldırabilir. Küçük geliştirme ve test projeleri için modülleri birleştirmek gerekli değildir, çünkü bu durumlarda çok fazla ilerleme sağlamazlar. Modüller ayrıca, tanımların yalnızca tek bir yerde değiştirilmesi ve ardından altyapının geri kalanına yayılması avantajını da sunar.
Daha sonra Terraform projelerinizde modülleri tanımlayacak, kullanacak ve özelleştireceksiniz.
Bir modül oluşturun
Bu bölümde, birden fazla Droplet ve bir Yük Dengeleyiciyi Terraform kaynakları olarak tanımlayıp bunları bir modülde paketleyeceksiniz. Ayrıca, yapılandırılabilir modül girişlerini kullanarak ortaya çıkan modülü yapılandıracaksınız.
Modülü şu dizine yerleştirin: damlacık-lb, modules adlı bir dizine kaydedeceksiniz. Önkoşulların bir parçası olarak oluşturduğunuz terraform-modules dizininde olduğunuzu varsayarak, her ikisini de aynı anda şu komutu çalıştırarak yükleyin:
mkdir -p modules/droplet-lb-p argümanı mkdir'e verilen yoldaki tüm dizinleri oluşturmasını söyler.
Şuraya git:
cd modules/droplet-lbÖnceki bölümde belirtildiği gibi, modüller kullandıkları kaynakları ve değişkenleri içerir. Terraform 0.13 sürümünden itibaren, kullandıkları sağlayıcıların tanımlarını da içermeleri gerekir. Modüller, kodun bir modülü temsil ettiğini belirtmek için herhangi bir özel yapılandırma gerektirmez, çünkü Terraform, HCL kodu içeren herhangi bir dizini, hatta proje kök dizini bile modül olarak kabul eder.
Bir modülde tanımlanan değişkenler, girdi olarak sunulur ve kaynak tanımlarında özelleştirmek için kullanılabilir. Oluşturduğunuz modülün iki girdisi olacaktır: oluşturulacak damlacık sayısı ve gruplarının adı. değişkenler.tf Değişkenleri saklayacağınız yeri oluşturun ve açın:
nano variables.tfAşağıdaki satırları ekleyin:
variable "droplet_count" {}
variable "group_name" {}Dosyayı kaydedip kapatın.
Droplet'i şu adlı bir dosyada tanımlarsınız: damlacıklar.tf Kaydedeceksiniz. Oluşturup düzenlemeye açacaksınız:
nano droplets.tf
Aşağıdaki satırları ekleyin:
resource "digitalocean_droplet" "droplets" {
count = var.droplet_count
image = "ubuntu-22-04-x64"
name = "${var.group_name}-${count.index}"
region = "fra1"
size = "s-1vcpu-1gb"
lifecycle {
precondition {
condition = var.droplet_count >= 2
error_message = "At least two droplets must be created."
}
}
}Parametre için saymakBir kaynağın kaç örneğinin oluşturulacağını belirten droplet_count değişkenini girersiniz. Değeri, modül ana proje kodundan çağrıldığında belirlenir. Dağıtılan her droplet'in adı farklı olur ve bu, geçerli droplet dizininin belirtilen grup adına eklenmesiyle elde edilir. Bölgeye Droplet Dağıtma fra1 Ubuntu 22.04 olacak ve çalışacak.
Bölüm Yaşam döngüsü İçerir Ön koşul Kaynaklar gerçekten dağıtılmadan önce yürütülür. Burada, en az iki drop oluşturulacağı doğrulanır; yalnızca bir drop oluşturulması, Yük Dengeleyici'nin amacına aykırıdır. Doğrulamalara başka bir örnek, Terraform kullanarak bir DigitalOcean Kubernetes kümesi kurmak için şablonlar içeren k8s-bootstrapper deposunda bulunabilir. Burada, doğrulamalar kümedeki düğüm sayısının aralık dahilinde olduğundan emin olmak için kullanılır.
İşiniz bittiğinde dosyayı kaydedip kapatın.
Droplet'leri tanımladıktan sonra, Yük Dengeleyiciyi oluşturmaya geçebilirsiniz. Kaynağını şu adlı bir dosyada tanımlayın: lb.tf Kaydedeceksiniz. Aşağıdakileri çalıştırarak oluşturun ve düzenlemeye açın:
nano lb.tfKaynak tanımını ekleyin:
resource "digitalocean_loadbalancer" "www-lb" {
name = "lb-${var.group_name}"
region = "fra1"
forwarding_rule {
entry_port = 80
entry_protocol = "http"
target_port = 80
target_protocol = "http"
}
healthcheck {
port = 22
protocol = "tcp"
}
droplet_ids = [
for droplet in digitalocean_droplet.droplets:
droplet.id
]
}Yük Dengeleyiciyi, tanınabilir olması için adında grup adını kullanarak tanımlarsınız. Bunu, bölgedeki drop'larla birlikte tanımlarsınız. fra1 Sonraki iki bölümde hedef ve izleme portları ve protokolleri belirtilmektedir.
Vurgulanan droplet_ids bloğu, Yük Dengeleyici tarafından yönetilmesi gereken damlacıkların kimliklerini alır. Birden fazla damlacık olduğu ve sayısı önceden bilinmediği için, damlacık koleksiyonunu (digitalocean_droplet.droplets) dolaşmak ve kimliklerini almak için bir for döngüsü kullanırsınız. For döngüsünü köşeli parantezlerle ([]) çevrelersiniz, böylece ortaya çıkan koleksiyon bir liste olur.
Dosyayı kaydedip kapatın.
Modülünüz için Droplet, Yük Dengeleyici ve değişkenleri tanımladığınıza göre, sağlayıcı gereksinimlerini tanımlamanız ve modülün hangi sağlayıcıları kullanacağını, sürümlerini ve konumlarını belirtmeniz gerekiyor. Terraform 0.13 sürümünden itibaren, modüllerin kullanacakları Hashicorp dışı sağlayıcı kaynaklarını açıkça tanımlamaları gerekiyor. Bunun nedeni, bu kaynakları ana projeden devralmayacak olmalarıdır.
Sağlayıcı gereksinimlerini şu adlı bir dosyada tanımlarsınız: sağlayıcı.tf Kaydedeceksiniz. Aşağıdakileri çalıştırarak düzenlemeye hazır hale getirin:
nano provider.tfDigitalocean sağlayıcısını zorunlu kılmak için aşağıdaki satırları ekleyin:
terraform {
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
version = "~> 2.0"
}
}
}İşiniz bittiğinde dosyayı kaydedip kapatın. Modül damlacık-lb Şimdi sağlayıcıya Dijitalokyanus İhtiyaçlar.
Modüller ayrıca, kaynaklarının durumu hakkında dahili bilgi almak için kullanabileceğiniz çıktıları da destekler. Yük Dengeleyicinin IP adresini gösteren bir çıktı tanımlar ve bunu şu adlı bir dosyaya koyarsınız: çıktılar.tf Kaydedin. Düzenlemek üzere oluşturun:
nano outputs.tfAşağıdaki tanımı ekleyin:
output "lb_ip" {
value = digitalocean_loadbalancer.www-lb.ip
}Bu çıktı, Yük Dengeleyicinin IP adresini alacaktır. Dosyayı kaydedip kapatın.
Modül damlacık-lb Artık tamamen işlevsel ve dağıtıma hazır. Projenizin kök dizinine kaydedeceğiniz ana koddan çağıracaksınız. Öncelikle, dosya dizininizde yukarı doğru çift tıklayarak ona gidin:
cd ../..Daha sonra bir dosya adı ana.tf Modülü kullanacağınız yeri oluşturun ve düzenlemeye açın:
nano main.tfAşağıdaki satırları ekleyin:
module "groups" {
source = "./modules/droplet-lb"
droplet_count = 3
group_name = "group1"
}
output "loadbalancer-ip" {
value = module.groups.lb_ip
}Bu duyuruda, modül damlacık-lb Belirtilen dizinde bulunan kaynak dizini çağırırsınız. Sağladığı girdi şudur: damlacık_sayısı Ve grup_adı Daha sonra örnekler arasında ayrım yapabilmek için bunu group1 olarak ayarlayabilirsiniz.
Yük Dengeleyici IP çıktısı bir modülde tanımlandığından, projeyi dağıttığınızda otomatik olarak gösterilmez. Bu sorunun çözümü, değerini (loadbalancer_ip) alarak başka bir çıktı oluşturmaktır.
İşiniz bittiğinde dosyayı kaydedip kapatın.
Modülü çalıştırmak için şunu çalıştırın:
terraform initÇıktı şu şekilde olacaktır:
OutputInitializing modules...
- groups in modules/droplet-lb
Initializing the backend...
Initializing provider plugins...
- Finding digitalocean/digitalocean versions matching "~> 2.0"...
- Installing digitalocean/digitalocean v2.34.1...
- Installed digitalocean/digitalocean v2.34.1 (signed by a HashiCorp partner, key ID F82037E524B9C0E8)
...
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.Terraform'un yürütme sırasında hangi eylemleri gerçekleştireceğini görmek için projeyi planlayabilirsiniz:
terraform plan -var "do_token=${DO_PAT}"Çıktı şuna benzer olacaktır:
Output...
Terraform used the selected providers to generate the following execution plan. Resource actions are
indicated with the following symbols:
+ create
Terraform will perform the following actions:
# module.groups.digitalocean_droplet.droplets[0] will be created
+ resource "digitalocean_droplet" "droplets" {
...
+ name = "group1-0"
...
}
# module.groups.digitalocean_droplet.droplets[1] will be created
+ resource "digitalocean_droplet" "droplets" {
...
+ name = "group1-1"
...
}
# module.groups.digitalocean_droplet.droplets[2] will be created
+ resource "digitalocean_droplet" "droplets" {
...
+ name = "group1-2"
...
}
# module.groups.digitalocean_loadbalancer.www-lb will be created
+ resource "digitalocean_loadbalancer" "www-lb" {
...
+ name = "lb-group1"
...
}
Plan: 4 to add, 0 to change, 0 to destroy.
...Bu çıktı, Terraform'un group1-0, group1-1 ve group1-2 adında üç damlacık oluşturduğunu ve ayrıca bu üç damlacığa giden ve bu damlacıklardan gelen trafiği işleyen group1-lb adında bir Yük Dengeleyici oluşturduğunu açıklıyor.
Aşağıdakileri çalıştırarak projeyi buluta dağıtabilirsiniz:
terraform apply -var "do_token=${DO_PAT}"İstendiğinde "evet" girin. Çıktıda tüm eylemler gösterilecek ve Yük Dengeleyici IP adresi de görüntülenecektir:
Outputmodule.groups.digitalocean_droplet.droplets[1]: Creating...
module.groups.digitalocean_droplet.droplets[0]: Creating...
module.groups.digitalocean_droplet.droplets[2]: Creating...
...
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
Outputs:
loadbalancer-ip = ip_addressYapılandırılabilir sayıda droplet ve bunların gelen ve giden trafiğini otomatik olarak yönetecek şekilde yapılandırılan bir yük dengeleyici içeren bir modül oluşturdunuz.
Dağıtılan kaynakları yeniden adlandırın
Önceki bölümde, tanımladığınız modülü dağıtıp Grup adını verdiniz. Adını değiştirmek isterseniz, modül çağrısının adını değiştirmek beklenen sonuçları vermeyecektir. Çağrının adını değiştirmek, Terraform'un kaynakları yok edip yeniden oluşturmasına ve aşırı kesintiye neden olacaktır.
Örneğin, ana.tf Düzenlemek için şunu çalıştırarak açın:
nano main.tfGruplar modülünün adını belirtildiği gibi group_renamed olarak değiştirin:
module "groups_renamed" {
source = "./modules/droplet-lb"
droplet_count = 3
group_name = "group1"
}
output "loadbalancer-ip" {
value = module.groups_renamed.lb_ip
}Dosyayı kaydedip kapatın. Ardından projeyi tekrar başlatın:
terraform initArtık projeyi planlayabilirsiniz:
terraform plan -var "do_token=${DO_PAT}"Çıktı uzun olacak ama aşağıdaki gibi görünecektir:
Output...
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
- destroy
Terraform will perform the following actions:
# module.groups.digitalocean_droplet.droplets[0] will be destroyed
...
# module.groups_renamed.digitalocean_droplet.droplets[0] will be created
...Terraform, mevcut örnekleri yok etmenizi ve yeni örnekler oluşturmanızı gerektirir. Bu yıkıcı ve gereksizdir ve istenmeyen çökmelere yol açabilir.
Bunun yerine, Terraform'a taşınan bloğu kullanarak eski kaynakları yeni adla taşımasını söyleyebilirsiniz. Düzenlemek için main.tf dosyasını açın ve dosyanın sonuna aşağıdaki satırları ekleyin:
moved {
from = module.groups
to = module.groups_renamed
}İşiniz bittiğinde dosyayı kaydedip kapatın.
Artık projeyi planlayabilirsiniz:
terraform plan -var "do_token=${DO_PAT}"main.tf dosyasındaki taşınmış blokla programlama yaptığınızda, Terraform kaynakları yeniden oluşturmak yerine taşımak istiyor:
OutputTerraform will perform the following actions:
# module.groups.digitalocean_droplet.droplets[0] has moved to module.groups_renamed.digitalocean_droplet.droplets[0]
...
# module.groups.digitalocean_droplet.droplets[1] has moved to module.groups_renamed.digitalocean_droplet.droplets[1]
...Mobil kaynaklar Terraform modunda konumlarını değiştirir; bu da gerçek bulut kaynaklarının değiştirilmediği, yok edilmediği veya yeniden oluşturulmadığı anlamına gelir.
Bir sonraki adımda yapılandırmayı önemli ölçüde değiştireceğinizden, dağıtılan kaynakları şu komutu çalıştırarak güncelleyin:
terraform destroy -var "do_token=${DO_PAT}"Sana sorulduğunda, Evet Enter tuşuna basın. Çıktı şu şekilde biter:
Output...
Destroy complete! Resources: 4 destroyed.Bu bölümde, Terraform projenizdeki kaynakları yok etmeden yeniden adlandırdınız. Şimdi, for_each ve count kullanarak aynı koddan bir modülün birden fazla örneğini dağıtacaksınız.
Birden fazla modül örneğini dağıtma
Bu bölümde, droplet-lb modülünü özelleştirmeyle birden çok kez dağıtmak için count ve for_each komutlarını kullanacaksınız.
Sayımı kullanarak
Bir modülün birden fazla örneğini aynı anda dağıtmanın bir yolu, her modül için otomatik olarak kullanılabilen count parametresine bir sayım değeri geçirmektir. Düzenleme için main.tf dosyasını açın:
nano main.tfMevcut çıktı tanımını ve taşınan bloğu silerek aşağıdaki şekilde değiştirin:
module "groups" {
source = "./modules/droplet-lb"
count = 3
droplet_count = 3
group_name = "group1-${count.index}"
}Sayıyı 3 olarak ayarlayarak, Terraform'a modülü her biri farklı bir grup adıyla üç kez dağıtma talimatı vermiş olursunuz. İşiniz bittiğinde dosyayı kaydedip kapatın.
Dağıtımı şu komutu çalıştırarak planlayın:
terraform plan -var "do_token=${DO_PAT}"Çıktı uzun olacak ve şöyle görünecektir:
Output...
Terraform used the selected providers to generate the following execution plan. Resource actions are
indicated with the following symbols:
+ create
Terraform will perform the following actions:
# module.groups[0].digitalocean_droplet.droplets[0] will be created
...
# module.groups[0].digitalocean_droplet.droplets[1] will be created
...
# module.groups[0].digitalocean_droplet.droplets[2] will be created
...
# module.groups[0].digitalocean_loadbalancer.www-lb will be created
...
# module.groups[1].digitalocean_droplet.droplets[0] will be created
...
# module.groups[1].digitalocean_droplet.droplets[1] will be created
...
# module.groups[1].digitalocean_droplet.droplets[2] will be created
...
# module.groups[1].digitalocean_loadbalancer.www-lb will be created
...
# module.groups[2].digitalocean_droplet.droplets[0] will be created
...
# module.groups[2].digitalocean_droplet.droplets[1] will be created
...
# module.groups[2].digitalocean_droplet.droplets[2] will be created
...
# module.groups[2].digitalocean_loadbalancer.www-lb will be created
...
Plan: 12 to add, 0 to change, 0 to destroy.
...Terraform, çıktıda üç modül örneğinin her birinin üç Droplet ve bunlarla ilişkili bir Yük Dengeleyiciye sahip olduğunu açıklıyor.
for_each kullanımı
Daha karmaşık örnek özelleştirmesine ihtiyaç duyduğunuzda veya örnek sayısının kod yazılırken bilinmeyen üçüncü taraf verilerine (genellikle bir harita olarak sağlanır) bağlı olduğu durumlarda modüller için for_each kullanabilirsiniz.
Şimdi, grup adlarını damlacık sayısıyla eşleştiren ve damlacık-lb örneklerini buna göre uygulayan bir harita tanımlayın. Düzenlemek için main.tf dosyasını şu komutu çalıştırarak açın:
nano main.tfDosyayı aşağıdaki şekilde değiştirin:
variable "group_counts" {
type = map
default = {
"group1" = 1
"group2" = 3
}
}
module "groups" {
source = "./modules/droplet-lb"
for_each = var.group_counts
droplet_count = each.value
group_name = each.key
}İlk olarak, belirli bir gruptaki damlacık sayısını içeren group_counts adlı bir harita tanımlarsınız. Ardından, droplet-lb modülünü çağırırsınız, ancak for_each döngüsünün daha önce tanımladığınız var.group_counts haritası üzerinde çalışmasını belirtirsiniz. droplet_count, geçerli grup için damlacık sayısını gösteren mevcut çift değeri olan each.value'yu alır. group_name ise grup adını alır.
İşiniz bittiğinde dosyayı kaydedip kapatın.
Aşağıdakileri çalıştırarak yapılandırmayı uygulamayı deneyin:
terraform plan -var "do_token=${DO_PAT}"Çıktı, Terraform'un bu iki grubu Droplet'ler ve Yük Dengeleyiciler ile oluşturma eylemlerinin ayrıntılarını gösterir:
Output...
Terraform used the selected providers to generate the following execution plan. Resource actions are
indicated with the following symbols:
+ create
Terraform will perform the following actions:
# module.groups["group1"].digitalocean_droplet.droplets[0] will be created
...
# module.groups["group1"].digitalocean_loadbalancer.www-lb will be created
...
# module.groups["group2"].digitalocean_droplet.droplets[0] will be created
...
# module.groups["group2"].digitalocean_droplet.droplets[1] will be created
...
# module.groups["group2"].digitalocean_droplet.droplets[2] will be created
...
# module.groups["group2"].digitalocean_loadbalancer.www-lb will be created
...Bu noktada, aynı koddan bir modülün birden fazla özelleştirilmiş örneğini dağıtmak için count ve for_each'i kullandınız.
Sonuç
Bu eğitimde, Terraform modülleri oluşturup uyguladınız. Mantıksal olarak ilişkili kaynakları gruplamak için modülleri kullandınız ve merkezi bir kod tanımının birden fazla farklı örneğini dağıtmak için bunları özelleştirdiniz. Ayrıca, modüldeki kaynakların özelliklerini görüntülemek için çıktıları kullandınız.









