我在考虑使用ARM模板和Terraform来管理Azure的配置

序言

我們所屬的組織目前正在使用 Azure,為了推動 IaC,我們已開始進行技術驗證。我們將整理從 ARM templates 的教學、Terraform for Azure 的教學、HashiCorp on Azure 的網絡研討會,以及閱讀文件中獲得的資訊。

请注意,本文作者在撰写文章时的技能水平如下:Azure经验约2周,ARM模板经验约20小时,Terraform经验约40小时。同时,我也有少量在GCP中使用基础设施即代码(使用Google Cloud SDK和Terraform)进行配置管理的经验。

关于考虑该使用什么的问题,我持有的立场是什么。

我同意“用一种工具来解决所有问题并不是一个好主意”的观点来进行构成管理。因为我们应该采用适合特定问题的工具,而围绕目标系统的问题也在不断变化。

我认为目标是始终要使 “基础设施能够持续得到重复利用”。

因此,我们不会通过在每个比较区域中决定 ARM 模板和 Terraform 的优劣,而是会逐步描述它们的特点。

第一个参考:

请用汉语将以下内容表达得更简洁:

參攷1:

我们将Terraform与这些工具进行比较,但需要注意的是,Terraform并不排斥其他系统。

通过https://www.terraform.io/intro/vs/index.html的网站了解以下内容。

第二个参考:

由于自动化相关工具的流行和淘汰速度很快,我认为仅仅使用一个工具来完成所有事情不是一个很好的想法。

关于Terraform

特点

即使是多供应商,也能提供统一的工作流程。

Terraform能够提供统一的基础设施构建工作流程。无论是在Azure、GCP还是本地环境下,无论是构建虚拟机还是Kubernetes,都可以通过plan来确认基础设施的变更差异,然后通过apply来进行基础设施的构建。整个流程如下所示。

構成ファイル(.tf)を記述
↓
init (provider plugins の取得。)
↓
plan (新規作成した場合の構築内容を表示。)
↓
apply (インフラを新規構築。stateファイルの作成。)
↓
(インフラの変更が必要になる。)
↓
構成ファイル(.tf)を修正
↓
plan -out=newplan (インフラの変更内容の確認。変更プランとして書き出し。)
↓
apply "new_plan" (変更プランを適用。)
↓
(インフラが不要になる。)
↓
destroy (インフラの破棄。)

代码审查和持续集成的运用似乎很方便。

推荐在网络研讨会上的运营方式如下所示。

    • state ファイルを blob ストレージ (または Terraform Cloud)で管理する

 

    • 構成ファイルを記述したらコードレビューを入れる

 

    • CI で plan を実行させ、構成ファイルと plan コマンドで出力される変更の両方を確認する

 

    • apply は必ず CI に実行させる

 

    • 新規にインフラを作る場合は必ず Terraform を使って Azure Portal から作成をしない

 

    Azure の Provider できない値指定は ARM templates と併用するか Provider に Pull Request を投げる

在基础设施构建和修改方面进行代码审查后,从持续集成中执行的流程非常出色。

顺便一提,在网络研讨会上,我们得到的回答是无法将现有的Azure资源替换为HCL。但是,可以通过使用terraform import命令来创建状态文件。

已经为Terraform Cloud 提供了供使用的设施。

根据我阅读的这篇文章,虽然我自己没有尝试过,但看起来非常不错。

(Translation: Based on the article I have read, although I haven’t personally tried it, it seems very good.)

其他特点

    • 構成ファイル(.tf)が読みやすい

 

    • 構成ファイルはコメントが書ける

 

    VS Code にも JetBrain のIDEでもプラグインがある

令人关注的地方

有一些让我在意的地方。

提供商是否支持对Azure的更改。

在网络研讨会上,当我提出问题时,由于该项目是开源软件,所以在跟进Azure的变更方面会有些许延迟,他们希望我能为该项目做出贡献。该项目使用Go(包括Terraform主体和Provider),但很可惜,我可能会觉得难以理解。

我感觉源码的更新频繁。
https://github.com/terraform-providers/terraform-provider-azurerm/pulse/monthly

请查看 HashiCorp 的网站以了解他们与 Microsoft 的强大合作关系,这一合作已经持续多年。链接为 https://www.hashicorp.com/cloud-partners/microsoft?product=terraform。

Terraform 仅仅是一个包装器

我是否可以对Azure的各个基础设施的API版本等进行详细指定和属性调整,我感到有些不安(很抱歉没有仔细阅读内部代码就说这种话)。

试着动动手

请参考我留下的执行教程和备忘录,以了解情况。

    • チュートリアル

https://learn.hashicorp.com/tutorials/terraform/infrastructure-as-code?in=terraform/azure-get-started

环境设定

    • azsure cli を install する

 

    • install

brew install hashicorp/tap/terraform
Terraform v0.13.5
terraform -install-autocomplete
vscode の pligin を install

hashicorp.terraform

azure でリソースグループ terra_test を作成

location: japaneast だけを設定する

cat ~/ghq/github.com/github/gitignore/Terraform.gitignore >> .gitignore

后来将现有基础设施编码化

    • https://dev.classmethod.jp/articles/aws-with-terraform/

ex. recource group のマイニング

https://www.terraform.io/docs/providers/azurerm/r/resource_group.html
(terraform import azurerm_resource_group.rg /subscriptions//resourceGroups/terra_test)

tfstateが存在する場合に、状態を確認する流れ

$ terraform state list
azurerm_resource_group.rg

$ terraform state show azurerm_resource_group.rg
# azurerm_resource_group.rg:
resource "azurerm_resource_group" "rg" {
    id       = "/subscriptions/<subscription_id>/resourceGroups/terra_test"
    location = "japaneast"
    name     = "terra_test"
    tags     = {}

    timeouts {}
}

修改基础设施

将 main.tf 文件按如下进行修改。

resource "azurerm_resource_group" "rg" {
  name     = "terra_test"
  location = "japaneast"

  tags = {
        Environment = "Terraform Getting Started"
    }
}

执行 “terraform plan -out=newplan”。
更改部分更容易理解。

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  ~ update in-place

Terraform will perform the following actions:

  # azurerm_resource_group.rg will be updated in-place
  ~ resource "azurerm_resource_group" "rg" {
        id       = "/subscriptions/<subscription_id>/resourceGroups/terra_test"
        location = "japaneast"
        name     = "terra_test"
      ~ tags     = {
          + "Environment" = "Terraform Getting Started"
        }

        timeouts {}
    }

Plan: 0 to add, 1 to change, 0 to destroy.

terraform apply “newplan” を適用する。

Apply complete! Resources: 0 added, 1 changed, 0 destroyed. が表示される

terraform state show azurerm_resource_group.rg すると結果が変わっている

删除基础设施

    • terraform destroy

 

    実行するかどうかが表示される
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  - destroy

Terraform will perform the following actions:

  # azurerm_resource_group.rg will be destroyed
  - resource "azurerm_resource_group" "rg" {
      - id       = "/subscriptions/<subscription_id>/resourceGroups/terra_test" -> null
      - location = "japaneast" -> null
      - name     = "terra_test" -> null
      - tags     = {
          - "Environment" = "Terraform Getting Started"
        } -> null

      - timeouts {}
    }

Plan: 0 to add, 0 to change, 1 to destroy.

Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value:

有关于Terraform的相关链接

我会放置一些有用的链接和官方文件的链接。

    • Azure Doc 上の Terraform

https://docs.microsoft.com/ja-jp/azure/developer/terraform/

Terraform Doc の Azure Provider

https://www.terraform.io/docs/providers/azurerm/index.html

Terraform ソース

https://github.com/hashicorp/terraform

Azure Provider ソース

https://github.com/terraform-providers/terraform-provider-azurerm

とにかくここからはじめよう

https://learn.hashicorp.com/collections/terraform/azure-get-started

Terraform Cloudのレビュー記事

チュートリアル + アルファの手順

https://github.com/nnashiki/start-terraform-azure

关于 ARM 模板

ARM 模板的特点

可以立即使用 Azure 的新服务和功能。

公式网站中有关“选择ARM模板的原因”的说明。请参考以下链接:https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/templates/overview#why-choose-arm-templates

能够通过文件管理来管理参数

可以将模板和参数分开进行管理。

有一个名为”what-if”的功能,可以进行试运行(预览)。

即使没有状态文件,您仍然可以使用what-if命令进行干预运行。

可以将现有资源导出到定义文件中。

您可以通过门户将现有资源方便地导出为模板。

其他特点

    • モジュール化できる

 

    • 状態ファイルを管理しない

 

    • 相互に依存するリソースのデプロイが調整され、正しい順序で作成される

 

    • Azure Key Vault と連携してセキュアな管理ができる

 

    • 日本語ドキュメントが充実している

 

    • VScode の Azure Resource Manager (ARM) Tools のスニペットが強力

 

    • 定義ファイルはJSON

パラメーターを説明は metadata に記載する

"parameters": {
     "storageAccountType": {
         "type": "string",
         "metadata": {
             "description": "The type of the new storage account created to store the VM disks."
         }
     }
}

尝试动手

我进行了教程 – 创建和部署第一个 ARM 模板,并进行了虚拟机的启动和虚拟机资源的修改。我觉得你可以感受到其中的氛围,所以我会记录下步骤和结果。

armt_4.png

用中文进行原生的改写:

这是我的感觉。

只是稍微触摸和调查一下,我认为两者都是DRY RUN的,可以进行代码审查,对于进行IaC来说是毫无问题的。不过,如果要规模扩大,用户体验可能会有所改变。

这是全部内容。

广告
将在 10 秒后关闭
bannerAds