尝试使用Terraform创建常用于验证的Oracle Cloud Infrastructure(OCI)环境

在下面的文章中,我将尝试使用Terraform创建OCI环境。

总结了经常用于验证的Oracle Cloud Infrastructure(OCI)的环境配置(VCN,Seculity List,各种Gateway,路由表,子网,计算)。

1. 构成图(再次附上)

a_Networking.jpg

2. Terraform 的前期准备工作

我会在下面的文章中完成 Terraform 的安装和操作确认。

在Windows终端(PC)上安装Terraform,为在OCI(Oracle Cloud Infrastructure)上运行做准备
https://qiita.com/ora_gonsuke777/items/fb2abfbb7d76de2afc93

创建两组用于计算实例的密钥对(*.pub + *.pem或*.ppk)。

请为计算实例创建两套SSH密钥对(*.pub + *.pem或*.ppk),一套用于公共计算,一套用于私有计算。可以使用puttygen或ssh-keygen中的任意一种工具。

Linux实例中的密钥对管理
https://docs.oracle.com/cd/E97706_01/Content/Compute/Tasks/managingkeypairs.htm

4. 下载Terraform的定义文件(*.tf)样例。

我已经上传了一个Terraform定义文件(*.tf)的示例。这是一个用于创建网络、计算和对象存储的示例。请在任意目录中克隆git或下载它。

https://github.com/gonsuke777/terraform/tree/master/oci_test_env1 可以在此链接里找到第一个OCI测试环境的Terraform代码。

git clone https://github.com/gonsuke777/terraform

5. 编辑变量定义文件(vars.tf)。

请将变量汇总到vars.tf文件中,并按照以下进行编辑。

変数名説明os_image_source_idOSイメージIDを記述します。このIDはリージョンごとに異なります。https://docs.cloud.oracle.com/iaas/images/ をご覧ください。public_compute_ssh_key
private_compute_ssh_keyPublic Compute と Private Compute の SSH鍵(*.pub, 公開鍵) のパスを記述して下さい。public_compute_ad_num
private_compute_ad_numPublic Compute と Private Compute を 作成する AD(Availability Domain) の番号を記述して下さい。1AD のリージョンの場合は 1 のみ記述可能です。oci_resource_prefixリソースのプレフィックス名を 4文字以内 で記述して下さい。

请参考下面的文章,关于除上述之外的变量。

在Windows电脑上安装Terraform,为了在Oracle Cloud Infrastructure(OCI)上运行做准备。

6. 执行 terraform(初始化、规划、应用)

执行Terraform。执行以下命令。

cd tfファイルを格納したディレクトリ>
terraform init
terraform plan
terraform apply
(確認が求められるので) yes

日志如下,进展顺利咧彡 ゚( ̄^ ̄゜)(^o^)

> terraform init

Initializing the backend...
:
Terraform has been successfully initialized!
:

> terraform plan
Refreshing Terraform state in-memory prior to plan...
:
Plan: 13 to add, 0 to change, 0 to destroy.
:

> terraform apply
data.oci_identity_availability_domains.ads: Refreshing state...
:
Apply complete! Resources: 13 added, 0 changed, 0 destroyed.
:

7. 确认OCI资源并连接。

03_ObjectStorage.jpg

哟,你出来了!还确认了Compute的SSH连接呢。

04_ssh_connection.jpg

计算机连接成功了哦! 彡(^)(^)

Sorry, Can you provide me with more context or clarify what you mean by “8. 後始末(terraform destroy)”?

在进行 terraform destroy 操作时,可以删除通过 terraform 创建的资源。

cd tfファイルを格納したディレクトリ>
terraform destroy
(確認が求められるので) yes

日志如下所示。

> terraform destroy
data.oci_objectstorage_namespace.export_ns: Refreshing state...
:
oci_core_vcn.export_VCN1: Destruction complete after 1s

Destroy complete! Resources: 13 destroyed.
> 

看起来成功地删除了。

9. 做工夫,或者说遇到了困扰的地方

如果要创建适用于多个区域的通用 Terraform 定义,需要动态解析 AD 名(可用性域)和 Service Gateway 的服务名。以下是相关内容。
彡(゚)(゚)

# availability_domain.tf
:
# Get a list of Availability Domains, this code from https://www.terraform.io/docs/providers/oci/guides/best_practices.html
data "oci_identity_availability_domains" "ads" {
  compartment_id = "${var.tenancy_ocid}"
}
:
# compute.tf
:
resource oci_core_instance export_BASTION1 {
  compartment_id      = "${var.compartment_ocid}"
  display_name        = "${upper(var.oci_resourcel_prefix)}-BASTION1"
  # This code from https://www.terraform.io/docs/providers/oci/guides/best_practices.html
  # It to get a single AD name based on the index:
  availability_domain = "${lookup(data.oci_identity_availability_domains.ads.availability_domains[var.public_compute_ad_num - 1], "name")}"
:
# networking.tf
:
data "oci_core_services" "sgw_services" {
  filter {
    name   = "name"
    values = ["All .* Services In Oracle Services Network"]
    regex  = true
  }
}
:
  # Get the service id dynamically. this code from github examples.
  services {
    service_id = "${lookup(data.oci_core_services.sgw_services.services[0], "id")}"
  }
:

参考这些示例后成功地写了代码,但是我不太理解为什么这种写法会起作用……彡(-)(-)

OCI- Terraform 提供方的最佳实践
https://www.terraform.io/docs/providers/oci/guides/best_practices.html

terraform-provider-oci/examples/networking/service_gateway/service_gateway.tf
https://github.com/terraform-providers/terraform-provider-oci/blob/master/examples/networking/service_gateway/service_gateway.tf

10. 将OCI资源的Terraform定义导出功能(terraform-provider-oci)。

使用 terraform-provider-oci 功能,可以导出 OCI 资源的 Terraform 定义。以下文章可供参考。从零开始创建 tf 文件很困难,所以我认为可以参考导出的 tf 文件来编写。使用方法也很简单。彡(^)(^)

terraform-provider-oci的导出功能非常方便。

11. 概述

Terraform 創建環境容易啊!彡(^)(^) 但是如果將 Terraform 視為編程語言,它缺乏類似 main 的功能,而且在動態解決 AD 名稱和 SGW 服務名等方面的黑盒子感覺相當強大…… 需要修行啊!彡(゚)(゚)

广告
将在 10 秒后关闭
bannerAds