# 使用 Terraform 配置和构建基础设施

不同平台的[Terraform安装指南](https://learn.hashicorp.com/tutorials/terraform/install-cli)

例如，MacOS上的安装命令：

```bash
brew tap hashicorp/tap
brew install hashicorp/tap/terraform
```

安装成功如图：

![](https://gitcode.net/csdn/skill_tree_cloud_native/-/raw/master/data/1.云原生初阶/7.基础架构自动编排(Terraform)/2.Terraform命令行工具/img/install.png)
<br/>


查看下有哪些命令：

![](https://gitcode.net/csdn/skill_tree_cloud_native/-/raw/master/data/1.云原生初阶/7.基础架构自动编排(Terraform)/2.Terraform命令行工具/img/commands.png)
<br/>

可以看到一组核心命令：

* init: 初始化目录
* validate： 检测配置是否有效
* plan：计划，显示当前配置的依赖变动
* apply： 创建或者应用基础设施配置
* destroy：销毁配置的创建

例如，这是一个'app.tf' 配置，配置了docker部署相关的配置，我们的目的只是理解 Terraform 是干什么的，细节不用太细究。

```bash
terraform {
  required_providers {
    docker = {
      source = "terraform-providers/docker"
    }
  }
}

provider "docker" {
  host    = "tcp://localhost:2375"
}

resource "docker_image" "nginx" {
  name         = "nginx:latest"
  keep_locally = false
}

resource "docker_container" "nginx" {
  image = docker_image.nginx.latest
  name  = "tutorial"
  ports {
    internal = 80
    external = 8000
  }
}
```

现在，执行`terraform init`命令初始化

![](https://gitcode.net/csdn/skill_tree_cloud_native/-/raw/master/data/1.云原生初阶/7.基础架构自动编排(Terraform)/2.Terraform命令行工具/img/init.png)
<br/>

现在，执行`terraform plan`命令检测配置

![](https://gitcode.net/csdn/skill_tree_cloud_native/-/raw/master/data/1.云原生初阶/7.基础架构自动编排(Terraform)/2.Terraform命令行工具/img/plan.png)
<br/>

可以看到，由于连不上 Mac系统的 docker daemon ，环境监测失败。Mac系统上不需要配置`host    = "tcp://localhost:2375"`，删除后，重新执行如下

![](https://gitcode.net/csdn/skill_tree_cloud_native/-/raw/master/data/1.云原生初阶/7.基础架构自动编排(Terraform)/2.Terraform命令行工具/img/plan_success.png)
<br/>

现在，我们执行`terraform apply`，将会开始构建一个 ngix 的docker：

![](https://gitcode.net/csdn/skill_tree_cloud_native/-/raw/master/data/1.云原生初阶/7.基础架构自动编排(Terraform)/2.Terraform命令行工具/img/apply_q.png)
<br/>

在实际构建之前，会要求再次确认，输入'yes'回车，开始实施：

![](https://gitcode.net/csdn/skill_tree_cloud_native/-/raw/master/data/1.云原生初阶/7.基础架构自动编排(Terraform)/2.Terraform命令行工具/img/apply_a.png)
<br/>


可见，使用 terraform 可以让基础设施的构建使用上声明式配置，具有标准化、统一配置、减少错误、跨平台的好处。

以下说法错误的是？

## 答案

terraform 只能在MacOS上使用

## 选项

### A

terraform 可以大幅度简化基础设施构建

### B

terraform 命令行使用`init`, `plan`, `apply` 三个子命令来管理基础设施构建

### C

terraform 提供了后缀名为 tf 的声明式基础设施构建配置
