📅  最后修改于: 2023-12-03 14:52:02.274000             🧑  作者: Mango
在使用 Terraform 管理 Azure 资源时,有时需要将自定义数据传递给 VM 实例,以便实例中的应用程序可以使用这些数据。在此文章中,我们将介绍如何使用 Terraform 将自定义数据传递给 Azure VM。
在开始之前,您需要完成以下工作:
我们可以使用 cloud-init 在 VM 启动时传递自定义数据。使用 cloud-init 有一个好处,那就是可以使用 cloud-init 官网提供的一些内置模块快速完成一些配置。例如:
apt
, yum
, snap
等命令安装操作系统的软件包。接下来,我们将使用 cloud-config
的格式来创建一个 cloud-init 文件,文件名称一般为 cloud-init.txt
,文件内容格式如 below:
#cloud-config
write_files:
- path: /tmp/hello.txt
content: |
Hello, World!
This is custom data.
上述文件内容表示使用 cloud-init 在 VM 中创建一个 /tmp/hello.txt
文件,文件内容为 "Hello, World! This is custom data."。
将自定义数据传递给 Azure VM 的流程大致如下:
cloud-init.txt
文件,文件内容使用 cloud-config
的格式。cloud-init.txt
文件上传至 Azure 存储账户中。cloud-init.txt
文件。azurerm_linux_virtual_machine
资源上配置 custom_data
属性值为步骤 3 中的文件路径。下面是一个完整的 Terraform 配置示例。此处假设您已经完成了上述步骤:
provider "azurerm" {
features {}
}
data "azurerm_resource_group" "test" {
name = "myResourceGroup"
}
data "azurerm_subnet" "test" {
name = "mySubnet"
virtual_network_name = "myVnet"
resource_group_name = data.azurerm_resource_group.test.name
}
resource "azurerm_public_ip" "test" {
name = "myPublicIP"
location = data.azurerm_resource_group.test.location
resource_group_name = data.azurerm_resource_group.test.name
allocation_method = "Static"
}
resource "azurerm_network_interface" "test" {
name = "myNIC"
location = data.azurerm_resource_group.test.location
resource_group_name = data.azurerm_resource_group.test.name
ip_configuration {
name = "testconfiguration1"
subnet_id = data.azurerm_subnet.test.id
private_ip_address_allocation = "Dynamic"
public_ip_address_id = azurerm_public_ip.test.id
}
}
resource "azurerm_linux_virtual_machine" "test" {
name = "myVM"
location = data.azurerm_resource_group.test.location
resource_group_name = data.azurerm_resource_group.test.name
network_interface_ids = [azurerm_network_interface.test.id]
size = "Standard_A0"
admin_username = "testadmin"
admin_password = "Password1234!"
custom_data = "base64encode(filebase64('cloud-init.txt'))"
os_disk {
name = "myOsDisk"
caching = "ReadWrite"
storage_account_type = "Standard_LRS"
}
source_image_reference {
publisher = "Canonical"
offer = "UbuntuServer"
sku = "20.04-LTS"
version = "latest"
}
computer_name = "myvm"
disable_password_authentication = true
os_profile {
admin_username = "testadmin"
custom_data = "base64encode(filebase64('cloud-init.txt'))"
linux_configuration {
disable_password_authentication = true
}
}
boot_diagnostics {
enabled = true
storage_uri = "https://mystore.blob.core.windows.net/"
}
}
在上面的 Terraform 示例中,我们假设您创建的 Azure VM 配置文件中包含了一些代码段。这些代码段中使用到了自定义数据,我们将这个自定义数据保存到 cloud-init.txt
文件中,并Upload到Azure存储账户中,然后再通过引用上述配置文件 //admin_password = testadmin
的方式将其传递给 VM 实例。
包含自定义数据的 Azure VM 启动后,您可以在 VM 实例中找到 /tmp/hello.txt
文件。
以上是如何使用 Terraform 将自定义数据传递给 Azure VM 的方法。使用 cloud-init 传递自定义数据的好处是可以使用众多内置模块来完成一些常见的配置,例如安装包、运行脚本和编写文件。我们也可以在 azurerm_linux_virtual_machine
资源上配置 custom_data
属性值为一个文件路径来实现自定义数据的传递。