📌  相关文章
📜  如何使用 terraform 将自定义数据传递给 azure vm (1)

📅  最后修改于: 2023-12-03 14:52:02.274000             🧑  作者: Mango

如何使用 Terraform 将自定义数据传递给 Azure VM

在使用 Terraform 管理 Azure 资源时,有时需要将自定义数据传递给 VM 实例,以便实例中的应用程序可以使用这些数据。在此文章中,我们将介绍如何使用 Terraform 将自定义数据传递给 Azure VM。

1. 准备工作

在开始之前,您需要完成以下工作:

2. 通过 cloud-init 将自定义数据传递给 VM

我们可以使用 cloud-init 在 VM 启动时传递自定义数据。使用 cloud-init 有一个好处,那就是可以使用 cloud-init 官网提供的一些内置模块快速完成一些配置。例如:

  • 安装包:可以使用 apt, yum, snap 等命令安装操作系统的软件包。
  • 运行脚本:可以运行 Shell、Python 或任何其他解释器支持的脚本。
  • 写入文件:可以通过 cloud-init 在 VM 用户数据目录下创建、修改和删除文件。

接下来,我们将使用 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 的流程大致如下:

  1. 创建一个 cloud-init.txt 文件,文件内容使用 cloud-config 的格式。
  2. cloud-init.txt 文件上传至 Azure 存储账户中。
  3. 通过 Terraform 配置引用上一步中上传的 cloud-init.txt 文件。
  4. 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 属性值为一个文件路径来实现自定义数据的传递。