IaC

Terraform初体验

Posted by Shi Hai's Blog on June 10, 2022

一、Infrastructure as Code(IaC)

1.1. IaC起源

IaC确切来源已无法考证,实际还有个概念可以理解成IaC框架的扩展:配置即代码(CaC)。你可以将CaC理解成IaC的一种理念扩展,主要的CaC工具如下图所示,最早的CaC工具是1993年开发的CEFngine。

Tool Released by Method
Chef Chef (2009) Pull
Otter Inedo (2015) Push
Puppet Puppet (2005) Pull
SaltStack SaltStack (2011) Push and Pull
CFEngine Northern.tech (1993) Pull
Terraform HashiCorp (2014) Push
Ansible/Ansible Tower Red Hat (2012) Push

1.2. IaC目标

维基定义:基础架构即代码 (IaC) 是通过机器可读的定义文件而不是物理硬件配置或交互式配置工具来管理和配置计算机数据中心的过程。

二、Terraform初次使用

2.1. 在centos7上安装

配置hashicorp的yum源并安装。

yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
yum install terraform -y

安装完成后执行如下命令查看terraform的版本。

terraform version

2.2. 使用

本文尝试用terraform来控制docker管理相关容器实例,先创建一个测试目录。

mkdir learn-terraform-docker-container
cd        

将下面的内容拷贝进main.tf文件中。

terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "~> 2.13.0"
    }
  }
}

provider "docker" {}

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
  }
}

learn-terraform-docker-container目录中执行terraform init,执行这个动作会下载一个用于terraform和docker进行交互的插件。
如果遇到了如下超时问题,则可以参考此issue解决。

# root @ jz2e in ~/learn-terraform-docker-container [16:02:22]
$ terraform init

Initializing the backend...

Initializing provider plugins...
- Finding kreuzwerker/docker versions matching "~> 2.13.0"...
╷
│ Error: Failed to install provider
│
│ Error while installing kreuzwerker/docker v2.13.0: could not query provider registry for registry.terraform.io/kreuzwerker/docker: failed to retrieve
│ authentication checksums for provider: the request failed after 2 attempts, please try again later: Get
│ "https://github.com/kreuzwerker/terraform-provider-docker/releases/download/v2.13.0/terraform-provider-docker_2.13.0_SHA256SUMS": net/http: request
│ canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

最后执行terraform apply并输入yes则就可以通过terraform创建出一个nginx容器。如果你想删除这个容器,则可以执行terraform destroy来执行。

# root @ jz2e in ~/learn-terraform-docker-container [16:16:53]
$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                      NAMES
225a4c834b1b   0e901e68141f   "/docker-entrypoint.…"   3 seconds ago   Up 2 seconds   0.0.0.0:8000->80/tcp       tutorial

三、F&A of IAC

Q1: 数据库的DDL是否能作为IAC的一部分?
A1:DDL是应用的一部分,不是infrastructure的一部分,所以DDL的变更需要有专门的数据库变更工具管理起来。Terraform Q&A — DDL Statements in Database database-as-code

四、引用附录

-History of Infra as Code
-Infrastructure as code
-tefform官网教程
-terraform providers
-Terraform 实战 | 万字长文