《Terraform 101 从入门到实践》这本小册在南瓜慢说官方网站GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看。


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

插件

Terraform可以对多种平台的多种资源进行管理,这个是通过插件来实现的。

这里的插件,在Terraform的世界也叫Providers,也是一个个可执行文件。不同的插件完成不同的功能,对接AWS,就要使用AWS的插件;对接GCP,就要用GCP的插件。

当我们通过terraform init初始化一个项目时,Terraform就会根据配置帮我们下载插件。在我们执行apply的时候,就会调用这些插件实现对应的资源管理。

我们可以到官方仓库( https://registry.terraform.io/browse/providers )去搜有什么插件可用,这里有极其丰富的插件,也有详细的使用说明:

接下来,我们就插件探讨几个问题:

  • 怎么指定下载哪些插件和版本号?
  • 从哪里下载?
  • 下载到什么地方?
  • 没有对插件库有访问权限的环境下怎么处理?
  • 是否每个项目都要下载相同的插件?

指定下载哪些插件和版本

Terraform是通过解析required_providers知道需要哪些插件,一般习惯是定义一个verion.tf文件,把相关配置都放在这个文件里,比如:

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查看当前项目配置的插件是从哪里下载的。如下:

$ terraform providers

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

默认是从官方的公共仓库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就是使用自定义的仓库地址,执行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实际不存在,大家不必尝试下载使用。

下载到什么地方

执行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)

执行完init命令后,当前工作目录就会有一个.terraform文件夹,这里就放了插件的程序。目录结构如下:

$ 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

没有网络环境怎么办

在有些情况下,并不能直接访问Terraform的公共仓库去下载插件,如果可以从其它地方复制一份插件,并可以使用,那岂不是美哉?Terraform已经考虑了这种需求。

首先它支持有网络环境的机器把当前目录的插件复制到特定目录,命令如下:

$ 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

查看一下目录结构,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

下次我们可以指定插件目录实现复用:

$ 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不再下载,而是重用插件。

执行完命令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包,二进制也是支持的,但对应的目录结果有点不一样。这里不展开介绍了。

《Terraform 101 从入门到实践》 第二章 Providers插件管理的更多相关文章

  1. python从入门到实践 第二章

    python变量赋值: python的变量赋值 可以是单引号 也可以是双引号python 变量赋值的时候不能加()的 比如 name = "My Name is GF"变量赋值的时 ...

  2. #Python编程从入门到实践#第二章笔记

      ​​​1.变量 (1)变量名只能包含字母.数字和下划线,不能包含空格 (2)不要将python关键字与函数名作为变量名 (3)简短有描述性,避免使用小写字母l和大写字母O (4)python 始终 ...

  3. ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区 1 Desktop简介 1.1 ArcGIS for Desktop ...

  4. Django入门与实践 17-26章总结

    Django入门与实践-第17章:保护视图 Django 有一个内置的视图装饰器 来避免它被未登录的用户访问: 现在如果用户没有登录,将被重定向到登录页面: 现在尝试登录,登录成功后,应用程序会跳转到 ...

  5. Google C++测试框架系列入门篇:第二章 开始一个新项目

    上一篇:Google C++测试框架系列入门篇:第一章 介绍:为什么使用GTest? 原始链接:Setting up a New Test Project 词汇表 版本号:v_0.1 开始一个新项目 ...

  6. ActiveMQ 快速入门教程系列 第二章 发布-订阅者模式实现

    第二章我们会介绍怎样实现一个发布者对多个订阅者的消息传递 Topic和queue的最大区别在于topic是以广播的形式,通知所有在线监听的客户端有新的消息,没有监听的客户端将收不到消息:而queue则 ...

  7. 网络安全从入门到精通 (第二章-6) 后端基础PHP—表单验证

    本文内容: 什么是表单? 如何创建一个表单: 接收并验证: PHP和数据库交互 1,什么事表单? 表单在网页中主要负责数据采集. 表单由三部分组成: 表单标签:这里面包含了处理表单数据所用动态脚本的U ...

  8. HttpClient学习研究---第二章:连接管理

    第二章.Connection management连接管理2.1. 2.1.Connection persistence连接持久性The process of establishing a conne ...

  9. SpringMVC从入门到精通之第二章

    这一章原本我是想写一个入门程序的,但是后来仔细想了一下,先从下面的图中的组件用代码来介绍,可能更效果会更加好一点.第一节:开发准备介绍之前先说下我的开发调试环境:JDK 1.7的64位 .Eclips ...

  10. Batch入门教程丨第二章:认识变量相关概念

    在前两期的学习内容中,我们已经了解了Batch入门教程有关的知识和编程方法,如何编写和运行Windows Batch程序,脚本语言的入门方式等,今天我们将继续深入学习Batch入门教程之认识变量相关概 ...

随机推荐

  1. perl之grep函数的用法

    转载至 perl中grep的详细用法 grep有2种表达方式: 1 grep BLOCK LIST 2 grep EXPR, LIST BLOCK表示一个code块,通常用{}表示:EXPR表示一个表 ...

  2. K8S节点配置资源驱逐

    #参考文章:https://www.cnblogs.com/zhangrui153169/p/15726165.html 当节点内存到达多少时.对节点的pod进行驱逐 [root@lecode-tes ...

  3. 论文翻译:2022_DeepFilterNet2: Towards Real-Time Speech Enhancement On Embedded Devices For Fullband Audio

    博客地址:凌逆战 论文地址:DeepFilternet2: 面向嵌入式设备的全波段音频实时语音增强 论文代码:https://github.com/Rikorose/DeepFilterNet 引用格 ...

  4. Nginx如何配置隐藏index.php文件

    server { listen 80; #listen [::]:80 default_server ipv6only=on; server_name jiqing.dexin.com; index ...

  5. yum的$releaser与$basearch

    最近配置centos 的yum 源时,想要配置一个通配的yum源,注意到发行的网络yum源的url地址中通常有两个变量 https://vault.centos.org/$releaser/cloud ...

  6. ARM MMU架构 -- CPU如何访问MMU及DRAM

    <ARM Architecture Reference Manual ARMv8-A>里面有Memory层级框架图,从中可以看出L1.L2.DRAM.Disk.MMU之间的关系,以及他们在 ...

  7. 6. PyQt5 中的多线程的使用(上)

    专栏地址 ʅ(‾◡◝)ʃ 这一节引入了多线程这个非常重要概念, 在我认为多线程的重要性是紧紧次于信号与槽函数的, 因为在平时经常使用 1. 为什么要用多线程 先看下面这一个示例代码 6.1 from ...

  8. 处理get请求中文乱码tomcat请求

    修改tomcat中server配置:添加 URIEncoding="UTF-8" <Connector port="8090" protocol=&quo ...

  9. SpringCloud Alibaba(七) - JWT(JSON Web Token)

    原文链接: JWT详解:https://blog.csdn.net/weixin_45070175/article/details/118559272 1.什么是JWT 通俗地说,JWT的本质就是一个 ...

  10. Vue3 企业级优雅实战 - 组件库框架 - 8 搭建组件库 cli

    前面的文章分享了组件库的开发.example.组件库文档,本文分享组件库 cli 开发. 1 为什么要开发组件库 cli 回顾一个新组件的完整开发步骤: 1 在 packages 目录下创建组件目录 ...