terraform入门

一、概念

1、Terraform 的“基础设施即代码”是什么

基础设施即代码 (IaC) 工具允许您使用配置文件而非图形用户界面来管理基础设施。通过定义可版本控制、可重用和可共享的资源配置,IaC 允许您以安全、一致且可重复的方式构建、更改和管理您的基础设施。

Terraform 是 HashiCorp 的基础设施即代码工具。它允许您使用易于理解的声明式配置文件定义资源和基础设施,并管理基础设施的生命周期。与手动管理基础设施相比,使用 Terraform 具有以下几个优势:

  • Terraform 可以管理多个云平台上的基础设施。
  • 通俗易懂的配置语言可帮助您快速编写基础设施代码。
  • Terraform 的状态允许您在整个部署过程中跟踪资源变化。
  • 您可以将配置提交到版本控制中,以便在基础设施上安全地协作。

2、管理任何基础设施

Terraform 插件允许 Terraform 通过其应用程序编程接口 (API) 与云平台和其他服务进行交互。HashiCorp 和 Terraform 社区已编写了 1,000 多个提供程序,用于管理 Amazon Web Services (AWS)、Azure、Google Cloud Platform (GCP)、Kubernetes、Helm、GitHub、Splunk 和 DataDog 等平台上的资源。您可以在Terraform Registry中找到您已在使用的众多平台和服务的提供程序。如果您找不到所需的提供程序,可以自行编写。

3、标准化部署工作流程

提供商将基础架构的各个单元(例如计算实例或专用网络)定义为资源。您可以将来自不同提供商的资源组合成可重复使用的 Terraform 配置(称为模块),并使用一致的语言和工作流进行管理。

Terraform 的配置语言是声明式的,这意味着它描述了基础架构所需的最终状态,这与需要逐步说明才能执行任务的过程式编程语言不同。Terraform 提供程序会自动计算资源之间的依赖关系,以便按正确的顺序创建或销毁它们。

在这里插入图片描述

要使用 Terraform 部署基础设施:

  • 范围——确定项目的基础设施。
  • 编写——为您的基础设施编写配置。
  • 初始化- 安装 Terraform 管理基础设施所需的插件。
  • 计划- 预览 Terraform 将进行的更改以匹配您的配置。
  • 应用——进行计划的更改。

4、追踪您的基础设施

Terraform 会将你的真实基础架构跟踪到状态文件中,该文件是你环境的真实来源。Terraform 使用状态文件来确定需要对基础架构进行的更改,以使其与你的配置相匹配。

二、安装

环境:CentOS Stream release 9

安装yum-config-manager以管理您的存储库。

$ sudo yum install -y yum-utils

用于yum-config-manager添加官方 HashiCorp RHEL 存储库。

$ sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo

从新存储库安装 Terraform。

$ sudo yum -y install terraform

三、构建基础设施

创建名为 的目录learn-terraform-docker-container。

$ mkdir learn-terraform-docker-container

更改到目录。

$ cd learn-terraform-docker-container

创建一个文件来定义您的基础设施。

$ touch main.tf

在文本编辑器中打开main.tf,粘贴以下配置,然后保存文件

terraform {required_providers {docker = {source = "kreuzwerker/docker"version = "~> 3.0.1"}}
}provider "docker" {}resource "docker_image" "nginx" {name         = "nginx:latest"keep_locally = false
}resource "docker_container" "nginx" {image = docker_image.nginx.image_idname  = "tutorial"ports {internal = 80external = 8000}
}

1、初始化目录

在应用这个配置之前,需要先初始化目录;

$ terraform initInitializing the backend...Initializing provider plugins...
- Finding kreuzwerker/docker versions matching "~> 3.0.1"...
- Installing kreuzwerker/docker v3.0.1...
- Installed kreuzwerker/docker v3.0.1 (self-signed, key ID BD080C4571C6104C)Partner and community providers are signed by their developers.
If you'd like to know more about provider signing, you can read about it here:
https://www.terraform.io/docs/cli/plugins/signing.html
………………

