尝试使用Terraform创建常用于验证的Oracle Cloud Infrastructure(OCI)环境
在下面的文章中,我将尝试使用Terraform创建OCI环境。
总结了经常用于验证的Oracle Cloud Infrastructure(OCI)的环境配置(VCN,Seculity List,各种Gateway,路由表,子网,计算)。
1. 构成图(再次附上)
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文件中,并按照以下进行编辑。
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资源并连接。
哟,你出来了!还确认了Compute的SSH连接呢。
计算机连接成功了哦! 彡(^)(^)
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.htmlterraform-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 服務名等方面的黑盒子感覺相當強大…… 需要修行啊!彡(゚)(゚)