Azure Resource Management (ARM) Template

Trong bài viết này, chúng ta sẽ tìm hiểu về Azure Resource Management template, định nghĩa và cách chúng tối ưu hóa và tự động hóa việc triển khai tài nguyên Azure.

I. Azure Resource Management (ARM) Template là gì?

Azure Resource Management template (ARM) là một tập tin định nghĩa chính xác resource cần thiết cho việc triển khai hạ tầng trên nền tảng đám mây Microsoft Azure.

Ví dụ: Bạn cần tạo 10 máy ảo giống hệt nhau. Thay vì phải vào portal và tạo từng máy ảo một cách thủ công, bạn có thể dùng template để định nghĩa cấu hình của 1 máy ảo. Sau đó triển khai template này 10 lần. Resource Manager sẽ tự động tạo 10 máy ảo với cấu hình giống nhau cho bạn.

II. Lợi ích của ARM Template

Consistency (tính nhất quán): Cung cấp một định dạng chung để triển khai.

Help express complex deployments (giúp triển khai phức tạp): Cho phép triển khai nhiều resource theo đúng thứ tự. Ví dụ: việc tạo máy ảo chỉ hoạt động sau khi đĩa hệ điều hành và giao diện mạng được thiết lập. Template tự động xử lý các phụ thuộc này.

Reduce manual, error-prone tasks (giảm thiểu tác vụ thủ công và lỗi): Việc tạo và kết nối tài nguyên thủ công tốn thời gian và dễ xảy ra sai sót. Template đảm bảo mọi thứ được thực hiện một cách nhất quán và chính xác mỗi lần.

Template are code: Cho phép bạn chia sẻ, kiểm tra và theo dõi thay đổi theo thời gian (tương tự như phần mềm). Điều này tạo ra bản ghi về cách triển khai của bạn phát triển như thế nào. Hầu hết mọi người lưu trữ template trong các hệ thống kiểm soát phiên bản như GIT, giúp việc xem các phiên bản trước dễ dàng hơn.

Promote reuse: Thay vì mã hóa cứng các giá trị. Template có thể được điều chỉnh bằng cách sử dụng các tham số. Điều này cho phép tái sử dụng.

Templates are linkable (Có thể được liên kết): Bạn có thể liên kết các template nhỏ hơn với nhau để xây dựng hệ thống lớn hơn.

Nói tóm lại, template giúp việc triển khai trở nên nhất quán, đáng tin cậy và dễ quản lý hơn.

III. Template Schema

ARM Template sử dụng lưu trữ dữ liệu dưới dạng JSON. JSON là kiểu định dạng dữ liệu tuân theo một quy luật nhất định: sử dụng các cặp giá trị key – value mà tất cả các ngôn ngữ lập trình đều có thể hiểu được.

Ví dụ:

{
 "$schema": "http://schema.management.azure.com/schemas/2019-04- 01/deploymentTemplate.json#",
 "contentVersion": "",
 "parameters": {},
 "variables": {},
 "functions": [],
 "resources": [],
 "outputs": {}
}

IV. Template Parameters

Đây là nơi bạn định nghĩa các giá trị bạn có thể cung cấp trong quá trình triển khai để tùy chỉnh cơ sở hạ tầng của mình. Các giá trị này hoạt động như các biến điều chỉnh hành vi của mẫu theo nhu cầu cụ thể của bạn.

{
    "parameters": {
        "<parameter-name>": {
            "type": "<type-of-parameter-value>",
            "defaultValue": "<default-value-of-parameter>",
            "allowedValues": [
                "<array-of-allowed-values>"
            ],
            "minValue": "<minimum-value-for-int>",
            "maxValue": "<maximum-value-for-int>",
            "minLength": "<minimum-length-for-string-or-array>",
            "maxLength": "<maximum-length-for-string-or-array-parameters>",
            "metadata": {
                "description": "<description-of-the parameter>"
            }
        }
    }
}


Example:

{
  "parameters": {
    "adminUsername": {
      "type": "string",
      "metadata": {
        "description": "Username for the Virtual Machine."
      }
    },
    "adminPassword": {
      "type": "securestring",
      "metadata": {
        "description": "Password for the Virtual Machine."
      }
    }
  }
}

V. Template Variables

Sử dụng các variables (biến) trong template, giúp bạn dễ dàng thay đổi và cập nhật nội dung của template.

{
    "variables": {
        "nicName": "myVMNic",
        "addressPrefix": "10.0.0.0/16",
        "subnetName": "Subnet",
        "subnetPrefix": "10.0.0.0/24",
        "publicIPAddressName": "myPublicIP",
        "virtualNetworkName": "MyVNET"
    }
}

VI. Template Functions

Nơi tạo ra các hàm giúp tái sử dụng code.

Một số hạn chế:

  • Hàm không thể truy cập các biến;
  • Hàm chỉ có thể sử dụng các tham số (parameters) được định nghĩa trong hàm;
  • Hàm không thể gọi các hàm do người dùng khác định nghĩa;
  • Hàm không thể sử dụng chức năng tham chiếu;
  • Các tham số không có giá trị mặc định.
{
    "functions": [
        {
            "namespace": "contoso",
            "members": {
                "uniqueName": {
                    "parameters": [
                        {
                            "name": "namePrefix",
                            "type": "string"
                        }
                    ],
                    "output": {
                        "type": "string",
                        "value": "[concat(toLower(parameters('namePrefix')), uniqueString(resourceGroup().id))]"
                    }
                }
            }
        }
    ]
}

VII. Template Resource

Nơi định nghĩa các resource cho triển khai của bạn.

Dưới đây là ví dụ tạo tài nguyên địa chỉ IP công cộng:

{
    "type": "Microsoft.Network/publicIPAddresses",
    "name": "[variables('publicIPAddressName')]",
    "location": "[parameters('location')]",
    "apiVersion": "2018-08-01",
    "properties": {
        "publicIPAllocationMethod": "Dynamic",
        "dnsSettings": {
            "domainNameLabel": "[parameters('dnsLabelPrefix')]"
        }
    }
}

VIII. Template Outputs

Template Outputs (Đầu ra của Template) là phần bạn định nghĩa những thông tin bạn muốn nhận được sau khi chạy template.

  • Thông thường, bạn sẽ không biết trước một số thông tin nhất định cho đến khi template được triển khai (deployment). Ví dụ, bạn có thể muốn lấy địa chỉ IP của máy ảo (VM) hoặc tên miền đủ điều kiện (FQDN) sau khi VM được tạo.
  • Outputs giúp bạn truy cập những thông tin này sau khi chạy template.
{
    "outputs": {
        "<output-name>": {
            "condition": "<boolean-value-whether-to-output-value>",
            "type": "<type-of-output-value>",
            "value": "<output-value-expression>",
            "copy": {
                "count": "<number-of-iterations>",
                "input": "<values-for-the-variable>"
            }
        }
    }
}

Dưới đây là một ví dụ minh họa một đầu ra có tên hostname. Giá trị FQDN được đọc từ cài đặt địa chỉ IP công cộng của máy ảo:

"outputs": {
    "hostname": {
        "type": "string",
        "value": "[reference(variables('publicIPAddressName')).dnsSettings.fqdn]"
    }
}

Với sự hiểu biết sâu rộng về Azure Resource Management (ARM) Template, bạn có thể tận dụng được mọi lợi ích của việc quản lý tài nguyên trên nền tảng Azure một cách linh hoạt và hiệu quả. Cảm ơn bạn đã tham khảo trên ttnguyen.net.

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em