【Terraform】快速实践"Hello World"

简介: 这篇文章根据社区教程,编写一个基于`Docker`启动`nginx`的例子。

一、环境准备

Terraform 和 Docker

在正式开始例子之前,我们必须保证环境中已经安装了Terraformdocker,前者参照专栏内部的上篇文章,docker的安装参照这篇文章《文章TODO》。

Provider插件缓存配置

Terraform的整个执行流程中,我们在使用到Terraform init命令时,该工具会分析我们代码中使用到的Provider,并尝试下载Provider插件到本地,如果我们不进行特殊的设置,每次执行init都会尝试去下载插件,并且每个项目都回保存自己独立的插件,相当浪费空间。这怎么办呢?

这时我们可以使用插件缓存,基本的原理只要插件下载成功一次,就会保存在指定的插件缓存目录,其它项目再次下载,就会拷贝缓存内容到项目目录,甚至在系统支持上,Terraform还会使用符号连接这个缓存路径,并不直接拷贝插件内容。

有两种方式,第一种方式是配置TF_PLUGIN_CACHE_DIR环境变量:

#务必确保这个目录下已经创建好plugin-cache这个文件夹
export TF_PLUGIN_CACHE_DIR="$HOME/.terraform.d/plugin-cache"

第二种方式是使用CLI配置文件,基于Linux环境,在用户的/home目录下创建名为 ".terraformrc" 的文件:

plugin_cache_dir = "$HOME/.terraform.d/plugin-cache"

需要注意的是:有必要关注缓存路径的空间增长,择机选择性地手工清理不必要的Provider插件。

二、实战

这次实战的目的是通过Terraform部署基于Docker的Nginx环境,并能成功访问到Nginx的欢迎主页。

2.1 定义资源

在这里我们使用到Github上的项目

[terraform-provider-docker​]  https://github.com/kreuzwerker/terraform-provider-docker 

提供的Provider插件,编写资源文件main.tf

terraform {
#定义所需的Provider
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "~> 2.13.0"
    }
  }
}
​
# 配置docker provider
provider "docker" {}
​
#创建一个docker镜像资源
 resource "docker_image" "nginx" {
  name         = "nginx:latest"
  keep_locally = false
}
#创建一个docker容器资源
#这部分的资源定义,类似"docker run --name nginx -p8080:80 -d nginx:latest"
resource "docker_container" "nginx" {
  image = docker_image.nginx.latest
  name  = "tutorial"
  ports {
    internal = 80
    external = 8000
  }
}
#接下来还可以继续定义服务资源

2.2 执行创建

关于基础设施的资源已经定义完成,接下来就是在安装好Terraformdocker的服务器上执行部署。

首先,为了区分项目,达到隔离资源的目的,我们先在工程目录创建一个新文件夹:

#创建目录
$mkdir learn-terraform-docker-container
#进入目录
$cd learn-terraform-docker-container

然后上传main.tf到当前文件夹。接着在当前目录执行Terraform init初始化环境。

$Terraform init

小提示:环境初始过程花费的时间会与你的服务器网络环境密切相关,请耐心等待,如果失败,请多尝试几次!

图片.png

如图上所示,环境初始化成功,观察本地目录,多了一些文件和文件夹。

图片.png
.terraform隐藏文件夹中存储着我们下载的Provider插件内容,.terraform.lock.hcl记录了provider插件的一些依赖信息。如果进入我们前面设置的缓存插件目录,会多了这个插件的内容。

接下来,我们预览资源部署情况terraform plan

$terraform plan

执行结果输出如下:

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create
​
Terraform will perform the following actions:
​
  # docker_container.nginx will be created
  + resource "docker_container" "nginx" {
      + attach           = false
      + bridge           = (known after apply)
      + command          = (known after apply)
      + container_logs   = (known after apply)
      + entrypoint       = (known after apply)
      + env              = (known after apply)
      + exit_code        = (known after apply)
      + gateway          = (known after apply)
      + hostname         = (known after apply)
      + id               = (known after apply)
      + image            = (known after apply)
      + init             = (known after apply)
      + ip_address       = (known after apply)
      + ip_prefix_length = (known after apply)
      + ipc_mode         = (known after apply)
      + log_driver       = "json-file"
      + logs             = false
      + must_run         = true
      + name             = "tutorial"
      + network_data     = (known after apply)
      + read_only        = false
      + remove_volumes   = true
      + restart          = "no"
      + rm               = false
      + security_opts    = (known after apply)
      + shm_size         = (known after apply)
      + start            = true
      + stdin_open       = false
      + tty              = false
​
      + healthcheck {
          + interval     = (known after apply)
          + retries      = (known after apply)
          + start_period = (known after apply)
          + test         = (known after apply)
          + timeout      = (known after apply)
        }
​
      + labels {
          + label = (known after apply)
          + value = (known after apply)
        }
​
      + ports {
          + external = 8000
          + internal = 80
          + ip       = "0.0.0.0"
          + protocol = "tcp"
        }
    }
​
  # docker_image.nginx will be created
  + resource "docker_image" "nginx" {
      + id           = (known after apply)
      + keep_locally = false
      + latest       = (known after apply)
      + name         = "nginx:latest"
      + output       = (known after apply)
      + repo_digest  = (known after apply)
    }
​
Plan: 2 to add, 0 to change, 0 to destroy.

根据输出内容可以看到增加了两个资源,包括镜像和容器。无更改和销毁项。

接下来执行部署资源terraform apply

$terraform apply

执行结果输出如下:

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create
​
Terraform will perform the following actions:
​
  # docker_container.nginx will be created
  + resource "docker_container" "nginx" {
      + attach           = false
      + bridge           = (known after apply)
      + command          = (known after apply)
      + container_logs   = (known after apply)
      + entrypoint       = (known after apply)
      + env              = (known after apply)
      + exit_code        = (known after apply)
      + gateway          = (known after apply)
      + hostname         = (known after apply)
      + id               = (known after apply)
      + image            = (known after apply)
      + init             = (known after apply)
      + ip_address       = (known after apply)
      + ip_prefix_length = (known after apply)
      + ipc_mode         = (known after apply)
      + log_driver       = "json-file"
      + logs             = false
      + must_run         = true
      + name             = "tutorial"
      + network_data     = (known after apply)
      + read_only        = false
      + remove_volumes   = true
      + restart          = "no"
      + rm               = false
      + security_opts    = (known after apply)
      + shm_size         = (known after apply)
      + start            = true
      + stdin_open       = false
      + tty              = false
​
      + healthcheck {
          + interval     = (known after apply)
          + retries      = (known after apply)
          + start_period = (known after apply)
          + test         = (known after apply)
          + timeout      = (known after apply)
        }
​
      + labels {
          + label = (known after apply)
          + value = (known after apply)
        }
​
      + ports {
          + external = 8000
          + internal = 80
          + ip       = "0.0.0.0"
          + protocol = "tcp"
        }
    }
​
  # docker_image.nginx will be created
  + resource "docker_image" "nginx" {
      + id           = (known after apply)
      + keep_locally = false
      + latest       = (known after apply)
      + name         = "nginx:latest"
      + output       = (known after apply)
      + repo_digest  = (known after apply)
    }
​
Plan: 2 to add, 0 to change, 0 to destroy.
​
Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.
​
  Enter a value:yes
​

输入yes明确要执行部署。

图片.png

部署完成!未出现错误。

然后查看docker容器中是否已经创建了nginx

$docker ps

图片.png

有了,创建成功了,然后curl访问一下,也能获取到欢迎主页!

图片.png

至此,部署创建成功,我们观察项目目录,多了一个terraform.tfstate文件,这个就是状态文件,相当重要,切记不要尝试去手动修改它!

2.3 执行销毁

执行销毁那是相当简单了,用项目目录下执行terraform destroy命令即可。

