用 Terraform 在さくらのクラウド上创建和管理 Container Linux 的 ISO镜像
总结
以下是介绍使用HashiCorp Terraform上传和管理ISO镜像的方法, 以 CoreOS 提供的 Container Linux 为例,并利用 Sakura Cloud 的 “ISO映像”功能。请注意,这种方法与创建 Sakura Cloud 的 “公共ISO映像”的步骤部分相同。我们希望这对大家有所帮助,因此将其公开和共享。
(另外,这篇帖子是2018年樱花网网络日历的第17天的帖子。)
「ISO镜像」功能
在Sakura Cloud中,有一个处理光学盘“光盘镜像”(如DVD-ROM和CD-ROM)的ISO镜像功能。您可以通过FTP上传各种在互联网上分发的Linux发行版和操作系统的ISO镜像(扩展名为.iso等),然后将其安装在虚拟服务器上启动或加载。
使用ISO映像功能,您可以在Sakura Cloud上安装非提供的操作系统。或者,即使Sakura Cloud提供了所需的操作系统或发行版,如果它与您想使用的版本不同(太新或已停止支持并结束发布的情况),或者您想从头自定义初始设置,那么ISO映像功能将会非常有用。(类似的功能还有”公共存档”,但它是虚拟磁盘映像的模板。使用它启动虚拟机后,可以自动设置IP地址和主机名等,并进行使用。)
ISO映像有两种类型。
-
- パブリック ISO イメージ … さくらインターネットが提供している ISO イメージ(イメージ一覧はこちら)。
- ISO イメージ … 自分でアップロードして自由に管理できる ISO イメージ。
在这里讨论的是后者的”ISO镜像”。
在团队协作管理中出现的三个挑战。
在团队管理和操作ISO镜像时,存在三个挑战。
-
- ファイル名がない ISO イメージを正確に管理するには
-
- ミス無く効率的な作業をするには
- 共同作業(特定の誰かに管理業務を任せない)をするには
以下将介绍如何使用Terraform来解决这些问题。
ISO镜像的管理
首先,作为Linux发行版本分发的ISO镜像,在每次版本升级时,”ISO镜像的文件名”通常会发生变化。例如,对于CentOS来说,文件名”CentOS-7-x86_64-Minimal-1810.iso”表明这是一个”x86_64″架构的”CentOS 7.6(1810)”版本。
然而,CoreOS Container Linux的文件名始终为”coreos_production_iso_image.iso”。即使本地存在文件,也无法从文件名判断其是哪个版本。RancherOS也是如此,在持续进行版本升级的分发版本中,ISO镜像的名称不会改变。
這樣做的結果是,如果上傳 ISO 映像,有可能誤上傳了不同版本。最可靠的方法是自行更改名稱為「coreos_1911.iso」。或者,最理想的是使用映像的哈希值進行確認,而不僅僅是靠 ISO 映像本身,但如果不這樣做,則無法知道版本是否正確直到引導成功。
在这里,Terraform是非常有用的。Terraform可以将与ISO镜像相关的镜像名称和标签等内容以HCL格式(HashiCorp Configuration Language)的文件进行管理。当使用curl或wget从远程获取ISO镜像时,只需使用Terraform立即上传ISO镜像,并自动分配版本名称和标签。完成工作后,只需删除ISO即可。
此外,HashiCorp Packer 也提供了类似的功能,但 Packer 最终的成果物是一个”存档”。在创建存档的过程中,可以指定 URL 自动下载和哈希确认 ISO 文件,这是一个非常方便的功能可以节省时间。然而,ISO 文件名是固定的,并且不支持对 ISO 进行标记。因此,在专注于 ISO 映像的工作中我们选择了 Terraform。
高效率的工作,没有任何错误。
通常情况下,要上传 ISO 镜像,需要使用 FTP 客户端。但是这样做可能很麻烦。你需要在控制面板上创建一个“ISO”资源,然后确认 FTP 的用户名和密码,接着使用客户端进行传输,完成FTP后还需要进行设置命名等操作。虽然这些都是简单的任务,但如果要管理多个ISO镜像,有时候会感到非常沮丧。此外,长时间进行简单的重复任务可能会导致注意力不集中,从而增加错误发生的风险。
如果使用Terraform,您只需要执行”terraform init”和”terraform apply”这两个步骤即可完成前面提到的上传过程。在Terraform中,您可以事先使用HCL格式定义云上的资源。以下是用于Container Linux实际使用的.tf文件。基本上,您只需涉及”ver”部分。
locals {
name = "CoreOS Container Linux"
ver = "1911.4.0"
iso = "coreos_production_iso_image.iso"
distro = "container-linux"
}
resource sakuracloud_cdrom "cdrom" {
name = "${local.name} ${local.ver} (latest)"
tags = ["arch-64bit","distro-${local.distro}","distro-ver-${local.ver}","os-linux","current-stable"]
size = "5"
iso_image_file = "../${local.iso}"
hash = "${md5(file("../${local.iso}"))}"
description = "${local.iso}"
}
只需要一个选项:
只需要执行命令,就会自动上传当前目录中的ISO文件,并可使用。即使版本更改,只需要重写.tf文件并在下载ISO后重新执行”terraform plan”和”terraform apply”即可。您甚至可以在凌晨或熬夜后的一些奇怪情绪时,安全地进行操作。此外,如果经过一些改进,可能还可以将ISO版本升级作为触发器,自动化下载和反映ISO文件(但我们尚未开始处理这一部分)。
协作和版本管理
在团队合作中,当某项工作只有特定的人能够完成时,就会导致这项工作被遮掩或者加重工作负担,同时也会造成无法并行分工等问题。尤其是基于流程手册的工作,随着工序数量的增加,人们的注意力会被削弱,而且疏忽失误也容易发生。
只需准备好”用于Sakura Cloud的Terraform”的运行环境,任何人都能比其他人更快更准确地进行操作。此外,如果在GitHub上管理.tf文件,还可以记录谁在何时以及为何进行了更改。将GitHub上的文件始终保持为“正确”,可以阻止错误的配置信息传播,并且即使出现错误或问题,也可以从提交历史中轻松查找到其经过。
要使用吗?
以下是必需的物品清单:
-
- Terraform 本体
-
- Terraform for さくらのクラウド プラグイン
さくらのクラウド API (Terraform がクラウドにアクセスするために必要です)
準備好后,将刚刚的 .tf 文件放置在任意目录下。在文件中使用 locals 定义变量,并创建 sakuracloud_cdrom 资源。在资源的描述等地方,通过 ${local.<变量名>} 来引用变量的值。
然后,还要下载 ISO 镜像。最终
$ terraform init (環境の初期化)
$ terrafprm plan (変更内容の事前確認)
$ terraform apply (実際の設定投入)
(実行後の確認プロンプトで「YES」を入力)
执行。
我们详细来看。首先是初始化 terraform init。
$ terraform init
Initializing provider plugins...
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.
如果插件被识别,将以绿色显示此类消息。如果遇到错误,请确认插件的安装是否成功完成。
然后是 terraform 计划。
$ terraform 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.
------------------------------------------------------------------------
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
+ sakuracloud_cdrom.cdrom
id: <computed>
content_file_name: "config"
description: "coreos_production_iso_image.iso"
hash: "5e1fb24644552e06a2532fc0da693f34"
iso_image_file: "../ISO/coreos_production_iso_image.iso"
name: "CoreOS Container Linux 1911.4.0 (latest)"
size: "5"
tags.#: "5"
tags.0: "arch-64bit"
tags.1: "distro-container-linux"
tags.2: "distro-ver-1911.4.0"
tags.3: "os-linux"
tags.4: "current-stable"
zone: <computed>
Plan: 1 to add, 0 to change, 0 to destroy.
------------------------------------------------------------------------
Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.
上传新的ISO镜像(Terraform的sakuracloud_cdrom资源)。在此阶段,上传还未完成,仅确认配置内容。”1 to add” 表示添加一个资源。
最后通过terraform apply进行应用。
$ terraform apply
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
+ sakuracloud_cdrom.cdrom
id: <computed>
content_file_name: "config"
description: "coreos_production_iso_image.iso"
hash: "5e1fb24644552e06a2532fc0da693f34"
iso_image_file: "../ISO/coreos_production_iso_image.iso"
name: "CoreOS Container Linux 1911.4.0 (latest)"
size: "5"
tags.#: "5"
tags.0: "arch-64bit"
tags.1: "distro-container-linux"
tags.2: "distro-ver-1911.4.0"
tags.3: "os-linux"
tags.4: "current-stable"
zone: <computed>
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
sakuracloud_cdrom.cdrom: Creating...
content_file_name: "" => "config"
description: "" => "coreos_production_iso_image.iso"
hash: "" => "5e1fb24644552e06a2532fc0da693f34"
iso_image_file: "" => "../ISO/coreos_production_iso_image.iso"
name: "" => "CoreOS Container Linux 1911.4.0 (latest)"
size: "" => "5"
tags.#: "" => "5"
tags.0: "" => "arch-64bit"
tags.1: "" => "distro-container-linux"
tags.2: "" => "distro-ver-1911.4.0"
tags.3: "" => "os-linux"
tags.4: "" => "current-stable"
zone: "" => "<computed>"
sakuracloud_cdrom.cdrom: Still creating... (10s elapsed)
sakuracloud_cdrom.cdrom: Still creating... (20s elapsed)
sakuracloud_cdrom.cdrom: Still creating... (30s elapsed)
sakuracloud_cdrom.cdrom: Creation complete after 39s (ID: 113001677701)
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
然后您可以在ISO映像的列表画面上确认已上传的内容。请前往控制面板的存储→ISO映像进行查看。
在创建服务器时(解除简化模式),选择磁盘来源为”空白磁盘”,然后会出现”使用ISO镜像”的菜单,选择这个菜单。
通过利用Terraform for さくらのクラウド,可以轻松、可靠和高效地管理常常繁琐的ISO镜像。因为ISO镜像有多种资源可供选择,所以作为摆脱手工环境构建的线索,为什么不试试开始使用Terraform呢?