راځئ چې یو څو نیمګړتیاوې په ګوته کړو، پشمول د لوپونو پورې اړوند، که بیانات او د ځای پرځای کولو تخنیکونه، او همدارنګه نور عمومي مسلې چې په عمومي توګه د ټرافورم اغیزه کوي:
شمیرنه او د هر پیرامیټر لپاره محدودیتونه لري؛
د صفر ځنډ وخت محدودول؛
حتی یو ښه پلان ناکام کیدی شي؛
ریفاکتور کول کولی شي خپل زیانونه ولري.
ځنډول شوی همغږي د ځنډ سره مطابقت لري.
شمېرنه او for_each پیرامیټونه محدودیتونه لري
په دې څپرکي کې مثالونه په لوپس او مشروط منطق کې د شمیرنې پیرامیټر او د هر بیان لپاره پراخه کار اخلي. دوی ښه فعالیت کوي، مګر دوی دوه مهم محدودیتونه لري چې تاسو یې باید خبر وي.
که تاسو په دې کوډ کې د ټرافورم پلان پرمخ وړئ، نو تاسو به لاندې تېروتنه ترلاسه کړئ:
Error: Invalid count argument
on main.tf line 30, in resource "aws_instance" "example_3":
30: count = random_integer.num_instances.result
The "count" value depends on resource attributes that cannot be determined until apply, so Terraform cannot predict how many instances will be created. To work around this, use the -target argument to first apply only the resources that the count depends on.
Terraform اړتیا لري چې د پالن جوړونې مرحلې په جریان کې د هرې سرچینې د رامینځته کیدو یا بدلولو دمخه د هرچا لپاره شمیرل او محاسبه شي. دا پدې مانا ده چې شمیره او هر یو کولی شي لغوي، متغیرونو، د معلوماتو سرچینو، او حتی د سرچینو لیستونو ته مراجعه وکړي (تر هغه چې د دوی اوږدوالی د مهال ویش په وخت کې ټاکل کیدی شي)، مګر د محاسبې سرچینې تولید متغیرونو ته نه.
شمېرنه او for_each د ماډل ترتیب کې نشي کارول کیدی
یوه ورځ به تاسو د خپل ماډل ترتیب کې د شمیرنې پیرامیټر اضافه کولو لپاره لیوالتیا ولرئ:
دا کوډ هڅه کوي د ماډل دننه شمیره وکاروي ترڅو د ویب سرور - کلستر سرچینې درې کاپي رامینځته کړي. یا تاسو ممکن د یو ماډل سره وصل کول اختیاري کړئ چې د ځینې بولین حالت پورې اړه لري د هغې د شمیرنې پیرامیټر 0 ته په ترتیب کولو سره. دا ممکن د مناسب کوډ په څیر ښکاري ، مګر تاسو به دا تېروتنه ترلاسه کړئ کله چې د ټرافارم پلان اجرا کول:
Error: Reserved argument name in module block
on main.tf line 13, in module "count_example":
13: count = 3
The name "count" is reserved for use in a future version of Terraform.
له بده مرغه، د Terraform 0.12.6 په څیر، د ماډل سرچینې کې د شمېرنې یا for_each کارول نه ملاتړ کیږي. د Terraform 0.12 ریلیز یادښتونو (http://bit.ly/3257bv4) له مخې، HashiCorp پالن لري چې دا وړتیا په راتلونکي کې اضافه کړي، نو پدې پورې اړه لري چې تاسو دا کتاب لوستلو په وخت کې، دا ممکن دمخه شتون ولري. د ډاډ ترلاسه کولو لپاره، دلته د Terraform changelog ولولئ.
د صفر ښکته وخت ګمارلو محدودیتونه
د ASG سره په ترکیب کې د create_before_destroy بلاک کارول د صفر-Downtime ګمارنې رامینځته کولو لپاره عالي حل دی ، پرته له یو خبرداری: د اتوماتیک کولو مقررات نه ملاتړ کیږي. یا د ډیر دقیق کیدو لپاره ، دا د ASG اندازه بیرته په هره ګمارنه کې min_size ته بیا تنظیموي ، کوم چې ستونزه کیدی شي که تاسو د چلولو سرورونو شمیر زیاتولو لپاره د اتوماتیک کولو قواعد وکاروئ.
د مثال په توګه، د ویبسرور-کلستر ماډل یو جوړه aws_autoscaling_schedule سرچینې لري، کوم چې د سهار په 9 بجو په کلستر کې د سرورونو شمیر له دوو څخه تر لسو ډیروي. که تاسو د سهار په 11 بجو ځای په ځای کړئ ، نو نوی ASG به د لسو پرځای یوازې دوه سرورونو سره بوټ شي او د بلې ورځې تر 9 بجو پورې به همداسې پاتې وي.
دا محدودیت په څو لارو مخنیوی کیدی شي.
په aws_autoscaling_schedule کې د تکرار پیرامیټر له 0 9 * * * ("د سهار په 9 بجو") بدل کړئ لکه 0-59 9-17 * * * ("هره دقیقه د سهار له 9 بجو څخه تر 5 بجو پورې چلول"). که چیرې ASG دمخه لس سرورونه ولري ، نو د دې اتوماتیک کولو قاعدې بیا چلول به هیڅ شی بدل نکړي ، کوم چې موږ یې غواړو. مګر که ASG یوازې په دې وروستیو کې ځای پر ځای شوی وي، دا قاعده به ډاډ ترلاسه کړي چې په یوه دقیقه کې به د دې سرورونو شمیر لسو ته ورسیږي. دا په بشپړه توګه په زړه پورې طریقه نه ده، او له لسو څخه تر دوو سرورونو او شاته لوی کودونه هم د کاروونکو لپاره ستونزې رامنځته کولی شي.
resource "aws_iam_user" "existing_user" {
# Подставьте сюда имя уже существующего пользователя IAM,
# чтобы попрактиковаться в использовании команды terraform import
name = "yevgeniy.brikman"
}
اوس، که تاسو د پلان قومانده پرمخ وړئ، Terraform به د مناسب ځای پرځای کولو پلان تولید کړي:
Terraform will perform the following actions:
# aws_iam_user.existing_user will be created
+ resource "aws_iam_user" "existing_user" {
+ arn = (known after apply)
+ force_destroy = false
+ id = (known after apply)
+ name = "yevgeniy.brikman"
+ path = "/"
+ unique_id = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
که تاسو د پلي کولو کمانډ پرمخ وړئ نو تاسو به لاندې تېروتنه ترلاسه کړئ:
Error: Error creating IAM User yevgeniy.brikman: EntityAlreadyExists:
User with name yevgeniy.brikman already exists.
on main.tf line 10, in resource "aws_iam_user" "existing_user":
10: resource "aws_iam_user" "existing_user" {
ستونزه، البته، دا ده چې د دې نوم سره د IAM کاروونکي لا دمخه شتون لري. او دا نه یوازې د IAM کاروونکو ته پیښ کیدی شي ، مګر نږدې هرې سرچینې ته. دا ممکنه ده چې یو څوک دا سرچینه په لاسي ډول رامینځته کړي یا د کمانډ لاین په کارولو سره ، مګر په هرصورت ، د IDs سره سمون د شخړو لامل کیږي. د دې تېروتنې ډیری توپیرونه شتون لري چې ډیری وختونه په حیرانتیا سره Terraform ته نوي راغلي.
کلیدي ټکی دا دی چې د ټرافورم پلان کمانډ یوازې هغه سرچینې په پام کې نیسي چې د ټیرفارم ریاست فایل کې مشخص شوي. که سرچینې په کوم بل ډول رامینځته شي (د مثال په توګه ، په لاسي ډول د AWS کنسول کې کلیک کولو سره) ، دوی به په دولتي فایل کې پای ته ونه رسیږي او له همدې امله د پلان قوماندې اجرا کولو پرمهال ټیرافارم به دوی په پام کې ونه نیسي. د پایلې په توګه، یو پلان چې په لومړي نظر کې سم ښکاري به ناکامه وي.
له دې څخه د زده کړې دوه درسونه دي.
که تاسو دمخه د Terraform سره کار پیل کړی وي ، نو بل څه مه کاروئ. که ستاسو د زیربنا یوه برخه د Terraform په کارولو سره اداره کیږي، تاسو نور نشئ کولی دا په لاسي ډول ترمیم کړئ. که نه نو، تاسو نه یوازې د عجیب Terraform غلطیو خطر لرئ، مګر تاسو د IaC ډیری ګټې هم ردوي ځکه چې کوډ به نور ستاسو د زیربنا سمه نمایش نه وي.
که تاسو دمخه یو څه زیربنا لرئ، د وارداتو کمانډ وکاروئ. که تاسو د موجوده زیربنا سره د Terraform کارولو پیل کوئ ، تاسو کولی شئ دا د ټیرافارم وارداتو کمانډ په کارولو سره په دولتي فایل کې اضافه کړئ. په دې توګه Terraform به پوه شي چې کوم زیربنا اداره کولو ته اړتیا لري. د وارداتو قومانده دوه دلیلونه اخلي. لومړی ستاسو د تشکیلاتو فایلونو کې د سرچینې پته ده. دلته ترکیب د سرچینو لینکونو لپاره ورته دی: _. (لکه aws_iam_user.existing_user). دوهم دلیل د سرچینې ID دی چې باید وارد شي. راځئ چې ووایو د سرچینې ID aws_iam_user د کارونکي نوم دی (د مثال په توګه ، yevgeniy.brikman) ، او د سرچینې ID aws_instance د EC2 سرور ID دی (لکه i-190e22e5). د سرچینې واردولو څرنګوالی معمولا د دې پاڼې په پای کې په اسنادو کې ښودل کیږي.
لاندې د وارداتو کمانډ دی چې د aws_iam_user سرچینې سره همغږي کوي چې تاسو په 2 فصل کې د IAM کارونکي سره په خپل Terraform ترتیب کې اضافه کړې (البته د yevgeniy.brikman لپاره ستاسو نوم ځای په ځای کول):
Terraform به ستاسو د IAM کارونکي موندلو لپاره AWS API ته زنګ ووهي او ستاسو د Terraform ترتیب کې د دې او aws_iam_user.existing_user سرچینې ترمنځ د دولتي فایل اتحادیه رامینځته کړي. له اوس څخه، کله چې تاسو د پلان کمانډ پرمخ وړئ، Terraform به پوه شي چې د IAM کاروونکي لا دمخه شتون لري او بیا به یې د جوړولو هڅه ونه کړي.
دا د یادونې وړ ده چې که تاسو دمخه ډیری سرچینې لرئ چې تاسو غواړئ په ټیرفارم کې وارد کړئ ، په لاسي ډول کوډ لیکل او په یو وخت کې د هر یو واردول ممکن یوه ستونزه وي. نو دا د یوې وسیلې په لټه کې دي لکه Terraforming (http://terraforming.dtan4.net/)، کوم چې کولی شي په اتوماتيک ډول ستاسو د AWS حساب څخه کوډ او حالت وارد کړي.
Refactoring کولی شي خپل زیانونه ولري
ریفکټور کول په برنامه کولو کې یو عام عمل دی چیرې چې تاسو د کوډ داخلي جوړښت بدل کړئ پداسې حال کې چې بهرني چلند بدلیږي. دا د دې لپاره دی چې کوډ روښانه، پاک، او د ساتلو لپاره اسانه کړي. Refactoring یو اړین تخنیک دی چې باید په منظمه توګه وکارول شي. مګر کله چې دا د Terraform یا کوم بل IaC وسیلې ته راځي ، تاسو باید د دې په اړه خورا محتاط اوسئ چې تاسو د کوډ یوې برخې "بهرني چلند" څخه څه معنی لرئ ، که نه نو غیر متوقع ستونزې به رامینځته شي.
د مثال په توګه، د بیاکتنې یو عام ډول د متغیرونو یا افعالونو نومونه د ډیر پوهیدو وړ نومونو سره بدلول دي. ډیری IDEs د ریفکتور کولو لپاره جوړ شوي ملاتړ لري او کولی شي په اوتومات ډول د پروژې په اوږدو کې متغیرونه او افعال بدل کړي. د عمومي هدف پروګرام کولو ژبو کې، دا یو کوچنی طرزالعمل دی چې تاسو یې فکر نه کوئ، مګر په ټیرفارم کې تاسو باید د دې سره خورا محتاط اوسئ، که نه نو تاسو ممکن د بندیدو تجربه وکړئ.
د مثال په توګه، د ویبسرور-کلستر ماډل د ان پټ متغیر کلستر_نوم لري:
variable "cluster_name" {
description = "The name to use for all the cluster resources"
type = string
}