terraform会下载docker提供应用程序并将其安装在当前工作目录的隐藏子目录中。名为.terraform。terraform还会创建一个名为.terraform.lock.hcl的锁文件,其中指定了所使用的提供程序的确切版本。

2、格式化并验证配置

建议在所有配置文件中使用一致的格式。该 terraform fmt命令会自动更新当前目录中的配置,以提高可读性和一致性。

$ terraform fmt

还可以使用该命令确保您的配置在语法上有效且内部一致terraform validate。

$ terraform validate
Success! The configuration is valid.

3、创建基础设施

现在使用以下命令应用配置terraform apply。Terraform 将打印类似如下所示的输出。

$ terraform applyTerraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:+ createTerraform will perform the following actions:# docker_container.nginx will be created+ resource "docker_container" "nginx" {
##...+ 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)}Plan: 2 to add, 0 to change, 0 to destroy.

在应用任何更改之前,Terraform 都会打印出执行计划 ,该计划描述了 Terraform 为了更改基础设施以匹配配置将采取的操作。

Terraform 现在将暂停并等待您的批准,然后再继续。如果计划中有任何内容看起来不正确或危险,您可以安全地在此中止,并且不会对您的基础架构进行任何更改。

在确认提示下,输入yes键入继续执行。

  Enter a value: yesdocker_image.nginx: Creating...
docker_image.nginx: Still creating... [10s elapsed]
docker_image.nginx: Creation complete after 13s [id=sha256:d1a364dc548d5357f0da3268c888e1971bbdb957ee3f028fe7194f1d61c6fdeenginx:latest]
docker_container.nginx: Creating...
docker_container.nginx: Creation complete after 2s [id=2834ad6283372ceb61121739ce71d31cb0237ad50f4dc234e3445c9445439181]Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

查看docker进程,容器已经创建

[root@k8s-10-0-1-189 learn-terraform-docker-container]# docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED       STATUS      PORTS                  NAMES
89d5f94dee81   ad5708199ec7            "/docker-entrypoint.…"   4 days ago    Up 4 days   0.0.0.0:8088->80/tcp   ExampleNginxContainer

4、检查状态

当你应用配置时,Terraform 会将数据写入名为 的文件中 terraform.tfstate。Terraform 将其管理的资源的 ID 和属性存储在此文件中。

Terraform 状态文件是 Terraform 追踪其管理资源的唯一途径,并且通常包含敏感信息,因此您必须安全地存储状态文件,并仅限需要管理基础架构的受信任团队成员访问。