$terraform destroy
相关文章
|
2月前
|
弹性计算 人工智能 运维
Terraform从入门到实践:快速构建你的第一张业务网络(上)
本次分享主题为《Terraform从入门到实践:快速构建你的第一张业务网络》。首先介绍如何入门和实践Terraform,随后演示如何使用Terraform快速构建业务网络。内容涵盖云上运维挑战及IaC解决方案,并重磅发布Terraform Explorer产品,旨在降低使用门槛并提升用户体验。此外,还将分享Terraform在实际生产中的最佳实践,帮助解决云上运维难题。
171 1
Terraform从入门到实践:快速构建你的第一张业务网络(上)
|
弹性计算 网络协议 Devops
云上DevOps-CodePipeline,Packer和Terraform集成实践探索
DevOps越来越火,各种产品层出不穷,技术人员如果不谈谈这个词,就会显得很落伍了,在这种形势下,阿里云也推出了自己的DevOps公共云产品CodePipeline,本文并不想介绍已经铺天盖地的DevOps概念,而是结合阿里云的产品CodePipeline和开源工具Packer,Terraform来实践一种全新云上的DevOps方案,从构建代码,创建自定义镜像,然后基于包含新应用的镜像来创建运行应用的整个基础设施,包括ECS,VPC网络,安全组等等,然后发布应用,从无到有一键完成。
4975 0
|
弹性计算 负载均衡 API
Terraform/Ansible on Cloud--基础设施和应用管理实践
在由阿里云研发协同RDC以及阿里云云栖社区联合举办的首届阿里巴巴研发效能嘉年华上,来自阿里云飞天八部企业服务云应用服务团队的高级研发工程师箫竹为大家分享了基础设施和应用管理实践,主要介绍了Terraform和Ansible两大自动化基础设施和应用管理工具,并结合实际应用场景介绍了如何在云上使用Terraform和Ansible工具提升基础设施和应用管理的效能。
11450 0
|
数据中心
单库单服解决方案terraform部署实践
本例通过terraform在阿里云创建单库单服整体架构,通过这一最佳实践让读者理解terraform的模块化编程管理思路,提高云资源创建效率和自动化运维水平。
2847 0
|
数据中心
Terraform应用实践解决方案
Terraform是HashiCorp旗下的一款基础架构资源管理运维工具,可以安全高效地构建、更改以及合并多个云厂商的服务资源,当前支持有阿里云、AWS、微软Azure、Google Cloud Platform(GCP)等多个云厂商产品的资源创建。读者可以参考附件实践指导文档以及示例代码。
1139 0
|
弹性计算 运维 Devops
Multi-Cloud模式下Terraform和Packer开源工具实践分享
在2017云栖大会·深圳峰会上,来自阿里云云开发的黎山分享了《Multi-Cloud基础设施和应用管理实践》。软件行业的变化、云计算的出现和兴起,推动着越来越多的企业选择Multi-Cloud模式。黎山详细介绍了Terraform和Packer开源工具的使用方法,通过4个案例源码分享了具体的实践过程。
9918 0
|
3月前
|
弹性计算 持续交付 API
基于 ROS 的Terraform托管服务轻松部署ChatGLM-6B
文章介绍了如何利用ROS和Terraform模板轻松自动化部署基于GLM架构、优化中文对话的ChatGLM-6B模型至阿里云,提高了部署效率与便捷性,适用于多种应用场景,且模型部署过程详细,彰显了基础设施即代码(IaC)的优势。
基于 ROS 的Terraform托管服务轻松部署ChatGLM-6B
|
3月前
|
弹性计算 人工智能 持续交付
基于 ROS 的Terraform托管服务轻松部署Qwen-7B-Chat
文章介绍了如何利用ROS和Terraform模板轻松自动化部署阿里云的Qwen-7B-Chat大语言模型服务,提高了部署效率与便捷性,是实现云资源和服务快速上线的最佳实践。
基于 ROS 的Terraform托管服务轻松部署Qwen-7B-Chat
|
6月前
|
弹性计算 API 持续交付
基于 ROS 的 Terraform 托管服务轻松部署文本转语音系统 ChatTTS
基于 IaC 的理念,通过定义一个模板,使用 ROS 提供的 Terraform 托管服务进行自动化部署,可以非常高效快捷地部署任意云资源和应用(比如 ChatTTS 服务)。相比于手动部署或者通过 API、SDK 的部署方式,有着高效、稳定等诸多优势,也是服务上云的最佳实践。
基于 ROS 的 Terraform 托管服务轻松部署文本转语音系统 ChatTTS
|
7月前
|
弹性计算 持续交付 数据中心
一键云部署:ROS的Terraform托管服务助你轻松上线2048经典游戏
阿里云的资源编排服务ROS提供了Terraform托管能力,用户可以直接在ROS控制台上部署Terraform脚本,本文将详细介绍如何使用ROS的Terraform托管服务一键部署经典的2048小游戏到云端,让全世界的玩家都能在线体验。