برنامه نویسی

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.

تصویر. png

یک گروه منابع لاجورد نمونه ای بسیار اساسی است ، اما همین مفهوم را می توان برای هر منبعی در لاجورد اعمال کرد که ممکن است شما به آن وابستگی داشته باشید که در خارج از 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.

تصویر. png

پایان

در این پست ، ما به بررسی چگونگی جلوگیری از تخلفات تکراری منابع در لاجورد هنگام کار با Terraform با استفاده از terraform_data منبع برای بررسی اینکه آیا منبعی از قبل قبل از ایجاد مشروط وجود دارد. به یاد داشته باشید منابعی که با استفاده از این تکنیک در لاجورد ایجاد می کنید توسط Terraform مدیریت نمی شود ، بنابراین اگر نیاز به مدیریت منبع در Terraform در زمان بعدی دارید ، همیشه می توانید در صورت لزوم این منبع را به حالت Terraform وارد کنید.

آیا در Terraform با مشکلات idempotency روبرو شده اید؟ راه حل های خود را در نظرات به اشتراک بگذارید!

اگر از این پست لذت بردید و می خواهید درباره آن اطلاعات بیشتری کسب کنید شکل وت لاجورد، دیگر سری Terraform من را بررسی کنید نکات PRO Terraformبشر

نویسنده

مانند ، به اشتراک بگذارید ، مرا دنبال کنید: 🐙 github | 🐧 x/توییتر | 👾 لینکدین

تصویر PWD9000

https%3A%2F%2Fimg.buymeacoffee

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا