التشغيل السريع: تعيين نهج لتحديد الموارد غير المتوافقة باستخدام "Terraform"

تتمثل الخطوة الأولى في فهم التوافق في "Azure" في تحديد حالة مواردك. يعمل التشغيل السريع على تحديد الخطوات اللازمة من خلال عملية تعيين نهج لتحديد الأجهزة الافتراضية التي لا تستخدم الأقراص المُدارة.

في نهاية هذه العملية، ستحدد بنجاح الأجهزة الظاهرية التي لا تستخدم الأقراص المدارة عبر الاشتراك. فإنها غير متوافقة مع تعيين النهج.

المتطلبات الأساسية

إنشاء تكوين "Terraform" والمتغير ومخرجات الملف

بالنسبة لهذا التشغيل السريع، يمكنك تعيين نهج بجانب تعيينالأجهزة الظاهرية الخاصة بالتدقيق، والتي لا تستخدم الأقراص المُدارة (06a78e20-9358-41c9-923c-fb736d382a4d). يعمل تعريف النهج هذا على تحديد الموارد غير المتوافقة مع الشروط المحددة في تعريف النهج.

أولاً، قم بإنشاء تكوين "Terraform" والمتغير ومخرجات الملف. تستخدم موارد "Terraform" الخاصة بنهج "Azure" موفّر خدمات "Azure".

  1. قم بإنشاء مجلد جديد باسم policy-assignment وبعدها قم بتغيير الدلائل فيه.

  2. قم بإنشاء main.tf باستخدام الكود التالي:

    ملاحظة

    لإنشاء تعيين نهج في مجموعة إدارة، استخدم مورد azurerm_management_group_policy_assignment ، بالنسبة لمجموعة الموارد، استخدم azurerm_resource_group_policy_assignment وللاشتراك استخدم مورد azurerm_subscription_policy_assignment .

      provider "azurerm" {
        features {}
      }
    
      terraform {
      required_providers {
          azurerm = {
              source = "hashicorp/azurerm"
              version = ">= 2.96.0"
          }
      }
      }
    
      resource "azurerm_subscription_policy_assignment" "auditvms" {
      name = "audit-vm-manageddisks"
      subscription_id = var.cust_scope
      policy_definition_id = "/providers/Microsoft.Authorization/policyDefinitions/06a78e20-9358-41c9-923c-fb736d382a4d"
      description = "Shows all virtual machines not using managed disks"
      display_name = "Audit VMs without managed disks assignment"
      }
    
  3. قم بإنشاء variables.tf باستخدام الكود التالي:

    variable "cust_scope" {
        default = "{scope}"
    }
    

    يحدد النطاق الموارد أو مجموعة الموارد التي سيُفرض عليهما تعيين النهج. يمكن أن تتراوح من مجموعة إدارة إلى مورّد فردي. تأكد من استبدال {scope} بأحد الأنماط التالية استنادا إلى المورد المعلن:

    • الاشتراك: ⁧/subscriptions/{subscriptionId}
    • مجموعة الموارد: ⁧/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}
    • المورّد: /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/[{parentResourcePath}/]
  4. قم بإنشاء output.tf باستخدام الكود التالي:

    output "assignment_id" {
        value = azurerm_subscription_policy_assignment.auditvms.id
    }
    

تهيئة "Terraform" وإنشاء خطة

بعد ذلك، قم بتهيئة "Terraform" لتحميل مقدمي الخدمات الضروريين، وبعدها قم بإنشاء خطة.

  1. تشغيل أمر "terraform init". يعمل هذا الأمر على تحميل وحدات "Azure" اللازمة لإنشاء موارد "Azure" في تكوين "Terraform".

    terraform init
    

    Screenshot of running the terraform init command that shows downloading the azurerm module and a success message.

  2. المصادقة باستخدام "Azure CLI" لــ "Terraform". لمزيد من المعلومات، يُرجى الرجوع إلى "Azure Provider": المصادقة باستخدام "Azure CLI".

    az login
    
  3. قم بإنشاء خطة التنفيذ مع أمر خطة "terraform" وتحديد المعلمة.

    terraform plan -out assignment.tfplan
    

    Screenshot of running the terraform plan command and out parameter to show the Azure resource that would be created.

    ملاحظة

    للحصول على معلومات حول خطط التنفيذ الدائمة والأمان، يُرجى الرجوع إلى خطة "Terraform": تحذير الأمان.

تطبيق خطة التنفيذ الخاصة بــ "Terraform"

في النهاية، قم بتطبيق خطة التنفيذ.

قم بتشغيل أمر تطبيق "terraform" وحدد assignment.tfplan ما تم إنشاؤه بالفعل.

terraform apply assignment.tfplan

Screenshot of running the terraform apply command and the resulting resource creation.

مع "استكمال التطبيق! الموارد: تمت إضافة 1، تغير 0، تم إتلاف 0." الرسالة، تم إنشاء تعيين النهج الآن. منذ أن حددنا ملف outputs.tf، تم أيضاً إرجاع assignment_id.

تحديد الموارد غير المتوافقة

لعرض الموارد غير المتوافقة مع هذا التعيين الجديد، استخدم assignment_id الذي تم إرجاعه بواسطة terraform apply. بعد ذلك، قم بتشغيل الأمر التالي للحصول على معرّفات الموارد للموارد غير المتوافقة التي يتم إخراجها في ملف "JSON":

armclient post "/subscriptions/<subscriptionID>/providers/Microsoft.PolicyInsights/policyStates/latest/queryResults?api-version=2019-10-01&$filter=IsCompliant eq false and PolicyAssignmentId eq '<policyAssignmentID>'&$apply=groupby((ResourceId))" > <json file to direct the output with the resource IDs into>

تُشبه نتائجك المثال التالي:

{
    "@odata.context": "https://management.azure.com/subscriptions/<subscriptionId>/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest",
    "@odata.count": 3,
    "value": [{
            "@odata.id": null,
            "@odata.context": "https://management.azure.com/subscriptions/<subscriptionId>/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
            "ResourceId": "/subscriptions/<subscriptionId>/resourcegroups/<rgname>/providers/microsoft.compute/virtualmachines/<virtualmachineId>"
        },
        {
            "@odata.id": null,
            "@odata.context": "https://management.azure.com/subscriptions/<subscriptionId>/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
            "ResourceId": "/subscriptions/<subscriptionId>/resourcegroups/<rgname>/providers/microsoft.compute/virtualmachines/<virtualmachine2Id>"
        },
        {
            "@odata.id": null,
            "@odata.context": "https://management.azure.com/subscriptions/<subscriptionId>/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
            "ResourceId": "/subscriptions/<subscriptionName>/resourcegroups/<rgname>/providers/microsoft.compute/virtualmachines/<virtualmachine3ID>"
        }

    ]
}

تُعتبر النتائج مشابهة مع ما تراه عادةً مدرجاً ضمن الموارد غير المتوافقة في طريقة عرض مدخل "Azure".

تنظيف الموارد

لإزالة المهمة التي تم إنشاؤها، استخدم "Azure CLI" أو عكس خطة تنفيذ "Terraform" باستخدام terraform destroy.

  • Azure CLI

    az policy assignment delete --name 'audit-vm-manageddisks' --scope '/subscriptions/<subscriptionID>/<resourceGroupName>'
    
  • Terraform

    terraform destroy
    

الخطوات التالية

في هذا التشغيل السريع، قمت بتعيين تعريف نهج لتحديد الموارد غير المتوافقة في بيئة Azure.

لمعرفة المزيد حول تعيين نهج للتحقق من توافق الموارد الجديدة، تابع البرنامج التعليمي من أجل: