《Terraform 101 從入門到實踐》 第二章 Providers插件管理

《Terraform 101 從入門到實踐》這本小冊在南瓜慢說官方網(wǎng)站GitHub兩個地方同步更新,書中的示例代碼也是放在GitHub上,方便大家參考查看。


不怕出身低,行行出狀元。

插件

Terraform可以對多種平臺的多種資源進行管理,這個是通過插件來實現(xiàn)的。

這里的插件,在Terraform的世界也叫Providers,也是一個個可執(zhí)行文件。不同的插件完成不同的功能,對接AWS,就要使用AWS的插件;對接GCP,就要用GCP的插件。

當(dāng)我們通過terraform init初始化一個項目時,Terraform就會根據(jù)配置幫我們下載插件。在我們執(zhí)行apply的時候,就會調(diào)用這些插件實現(xiàn)對應(yīng)的資源管理。

我們可以到官方倉庫( https://registry.terraform.io/browse/providers )去搜有什么插件可用,這里有極其豐富的插件,也有詳細(xì)的使用說明:

接下來,我們就插件探討幾個問題:

  • 怎么指定下載哪些插件和版本號?
  • 從哪里下載?
  • 下載到什么地方?
  • 沒有對插件庫有訪問權(quán)限的環(huán)境下怎么處理?
  • 是否每個項目都要下載相同的插件?

指定下載哪些插件和版本

Terraform是通過解析required_providers知道需要哪些插件,一般習(xí)慣是定義一個verion.tf文件,把相關(guān)配置都放在這個文件里,比如:

terraform {
  required_version = "= v1.0.11"

  required_providers {
    local = {
      source  = "hashicorp/local"
      version = "= 2.1.0"
    }
    random = {
      source  = "hashicorp/random"
      version = "3.1.0"
    }
  }
}

這個文件定義了Terraform核心組件的版本,還定義了local和random插件及其版本號。上面指定Terraform版本為1.0.11,local版本為2.1.0,random版本為3.1.0。

我們看這里的版本號有兩個等于=號,會不會覺得奇怪?其實這是HCL語言的一個特性,除了=號,還可以是>、<=等,這樣可以指定版本范圍,而不只是某個特定版本。

從哪里下載

可以通過命令terraform providers查看當(dāng)前項目配置的插件是從哪里下載的。如下:

$ terraform providers

Providers required by configuration:
.
├── provider[registry.terraform.io/hashicorp/random] 3.1.0
└── provider[registry.terraform.io/hashicorp/local] 2.1.0

默認(rèn)是從官方的公共倉庫registry.terraform.io下載的。

如果需要指定其它倉庫,代碼如下:

terraform {
  required_version = "= v1.0.11"

  required_providers {
    local = {
      source  = "hashicorp/local"
      version = "= 2.1.0"
    }
    random = {
      source  = "hashicorp/random"
      version = "3.1.0"
    }
    pkslowcloud = {
      source  = "registry.pkslow.com/examplecorp/pkslowcloud"
      version = "0.1.0"
    }
  }
}

這里pkslowcloud就是使用自定義的倉庫地址,執(zhí)行providers命令如下:

$ terraform providers

Providers required by configuration:
.
├── provider[registry.terraform.io/hashicorp/local] 2.1.0
├── provider[registry.terraform.io/hashicorp/random] 3.1.0
└── provider[registry.pkslow.com/examplecorp/pkslowcloud] 0.1.0

注意:pkslowcloud實際不存在,大家不必嘗試下載使用。

下載到什么地方

執(zhí)行terraform init進行初始化,就會下載插件:

$ terraform init

Initializing the backend...

Initializing provider plugins...
- Finding hashicorp/random versions matching "3.1.0"...
- Finding hashicorp/local versions matching "2.1.0"...
- Installing hashicorp/random v3.1.0...
- Installed hashicorp/random v3.1.0 (signed by HashiCorp)
- Installing hashicorp/local v2.1.0...
- Installed hashicorp/local v2.1.0 (signed by HashiCorp)

執(zhí)行完init命令后,當(dāng)前工作目錄就會有一個.terraform文件夾,這里就放了插件的程序。目錄結(jié)構(gòu)如下:

$ tree -a
.
├── .terraform
│   └── providers
│       └── registry.terraform.io
│           └── hashicorp
│               ├── local
│               │   └── 2.1.0
│               │       └── darwin_amd64
│               │           └── terraform-provider-local_v2.1.0_x5
│               └── random
│                   └── 3.1.0
│                       └── darwin_amd64
│                           └── terraform-provider-random_v3.1.0_x5

沒有網(wǎng)絡(luò)環(huán)境怎么辦

在有些情況下,并不能直接訪問Terraform的公共倉庫去下載插件,如果可以從其它地方復(fù)制一份插件,并可以使用,那豈不是美哉?Terraform已經(jīng)考慮了這種需求。

首先它支持有網(wǎng)絡(luò)環(huán)境的機器把當(dāng)前目錄的插件復(fù)制到特定目錄,命令如下:

$ terraform providers mirror /Users/larry/Software/terraform/plugins
- Mirroring hashicorp/local...
  - Selected v2.1.0 to meet constraints 2.1.0
  - Downloading package for darwin_amd64...
  - Package authenticated: signed by HashiCorp
- Mirroring hashicorp/random...
  - Selected v3.1.0 to meet constraints 3.1.0
  - Downloading package for darwin_amd64...
  - Package authenticated: signed by HashiCorp

查看一下目錄結(jié)構(gòu),Terraform會打包好插件為zip文件:

$ tree -a /Users/larry/Software/terraform/plugins
/Users/larry/Software/terraform/plugins-localdisk
└── registry.terraform.io
    └── hashicorp
        ├── local
        │   ├── 2.1.0.json
        │   ├── index.json
        │   └── terraform-provider-local_2.1.0_darwin_amd64.zip
        └── random
            ├── 3.1.0.json
            ├── index.json
            └── terraform-provider-random_3.1.0_darwin_amd64.zip

下次我們可以指定插件目錄實現(xiàn)復(fù)用:

$ terraform init -plugin-dir=/Users/larry/Software/terraform/plugins

Initializing the backend...

Initializing provider plugins...
- Reusing previous version of hashicorp/random from the dependency lock file
- Reusing previous version of hashicorp/local from the dependency lock file
- Using previously-installed hashicorp/random v3.1.0
- Using previously-installed hashicorp/local v2.1.0

看日志可以看到,Terraform不再下載,而是重用插件。

執(zhí)行完命令init后,再查看terraform version,則會顯示插件的版本:

$ terraform version
Terraform v1.0.11
on darwin_amd64
+ provider registry.terraform.io/hashicorp/local v2.1.0
+ provider registry.terraform.io/hashicorp/random v3.1.0

Terraform對于這種插件目錄重用的支持,不只是zip包,二進制也是支持的,但對應(yīng)的目錄結(jié)果有點不一樣。這里不展開介紹了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容