请使用Docker的terraform镜像来尝试Oracle Cloud Infrastructure (OCI)
首先
最近,HashiCorp开始支持Oracle Cloud Infrastructure Terraform Provider,因此我尝试了一下,发现现在默认情况下可以使用OCI。
请提供下列参考资料的中文翻译。
-
- terraform Docker Container
-
- コマンドライン(CLI)でOCIを操作する – Oracle Cloud Infrastructureアドバンスド
-
- TerraformでOCIの構築を自動化する – Oracle Cloud Infrastructureアドバンスド
- Terraform Provider for Oracle Cloud Infrastructure の導入
获取Terraform的Docker镜像
使用Hashicorp官方仓库提供的镜像。
由于SIZE为131MB,所以相对较轻。
$ docker pull hashicorp/terraform:light
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hashicorp/terraform light 29edcab3b90b 2 weeks ago 131MB
您可以按照下面的指示执行命令。
docker run -i -t hashicorp/terraform:light <command>
试试版本确认
$ docker run -i -t hashicorp/terraform:light --version
Terraform v0.11.11
预先准备以执行的相关事项(OCI)。
创建 API 密钥
mkdir -p ~/.oci
openssl genrsa -out ~/.oci/oci_tf_key.pem 2048
chmod go-rwx ~/.oci/oci_tf_key.pem
openssl rsa -pubout -in ~/.oci/oci_tf_key.pem -out ~/.oci/oci_tf_key_public.pem
cat ~/.oci/oci_tf_key_public.pem
## 出力① メモしておきます。
openssl rsa -pubout -outform DER -in ~/.oci/oci_tf_key.pem | openssl md5 -c
## 出力② メモしておきます
注册API密钥
在OCI中创建用户。
点击[菜单] > [身份] > [用户],进入用户界面。
点击[创建用户]。
创建用户。
进入创建的用户界面,选择[添加公钥]。
打开一个页面以输入公钥,然后将之前记下的”输出①”粘贴上去。
为了执行前期准备(Terraform)做好准备。
首先,准备一个执行Terraform以显示AD1的文件。
创建环境变量文件
您可以在Terraform中使用tenancy_ocid等配置值自动创建OCI – 参考Oracle Cloud Infrastructure高级指南来了解。您可以使用上述提到的“输出②”来获取。
tenancy_ocid = "<tenancy OCID>"
user_ocid = "<user OCID>"
fingerprint = ""<PEM key fingerprint>"
region = "<region in which to operate, example: us-ashburn-1, us-phoenix-1>"
compartment_ocid = "<compartment OCID>"
ssh_public_key = "id_rsa.pub" ★今回は利用しない
private_key_path = "oci_tf_key.pem" ★後述の手順で鍵をTerraform実行ディレクトリに直接配置するので上で作成したファイル名を記載
获取AD1的名称的Terraform文件。
variable "tenancy_ocid" {}
variable "user_ocid" {}
variable "fingerprint" {}
variable "private_key_path" {}
variable "compartment_ocid" {}
variable "ssh_public_key" {}
variable "region" {}
provider "oci" {
tenancy_ocid = "${var.tenancy_ocid}"
user_ocid = "${var.user_ocid}"
fingerprint = "${var.fingerprint}"
private_key_path = "${var.private_key_path}"
region = "${var.region}"
disable_auto_retries = "true"
}
data "oci_identity_availability_domains" "ADs" {
compartment_id = "${var.tenancy_ocid}"
}
output "ADprint" {
value = "${lookup(data.oci_identity_availability_domains.ADs.availability_domains[0],"name")}"
}
准备公开密钥
对于Docker中的Terraform,我们将使必要的文件(如公钥)可在容器中可见,以便执行Terraform操作。
本次将把在API密钥创建中生成的文件放置在与.tf文件相同的位置。
cp -p ~/.oci/oci_tf_key.pem <ファイルの配置先>
进行
初始化
$ cd <ファイルの配置先>
$ docker run -i -t -v $(pwd):/app/ -w /app/ hashicorp/terraform:light init
Initializing provider plugins...
- Checking for available provider plugins on https://releases.hashicorp.com...
- Downloading plugin for provider "oci" (3.11.0)...
The following providers do not have any version constraints in configuration,
so the latest version was installed.
To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.
* provider.oci: version = "~> 3.11"
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
因为是咒语,所以需要参数的注释
命令参考 运行
-
- -i コンテナの STDIN にアタッチ
-
- -t 疑似ターミナル (pseudo-TTY) を割り当て
-
- -v ホストディレクトリをコンテナにマウント、ここではカレントディレクトリをdocker内の/appにマウント
- -w コンテナ内の作業用ディレクトリを指定
确定
$ docker run -i -t -v $(pwd):/app/ -w /app/ hashicorp/terraform:light plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.
data.oci_identity_availability_domains.ADs: Refreshing state...
------------------------------------------------------------------------
No changes. Infrastructure is up-to-date.
This means that Terraform did not detect any differences between your
configuration and real physical resources that exist. As a result, no
actions need to be performed.
终于开始执行
$ docker run -i -t -v $(pwd):/app/ -w /app/ hashicorp/terraform:light apply
data.oci_identity_availability_domains.ADs: Refreshing state...
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
ADprint = gype:US-ASHBURN-AD-1
做到了!这次就到这里,下次计划做资源创建。
制作快捷命令的附加功能。
只需将以下内容添加到个人资料等位置,并读取,就无需每次都使用docker命令。
terraform() { docker run -i -t -v $(pwd):/app/ -w /app/ hashicorp/terraform:light "$@"; }
terraform --version
Terraform v0.11.11
备忘录
使用Docker容器与Terraform相结合时遇到的问题是,必须将主机的环境变量和文件传递给容器。即使创建并放置了环境变量文件如下所示,容器也无法继承环境变量,导致找不到变量的值,并显示错误消息。
同样,最初也指定了主机路径(位于/.ssh下)的private_key_path,但仔细考虑后,发现它也需要放置在容器可见的目录中。
由于本次应用程序将当前目录挂载,因此将文件暂时放置在当前目录,并在配置文件中指定了该位置进行执行。
- 以下を参考に設定ファイルを作成。
环境变量
- 以下を読み込んでdockerで実行しても環境変数は引き継がれていませんでした。
### Authentication details
export TF_VAR_tenancy_ocid="<tenancy OCID>"
export TF_VAR_user_ocid="<user OCID>"
export TF_VAR_fingerprint="<PEM key fingerprint>"
export TF_VAR_private_key_path="<path to the private key that matches the fingerprint above>"
### Region
export TF_VAR_region="<region in which to operate, example: us-ashburn-1, us-phoenix-1>"
### Compartment
export TF_VAR_compartment_ocid="<compartment OCID>"
### Public/private keys used on the instance
export TF_VAR_ssh_public_key=$(cat <path to public key>)
export TF_VAR_ssh_private_key=$(cat <path to private key>)
## NOTE: These are not your api keys. More info on the right keys see
## https://docs.us-phoenix-1.oraclecloud.com/Content/Compute/Tasks/managingkeypairs.htm