注:

使用 Terraform 和 cloud-init 脚本将保留的 IP 连接到 Oracle Cloud Infrastructure Compute 实例

简介

在基础设施即代码 (IaC) 的世界中,自动预配和配置计算实例对于高效、可扩展的云部署至关重要。在将保留的 IP 地址连接到 Oracle Cloud Infrastructure (OCI) 计算实例时,Terraform 和云初始化提供了强大的组合。

在 OCI 计算 Terraform 模块中,无法选择在创建实例时将预留 IP 附加到计算实例。我们只能在创建实例后附加预留 IP。在此博客文章中,我们将探讨如何利用 Terraform 和 cloud-init 脚本将预留 IP 无缝连接到 OCI 计算实例。

目标

使用 Terraform 和 cloud-init 脚本将预留 IP 无缝连接到 OCI 计算实例。

什么是保留 IP?

预留 IP 地址是分配给虚拟网络中的计算实例的静态 IP。它可确保需要固定 IP 的应用程序的一致连接并简化网络管理。保留的 IP 通常用于负载平衡、防火墙规则和安全网络通信等情形。

先决条件

首先,您需要访问 OCI 环境。如果没有 Always Free 实例,您可以轻松创建“Always Free(始终免费)”实例,该实例具有大量免费容量和 300 美元的试用储值。

在您有环境时,请确保您的用户已分配到有权管理实例(系列资源和存储)的组。有了安全最佳实践,您可以创建一个用户,而不是使用已分配有权限的控制台用户。如果需要帮助,请查看文档以创建组并向用户授予适当的权限。

  1. OCI 账户
  2. Terraform 访问。有关更多信息,请参见此链接
  3. 将在其中启动实例的公共子网。这必须连接到 Internet 网关。
  4. 专用子网,在其中创建辅助 VNIC 并分配保留的 IP。这必须附加到服务网关。
  5. 组中的资源需要管理网络系列的权限的动态组。
  6. 必须为实例主用户验证配置策略。

任务 1:设置 Terraform 脚本

在这里,我们将向 OCI Terraform 创建计算实例模块添加一个作为元数据的云初始化脚本。此外,我们还将保留的 IP OCID 和专用子网 OCID 作为自由格式标记传递给计算 VM。

resource "oci_core_public_ip" "pubip" {
  # In case of Multiple Instances has to be created, Provide the count in the vars file.
  # This block creates a Reserved Public IP from Oracle IP Pool
  count = var.instance_count
  compartment_id = var.compartment_id
  display_name   = var.res_ip_display_name
  lifetime       = "RESERVED"
  private_ip_id  = ""
}

resource "oci_core_instance" "pubiptest" {
  count = var.instance_count
  compartment_id      = var.compartment_id
  availability_domain = data.oci_identity_availability_domains.ads.availability_domains[0].name
  display_name        = var.display_name
  shape               = var.shape

  # We will pass Reserved Public IP OCID and Private Subnet OCID as a freeform tags to the instance
  freeform_tags = {
    "publicIP" = resource.oci_core_public_ip.pubip[count.index].id
    "SubnetId" = var.private_subnet_id
    }

  create_vnic_details {
    display_name     = var.vnic_display_name
    assign_public_ip = true
    subnet_id        = var.public_subnet_id
  }

  source_details {
    source_type = var.source_type
    source_id   = var.source_id
  }

  metadata = {
    ssh_authorized_keys = var.pub_key
    user_data = "${base64encode(file("./cloud-init.sh"))}"
  }
}

上面的脚本将创建预留 IP(考虑计数变量值),并将启动包含临时 IP 的计算实例,该 IP 将连接到主 VNIC。

在计算元数据中,我们将通过 cloud-init 脚本,该脚本将通过替换现有的临时 IP 来分配保留的 IP。

任务 2:了解 cloud-init 脚本

任务 2.1:安装 OCI CLI 和其他必需的工具

使用以下命令安装 OCI CLI 和 jq(解析 JSON)。

`sudo yum install -y python36-oci-cli jq`

任务 2.2:检索实例元数据

任务 2.3:附加辅助 VNIC

将辅助 VNIC 连接到计算 VM,该 VM 将通过运行以下命令使用专用子网。

oci compute instance attach-vnic --instance-id $instanceid --subnet-id $subnetid --auth instance_principal --wait

任务 2.4:配置路由

任务 2.5:将辅助 VNIC 路由设为默认路由

任务 2.6:删除临时公共 IP

任务 2.7:连接保留的 IP

我们具有来自自由格式标记的公共 IP OCID,因此我们已删除了级别 IP,因此可以将保留的 IP 连接到主要 VNIC。以下命令将保留的 IP 连接到实例的主 VNIC。

assign=$(oci network public-ip update --force --auth instance_principal --public-ip-id $publicIp --private-ip-id $privateIpId --wait-for-state ASSIGNED)

任务 2.8:分离辅助 VNIC

后续步骤

这是一个实施示例,请在将它用作云初始脚本之前进行相应的更改。这已在 Oracle Linux 8 上进行了测试。

如果选择任何其他 Linux 风格,oci-cli 安装过程将更改。有关更多信息,请参见 Installing the CLI

确认

作者 - Rithesh Subramanian(OCI 云架构师)

更多学习资源

探索 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 频道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心