$ terraform show
# docker_container.nginx:
resource "docker_container" "nginx" {attach            = falsecommand           = ["nginx","-g","daemon off;",]cpu_shares        = 0entrypoint        = ["/docker-entrypoint.sh",]env               = []gateway           = "172.17.0.1"hostname          = "2834ad628337"id                = "2834ad6283372ceb61121739ce71d31cb0237ad50f4dc234e3445c9445439181"image             = "sha256:d1a364dc548d5357f0da3268c888e1971bbdb957ee3f028fe7194f1d61c6fdee"init              = falseip_address        = "172.17.0.2"ip_prefix_length  = 16ipc_mode          = "private"log_driver        = "json-file"……………………

四、改变基础设施

1、更新配置

现在更新容器的外部端口号。通过将ports.external 的值替换为8080 ,

resource "docker_container" "nginx" {image = docker_image.nginx.latestname  = "tutorial"hostname = "learn-terraform-docker"ports {internal = 80
-   external = 8000
+   external = 8080}
}

此更新会更改容器用于服务 nginx 服务器的端口号。Docker 提供程序知道容器创建后无法更改其端口,因此 Terraform 会销毁旧容器并创建一个新容器。

2、应用更改

更改配置后,terraform apply再次运行以查看 Terraform 如何将此更改应用到现有资源。

$ terraform apply
docker_image.nginx: Refreshing state... [id=sha256:d1a364dc548d5357f0da3268c888e1971bbdb957ee3f028fe7194f1d61c6fdeenginx:latest]
docker_container.nginx: Refreshing state... [id=5896c6cb7ae654503c36562472b573da8f49057fd466927be2870453a3b93e51]Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
-/+ destroy and then create replacementTerraform will perform the following actions:# docker_container.nginx must be replaced
-/+ resource "docker_container" "nginx" {
##...~ ports {~ external = 8000 -> 8080 # forces replacement# (3 unchanged attributes hidden)}}Plan: 1 to add, 0 to change, 1 to destroy.Do you want to perform these actions?Terraform will perform the actions described above.Only 'yes' will be accepted to approve.

该前缀-/+表示 Terraform 将销毁并重新创建资源,而不是就地更新。Terraform 可以就地更新某些属性(~前缀指示),但更改 Docker 容器的端口需要重新创建。

Terraform 再次提示您批准执行计划,然后才能继续。回答yes后即可执行计划中的步骤。

docker_container.nginx: Destroying... [id=5896c6cb7ae654503c36562472b573da8f49057fd466927be2870453a3b93e51]
docker_container.nginx: Destruction complete after 1s
docker_container.nginx: Creating...
docker_container.nginx: Creation complete after 1s [id=b2140f8c6aa79f62c8ac3c3d792f2044bcca8d5a0a08a4598ead1ade7aab7e6e]Apply complete! Resources: 1 added, 0 changed, 1 destroyed.

根据执行计划,Terraform 首先销毁了现有容器,然后在其位置创建了一个新容器。您可以terraform show 再次使用 让 Terraform 打印出与此容器关联的新值。

五、查询带有输出的数据

1、输出 Docker 容器配置

outputs.tf在您的learn-terraform-docker-container目录中创建一个名为的文件。

添加以下配置来outputs.tf定义容器 ID 和图像 ID 的输出。

output "container_id" {description = "ID of the Docker container"value       = docker_container.nginx.id
}

2、检查输出值

您必须先重新应用此配置,然后才能使用这些输出值。根据提示输入yes

$ terraform apply

应用配置时,Terraform 会将输出值打印到屏幕上。使用terraform output命令查询输出。

$ terraform output
container_id = "e5fff27c62e26dc9504d21980543f21161225ab483a1e534a98311a677b9453a"

六、删除基础设施

该terraform destroy命令会删除 Terraform 项目管理的资源。它不会删除当前 Terraform 项目未管理的、在其他位置运行的资源。

$ terraform destroy
docker_image.nginx: Refreshing state... [id=sha256:d1a364dc548d5357f0da3268c888e1971bbdb957ee3f028fe7194f1d61c6fdeenginx:latest]
docker_container.nginx: Refreshing state... [id=b2140f8c6aa79f62c8ac3c3d792f2044bcca8d5a0a08a4598ead1ade7aab7e6e]Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:- destroyTerraform will perform the following actions:# docker_container.nginx will be destroyed- resource "docker_container" "nginx" {
##...# docker_image.nginx will be destroyed- resource "docker_image" "nginx" {- id           = "sha256:d1a364dc548d5357f0da3268c888e1971bbdb957ee3f028fe7194f1d61c6fdeenginx:latest" -> null- keep_locally = false -> null- latest       = "sha256:d1a364dc548d5357f0da3268c888e1971bbdb957ee3f028fe7194f1d61c6fdee" -> null- name         = "nginx:latest" -> null}Plan: 0 to add, 0 to change, 2 to destroy.Do you really want to destroy all resources?Terraform will destroy all your managed infrastructure, as shown above.There is no undo. Only 'yes' will be accepted to confirm.Enter a value:

该-前缀表示该容器将被销毁。与 apply 类似,Terraform 会显示其执行计划,并等待批准后才能进行任何更改。

回答yes执行这个计划并删除这个基础设施。

  Enter a value: yesdocker_container.nginx: Destroying... [id=b2140f8c6aa79f62c8ac3c3d792f2044bcca8d5a0a08a4598ead1ade7aab7e6e]
docker_container.nginx: Destruction complete after 2s
docker_image.nginx: Destroying... [id=sha256:d1a364dc548d5357f0da3268c888e1971bbdb957ee3f028fe7194f1d61c6fdeenginx:latest]
docker_image.nginx: Destruction complete after 0sDestroy complete! Resources: 2 destroyed.

七、目录层级

最后让我们来看一下,一个普通的terraform基础设施目录的层级。

[root@k8s-10-0-1-189 learn-terraform-docker-container]# tree -a ./
./
#主配置文件
├── main.tf
#输出的配置文件
├── outputs.tf
#初始化时,安装的程序二进制文件等信息
├── .terraform
│   └── providers
│       └── registry.terraform.io
│           └── kreuzwerker
│               └── docker
│                   └── 3.0.2
│                       └── linux_amd64
│                           ├── CHANGELOG.md
│                           ├── LICENSE
│                           ├── README.md
│                           └── terraform-provider-docker_v3.0.2
#指定了提供程序的确切版本,避免在更新程序时,下载最新提供程序,而导致不兼容
├── .terraform.lock.hcl
#存储资源ID和属性
├── terraform.tfstate
#变量配置文件
└── variables.tf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/921758.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/921758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARM 体系结构与存储器

一、RAM 分类SRAM (Static RAM)用 触发器/晶体管 存储 0/1。特点:速度快、功耗低(静态保持),但成本高、容量小。应用:片上缓存、寄存器文件、单片机内存。DRAM (Dynamic RAM)用 电容充放电 存储 0/1。特点:…

Jenkins运维之路(初识流水线)

1.初次使用流水线前面我们用自由风格的流水线进行了项目部署,但是自由风格的流水线只能应付一些简单且项目规模不是很大的部署。为了让流水线能够灵活、通用、逻辑清晰且更加容易维护,现在一般企业都是采取使用了Pipeline的方式来对流水线进行构建&#…

【智能协同云图库】基于统一接口架构构建多维度分析功能、结合 ECharts 可视化与权限校验实现用户 / 管理员图库统计、通过 SQL 优化与流式处理提升数据

摘要:本节围绕提升空间图库管理分析能力,先分用户与管理员两类梳理资源使用、分类、标签等 6 大分析需求,再设计统一实现流程与接口方案,最后通过分层开发完成各需求后端功能,覆盖权限校验、数据处理与接口编写。 本节…

HTML第八课:HTML4和HTML5的区别

HTML第八课&#xff1a;HTML4和HTML5的区别html4 与 html 5的区别快速学习平台html4 与 html 5的区别 示例图 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> &…

CS336——1. Overview

文章目录1. CS336介绍2. 概览2.1 为什么会有这门课程2.1.1 LLM的参数和训练成本2.2.2 小语言模型和LLM的区别2.2 你可以学到什么&#xff1f;2.2.1 Intuitions2.2.2 The bitter lesson3. 全景图(current landscape)/发展历史4. 可执行的课件说明5. 课程设计6. 课程内容6. 1 bas…

ncnn-Android-mediapipe_hand 踩坑部署实录

目录 同时有 nanodet 和yolox,可以做到10fps 没测试:yolox hand ncnn-Android-mediapipe_hand hand 关键点21个模型: ncnn版本: 跑通后,手部关键点集中在图像左上角,经过排查,原因是ncnn版本不对。 CMakeLists.txt 同时有 nanodet 和yolox,可以做到10fps 无训练…

OSPF实验:外部路由引入

OSPF外部路由引入实验目的&#xff1a;除了内部通信外&#xff0c;企业还需要与外部网络进行通信&#xff0c;不同企业网络之间存在互访需求。假设A公司网络部署OSPF协议实现内部通信&#xff0c;因业务发展&#xff0c;需要访问B公司的一台WEB服务器。网络拓扑图&#xff1a;公…

网络上那些在线 PDF 转换工具安全吗?转换 PDF 需要注意什么

PDF 格式凭借跨设备兼容、格式稳定的优势&#xff0c;早已成为个人办公、企业协作中不可或缺的文件格式。无论是压缩 PDF 以满足邮件附件大小限制&#xff0c;还是将 Word 文档转成 PDF 确保排版不变&#xff0c;我们总能遇到需要 PDF 工具的场景。也正因如此&#xff0c;网上涌…

生成对抗网络(GAN)

目录 1 引言 2 生成对抗网络的基本原理 2.1 生成器与判别器 2.2 对抗训练过程 2.3 与传统生成模型的比较 3 GAN的衍生模型 3.1 架构创新与深度卷积GAN 3.2 损失函数优化与Wasserstein GAN 3.3 条件生成与可控合成 3.4 跨域转换与CycleGAN 3.5 高分辨率生成与规模化演…

Vue 3.6 Alien Signals:让响应式性能飞跃式提升

概述 Vue 3.6 引入了革命性的 Alien Signals 技术&#xff0c;这是一种全新的响应式系统&#xff0c;基于细粒度响应式原理&#xff0c;为 Vue 应用带来了前所未有的性能提升和开发体验优化。 什么是 Alien Signals&#xff1f; Alien Signals 是 Vue 3.6 内置的轻量级响应式…

React Hooks 报错?一招解决useState问题

文章目录问题分析问题 在使用import { useState } from "react";时报错&#xff1a;Youre importing a component that needs useState. This React Hook only works in a Client Component. To fix, mark the file (or its parent) with the “use client” direct…

数据集成平台怎么选?从ETL到CDC再到iPaaS的全景对比

前言&#xff1a;一个制造企业的真实困境 近期在为某家制造企业做系统改造时&#xff0c;我们遇到了一个典型的数据集成难题。这家企业运营着独立的ERP、CRM和MES等30业务系统&#xff0c;看似完备的信息化基础却存在严重的数据割裂问题。 销售团队在CRM中查看的库存数据总是滞…

驱动开发系列72 - GLSL编译器实现 - 指令选择(二)

前面介绍过,在指令选择时会执行一系列优化过程,本节介绍下“比特级常量传播优化”的实现。 一:什么是比特级常量传播优化 举一个GLSL语言例子: #version 450layout(location = 0) in vec4 inColor; layout(location = 0) out vec4 outColor;void main() {vec4 tmp = inCo…

Redis(缓存)

一 什么是缓存1. 生活上的例子比如有一个行李箱和一个手机&#xff0c;每次把手机放到行李箱在拿出来肯定很麻烦&#xff0c;如果放到裤兜里就会方便很多&#xff0c;所以裤兜算作行李箱的一个缓存&#xff0c;不仅仅是裤兜&#xff0c;甚至可以一直拿在手上等其他有存储介质的…

openssl简介

一、openssl是什么 OpenSSL是一个开源的、功能强大的软件库和工具包,它实现了传输层安全(TLS) 和安全套接层(SSL) 协议以及一个全面的密码学原语库。它是用 C 语言编写的,为其带来了高性能和跨平台的特性。 作为库(Library):开发者可以将其代码集成到自己的应用程序(…

左值引用与右值引用

左值和右值 左值&#xff08;lvalue&#xff09;&#xff1a;在表达式结束后仍然存在&#xff0c;可以取地址。简单理解&#xff1a;有名字、有存储位置。 比如变量、数组元素、对象等。 右值&#xff08;rvalue&#xff09;&#xff1a;临时值&#xff0c;表达式结束后就消失&…

中小企业SAP B1 HANA部署全解析:成本与云端优势

目录 云端部署成本构成与效益分析 软件许可费 硬件成本 服务费 培训费 技术优势 快速部署 弹性扩展 高可用性 云端部署适用场景 IT预算有限的中小企业 分布在不同地区的机构 需要快速上线的情况 本地部署适用场景 数据监管严格的行业 拥有完善IT基础设施企业 …

Django Channels实战:WebSocket实时通信开发

在当今Web应用开发中&#xff0c;实时通信功能已成为提升用户体验的关键要素。传统的HTTP请求-响应模式难以满足即时聊天、实时通知、协同编辑等场景的需求。本文将深入探讨如何利用Django Channels框架实现WebSocket通信&#xff0c;为你的Django项目添加实时交互能力。为什么…

大数据毕业设计选题推荐-基于大数据的懂车帝二手车数据分析系统-Spark-Hadoop-Bigdata

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…