terraform_data – جلوگیری از تخلفات تکراری منابع در لاجورد با چک

نمای کلی
به یک پست دیگر در سری Terraform خوش آمدید ، خطاهای Terraform! در این پست ، ما چگونگی جلوگیری از تخلفات تکراری منابع در لاجورد هنگام کار با Terraform را با استفاده از terraform_data منبع برای بررسی اینکه آیا یک منبع از قبل قبل از ایجاد آن وجود دارد یا خیر.
در پست قبلی این سری: “تسلط بر نقض idempotency – رسیدگی به درگیری های منابع و شکست در لاجورد”، شما ممکن است قبلاً با استفاده از آن آشنا باشید null_resource
وت local-exec
تهیه کنندگان برای اجرای اسکریپت ها یا انجام اقدامات خاصی که در پرونده حالت تنظیمات Terraform ثبت نمی شوند.
خوشبختانه ، همین قابلیت ها اکنون به طور بومی در Terraform با استفاده از آن پشتیبانی می شود terraform_data
به جای آن ، و null_resource
اکنون کاهش یافته است.
با Terraform v1.4 همین قابلیت ها اکنون به صورت بومی ساخته شده است. اساساً یک منبع کانتینر خالی است که همه کارها را انجام می دهد null_resource
انجام داد ، اما بدون چمدان اضافی برای مدیریت یک ارائه دهنده جداگانه.
این منبع جدید همچنین دارای ویژگی برابری است null_resource
، بنابراین می توانید بدون از دست دادن ضرب و شتم تغییر دهید.
بیایید نگاهی به سناریویی بیندازیم که در آن می توانید از آن استفاده کنید terraform_data
منبع برای جلوگیری از تخلفات تکراری منابع در لاجورد هنگام کار با Terraform.
سناریو
یک سناریوی معمولی زمانی است که شما سعی می کنید منبعی را در لاجورد ایجاد کنید ، اما در حال حاضر وجود دارد (شاید در خارج از Terraform یا در طول اجرای قبلی ایجاد شده باشد). این می تواند منجر به خطاهایی مانند شود Error: A resource with the ID already exists - to be managed via Terraform this resource needs to be imported into the State.
اگر می خواهید منبع را در Terraform مدیریت کنید ، می توانید از آن استفاده کنید import
برای وارد کردن منبع موجود به حالت Terraform ، بلوک کنید.
به پست قبلی من نگاهی بیندازید: “تسلط بر نقض idempotency – رسیدگی به درگیری های منابع و شکست در لاجورد” برای دیدن چگونه می توانید وارد کردن منابع موجود به حالت Terraform با استفاده از جدید “واردات” اگر این منبع توسط Terraform مدیریت شود ، بلوک کنید.
با این حال ، در بعضی موارد ممکن است شما بخواهید import
منبع یا مدیریت منبع در Terraform. شاید این مسئولیت شما برای مدیریت منبع باشد ، یا ممکن است بخشی از استقرار متفاوت باشد.
در این شرایط می توانید از terraform_data
منبع برای بررسی اینکه آیا منبعی از قبل وجود دارد یا خیر. به این ترتیب می توانید با ایجاد منابع فقط در صورت لزوم از تخلف جلوگیری کنید و همچنین اطمینان حاصل کنید که اگر پیکربندی به منابع موجود که نمی خواهید در Terraform مدیریت کنید ، کد شما در حال اجرا خواهد بود.
این روش زمانی مفید است که می خواهید فقط منابع را به صورت مشروط بررسی و ایجاد کنید و می تواند انعطاف پذیر تر باشد. تنها اشکال این است که شما قادر نخواهید بود منبع را در Terraform همانطور که ذکر شد مدیریت کنید ، اما همیشه می توانید import
در صورت نیاز بعداً منبع.
نمونه
به عنوان مثال بگویید که می خواهید در داخل یک منابع ایجاد کنید گروه منابع فراخوانی Demo-Inf-Dev-Rg-720
، اما گروه منابع در حال حاضر وجود دارد و توسط تیم دیگری در سازمان شما مدیریت و ارائه می شود. اگر سعی در ایجاد گروه منابع کردید ، خطایی خواهید داشت که می گوید گروه منابع در حال حاضر وجود دارد: Error: A resource with the ID already exists - to be managed via Terraform this resource needs to be imported into the State.
یک گروه منابع لاجورد نمونه ای بسیار اساسی است ، اما همین مفهوم را می توان برای هر منبعی در لاجورد اعمال کرد که ممکن است شما به آن وابستگی داشته باشید که در خارج از Terraform مدیریت می شود که با استفاده دیگر ایجاد شده است.
در مثال ما می توانید از terraform_data
منبع با local-exec
در عوض ، برای بررسی اینکه آیا گروه منابع وجود دارد و فقط در صورت عدم وجود آن ، آن را ایجاد کنید. بیایید نگاهی بیندازیم:
resource "terraform_data" "rg_check" {
input = var.resource_group_name
triggers_replace = timestamp()
provisioner "local-exec" {
# Use the Azure CLI with PowerShell Core to check if the resource group exists and create if not
interpreter = ["pwsh", "-Command"]
command = <<EOT
$ErrorActionPreference = "Stop"
az login --service-principal --username $env:ARM_CLIENT_ID --password $env:ARM_CLIENT_SECRET --tenant $env:ARM_TENANT_ID --output none
az account set --subscription $env:ARM_SUBSCRIPTION_ID --output none
$rg_verify = az group show --name ${var.resource_group_name} --query id --output tsv
if ($rg_verify) {
$rg_exist = Write-Output "$rg_verify"
} else {
$rg_create = (az group create --name ${var.resource_group_name} --location ${var.location} --query id --output tsv)
}
EOT
}
}
output "rg_id_output" {
description = "The ID of the resource group that was created or already existed"
value = terraform_data.rg_check.output
}
بیایید کد بالا را تجزیه کنیم و ببینیم که چگونه کار می کند:
تعریف منابع: terraform_data.rg_check
resource "terraform_data" "rg_check" {
input = var.resource_group_name
triggers_replace = timestamp()
این بلوک یک منبع Terraform به نام را تعریف می کند terraform_data.rg_check
بشر این دو ویژگی دارد:
-
ورودی: این روی مقدار متغیر تنظیم شده است
var.resource_group_name
، که انتظار می رود نام گروه منابع برای بررسی باشد. -
triggers_replace: این به جریان تنظیم شده است
timestamp()
، اطمینان از اینکه این منبع در هر زمان تغییر می کند ، دوباره ارزیابی می شود. این نوع ماشه باعث می شود که هر بار که پیکربندی اعمال شود ، منبع مجدداً ارزیابی شود ، که وقتی می خواهید بررسی کنید که آیا این منبع هر بار که پیکربندی اعمال می شود ، از آنجا که توسط Terraform اداره نمی شود ، مفید است و ممکن است در خارج از آن تغییر کند Terraform
مقررات: local-exec
provisioner "local-exec" {
# Use the Azure CLI with PowerShell Core to check if the resource group exists and create if not
interpreter = ["pwsh", "-Command"]
command = <<EOT
$ErrorActionPreference = "Stop"
az login --service-principal --username $env:ARM_CLIENT_ID --password $env:ARM_CLIENT_SECRET --tenant $env:ARM_TENANT_ID --output none
az account set --subscription $env:ARM_SUBSCRIPTION_ID --output none
$rg_verify = az group show --name ${var.resource_group_name} --query id --output tsv
if ($rg_verify) {
$rg_exist = Write-Output "$rg_verify"
} else {
$rg_create = (az group create --name ${var.resource_group_name} --location ${var.location} --query id --output tsv)
}
EOT
}
}
این بلوک تو در تو در داخل منبع ، تعریف می کند local-exec
تأمین کننده ، که به شما امکان می دهد یک دستور محلی را با استفاده از آن اجرا کنید هسته قدرت به عنوان مثال تهیه کننده ویژگی های زیر را دارد:
- مترجم: مترجم را برای استفاده ، در این مورد ، مشخص می کند PowerShell Core (PWSH)بشر شما باید اطمینان حاصل کنید که PowerShell Core روی دستگاهی که پیکربندی Terraform در آن اعمال می شود نصب شده است.
-
دستور: شامل اسکریپت PowerShell برای اجرای آن است. فیلمنامه موارد زیر را انجام می دهد:
- ترجیح عمل خطا را برای “متوقف کردن” برای متوقف کردن اجرای هرگونه خطا تنظیم می کند.
- با استفاده از یک مدیر خدمات با اعتبارنامه ارائه شده از طریق متغیرهای محیط ، وارد لاجورد شوید. در این حالت اسکریپت از آن استفاده می کند اعتبار اصلی خدمات لاجورد ذخیره شده به عنوان اسرار GitHub و به عنوان متغیرهای محیط به گردش کار اقدامات GitHub فرآیند CI/CD.
- زمینه اشتراک لاجورد را که در آن مدیر خدمات در آن قرار دارد تنظیم می کند در حال حاضر / RBAC دسترسی به
- بررسی می کند که آیا گروه منابع مشخص شده توسط
var.resource_group_name
وجود دارد استفاده لاجورد کلیبشر - اگر گروه منابع وجود داشته باشد ، آن را خروجی می کند
resource group ID
بشر - اگر گروه منابع وجود نداشته باشد ، گروه منابع را با استفاده از آن ایجاد می کند لاجورد کلی در مکان مشخص شده و جدید را خروجی می کند
resource group ID
بشر
توجه: زیرا فیلمنامه از a استفاده می کند local-exec
کمیسیون ها ، استفاده کنید هسته قدرت، ما همچنین از لاجورد کلی برای تعامل با لاجورد. بنابراین شما نیاز به داشتن لاجورد کلی همچنین بر روی دستگاهی که پیکربندی Terraform در آن اعمال می شود نصب شده است.
تعریف خروجی: rg_id_output
output "rg_id_output" {
description = "The ID of the resource group that was created or already existed"
value = terraform_data.rg_check.output
}
این بلوک یک متغیر خروجی به نام را تعریف می کند rg_id_output
بشر این ویژگی های زیر را دارد:
- توضیحات: شرح مختصری از خروجی ، نشان می دهد که این نشان دهنده شناسه گروه منابع است که یا ایجاد شده یا از قبل وجود داشته است.
-
مقدار: مقدار خروجی ، که تنظیم شده است
terraform_data.rg_check.output
بشر این باید خروجی ازlocal-exec
مقررات
توجه: در --output
پرچم تنظیم شده است tsv
در دستورات Azure CLI برای خروج از نتیجه ، و نتیجه آن به عنوان متغیر خروجی به Terraform ارسال می شود تا با استفاده از آن در سایر قسمت های پیکربندی استفاده شود. terraform_data.rg_check.
متغیر این مفید است اگر می خواهید فقط خروجی های خاص را ضبط کنید local-exec
تهیه و استفاده از آن در سایر قسمت های پیکربندی Terraform.
پایان
در این پست ، ما به بررسی چگونگی جلوگیری از تخلفات تکراری منابع در لاجورد هنگام کار با Terraform با استفاده از terraform_data
منبع برای بررسی اینکه آیا منبعی از قبل قبل از ایجاد مشروط وجود دارد. به یاد داشته باشید منابعی که با استفاده از این تکنیک در لاجورد ایجاد می کنید توسط Terraform مدیریت نمی شود ، بنابراین اگر نیاز به مدیریت منبع در Terraform در زمان بعدی دارید ، همیشه می توانید در صورت لزوم این منبع را به حالت Terraform وارد کنید.
آیا در Terraform با مشکلات idempotency روبرو شده اید؟ راه حل های خود را در نظرات به اشتراک بگذارید!
اگر از این پست لذت بردید و می خواهید درباره آن اطلاعات بیشتری کسب کنید شکل وت لاجورد، دیگر سری Terraform من را بررسی کنید نکات PRO Terraformبشر
نویسنده
مانند ، به اشتراک بگذارید ، مرا دنبال کنید: 🐙 github | 🐧 x/توییتر | 👾 لینکدین
