首页 > 其他分享 >现代IT基础设施管理(2):Terraform进阶

现代IT基础设施管理(2):Terraform进阶

时间:2024-11-11 22:45:25浏览次数:1  
标签:进阶 示例 虚拟机 配置 Terraform 实例 tf 基础设施

上一篇对Terraform进行了简单介绍,并尝试一个创建虚拟机实例的演示实验,对IaC(基础设施即代码)有了初步的认识,这一篇我们稍微深入一些,继续对Terraform进行进阶尝试,使用高级特性更安全高效管理基础设施,尽量还原实际生产使用。

代码仓库地址:https://github.com/robin-2016/terraform-demo,如果没有克隆到本地的,先克隆代码仓库到本地,如之前克隆过,请将代码更新到最新。

一、变量

Terraform支持变量,变量使用场景一般为下面几种情况,一个配置需要多次引用,经常需要修改的配置,还有像AK和SK等敏感信息需要单独文件保存,一般情况是单独保存在名为vars.tf文件中,这样修改时只修改vars.tf一个文件即可,demo2就是这样的示例,将AK、SK、区域、镜像ID和实例规格等都放在vars.tf文件中,根据类型分别放在不同的配置文件中,归类方便在配置较多时能较快找到对应的配置信息,在其他配置文件中通过var.加上具体变量名称就能引用到变量的值。vars.tf部分内容如下:

variable "AWS_ACCESS_KEY" {
  type        = string
  default     = ""
}
variable "AWS_SECRET_KEY" {
  type        = string
  default     = ""
}
variable "AWS_REGION" {
  type        = string
  default     = "ap-east-1"
}
variable "AMI" {
  type        = string
  default     = "ami-0ad7f83eab34d93a7"
}
variable "INSTANCE_TYPE" {
  type        = string
  default     = "t3.micro"
}

例如AWS_ACCESS_KEY变量,值的内容为default字段,type为变量类型,示例中变量都是string字符串类型,Terraform变量还支持number数值类型、true-false布尔类型、list列表类型和map字典类型,本次示例中只演示了字符串类型使用,其他类型请参考下面官网文档链接使用:https://developer.hashicorp.com/terraform/tutorials/configuration-language/variables

二、生产环境示例

切换到demo-2目录下,根据资源类型,将配置拆分到不同的配置文件中。

目录文件介绍:instance.tf是虚拟机实例配置,provider.tf是供应商配置,vars.tf是变量,key.tf是实例ssh密钥,相比密码,密钥安全性更高,securitygroup.tf是安全组配置,允许访问ssh服务,output.tf是执行结束输出配置,这里配置是创建实例的公网IP地址,user_data.tftpl是虚拟机初始化脚本模版文件,下部分会详细讲解,vpc.tf是虚拟网络配置,versions.tf是供应商版本配置信息,这样根据需求只修改对应内容文件即可。

准备工作,这里主要修改是vars.tf,填写AWS的AK和SK对应到AWS_ACCESS_KEY和AWS_SECRET_KEY,再生成密钥对文件,使用下面命令生成:

ssh-keygen -f mykey

准备工作完成,正式开始创建资源,步骤和上一讲相同

#初始化
terraform init
#查看执行计划
terraform plan
#应用,创建资源
terraform apply

执行完成后会在最后Outputs部分输出虚拟机示例的公网IP地址,之后能使用下面ssh命令远程连接虚拟机示例了:

ssh -i mykey ubuntu@公网IP

注:如果没有连接上,可以等一会再尝试,安装配置软件需要一点时间,本示例使用Ubuntu镜像,用户名为ubuntu是镜像默认用户名,使用其他镜像需根据镜像调整。

登录后查看服务状态,nginx已经启动,并已开启80端口,登录上AWS控制台,实例、VPC、安全组、密钥对都已经配置完成。这里只是简单演示,实际会更复杂。

systemctl status nginx
ss -ntlp

三、user data

上面示例中,使用的公共镜像创建虚拟机实例,最终完成时却已安装nginx,使用的就是user data,在云上创建虚拟机实例时,都会在虚拟机创建完成的首次启动执行user_data中的命令进行初始化,之后虚拟机实例再启动不会再执行,这样就能使用user_data功能完成对虚拟机的初始化,下面为demo-2中user_data.tftpl内容,和普通bash脚本内容基本相同,示例中主要是安装并启动了nginx,还可以写更复杂,模版文件还支持变量输入,自行学习探索。

#!/bin/bash

sudo apt update 
sudo apt install nginx -y
sudo systemctl start nginx

另一个方式是Packer自定义镜像,提前安装需要应用环境,Packer还可以和Jenkins等CI持续集成工具结合,Packer配置变化后,重新执行流水线构建新的自定义镜像。

推荐使用user data方式,基本云环境都支持user data,减少不再依赖三方工具,更好管理,自定义镜像方式启动快一些,可以根据实际需要自行选择。

四、模块

上面是所有配置都是自己写,如果想抽出部分作为公共配置,供其他项目引用,或者环境不同,但配置相同,只是变量不同,会存在许多重复配置,这样情况下就需要用到Terraform的模块,我们可以直接引用模块写更少的配置文件,官网模块地址:https://registry.terraform.io/browse/modules,官方提供了许多模块供开发者引用,也可以自定义模块使用,一些第三方同样提供模块。在demo-3中,我们通过dev开发环境和prod生产环境区分,引用官方实例模块来创建实例,内容示例:

module "ec2_instance" {
  source  = "terraform-aws-modules/ec2-instance/aws"

  name = "demo-3-prod"

  instance_type          = "t3.micro"
  key_name               = "mykeypair"
  monitoring             = true
  vpc_security_group_ids = ["sg-12345678"]
  subnet_id              = "subnet-eddcdzz4"

  tags = {
    Terraform   = "true"
    Environment = "prod"
  }
}

五、相关生态开源工具:Infisical密钥管理平台

使用Terraform时,会有AK和SK管理问题,如直接存储在配置文件中有泄露的风险,不存储在配置文件中每次使用都需要人工配置,多人使用,还需要相互传递,官方有对应收费版本的HCP Terraform,功能齐全,不差钱可以直接使用HCP Terraform。

如果想降低成本,又想提高安全性和便利性,使用开源项目就是非常不错的选择,Infisical 是开源密钥管理平台,GitHub地址:https://github.com/Infisical/infisical,产品定位:在您的团队/基础设施中同步密钥,防止密钥泄漏,非常合适搭配Terraform使用,并提供内部 PKI,有Python、Go、Java等编程语言SDK,同样适用于普通程序开发中需要用到一些敏感信息的地方

对于Terraform就介绍到这里,相信你对于Terraform已经有更深的了解,自己动手实操起来,阅读官网文档,定能熟练使用Terraform。如果对你有帮助,请点个关注,如果需要定制Terraform详细教程请留言咨询,嘿嘿。

标签:进阶,示例,虚拟机,配置,Terraform,实例,tf,基础设施
From: https://www.cnblogs.com/robindevnotes/p/18540735

相关文章

  • 线程进阶篇4:如何用Executors工具类创建线程池-代码演示-源码分析-可行性分析,对比new T
        本篇文章主要是讲解如何使用Executors工具类创建线程池,看本篇之前建议同学们先去看看我发布的上一篇文章,即用newThreadPoolExecutor()来创建线程池,里面讲解了线程池的参数使用方法和场景,熟悉了之后再来学习这一篇会更容易理解一些!因为Executors只是一个工具类,底层......
  • 现代IT基础设施管理(1):Terraform初识和小试牛刀
    基础设施包括各种云,像国内的阿里云、腾讯云和华为云,国外的AWS、微软Azure云和谷歌云,还有Kubernetes和OpenStack,都可以用Terraform进行资源管理。使用基础设施即代码(InfrastructureasCode,IaC)的方式来管理基础设施,这是现代IT基础设施管理的一个重要趋势,它允许我们以代码的形式定......
  • 【前端】Typescript从入门到进阶
    以下是TypeScript的常用知识点总结,涵盖了从基础到入门的内容,并配有代码示例:1.TypeScript基础 1.1安装和配置安装TypeScript并初始化配置文件:npminstall-gtypescripttsc--init 1.2基本类型TypeScript提供的基本类型有`number`、`string`、`boolean`、`......
  • Python小白学习教程从入门到入坑------第二十九课 访问模式(语法进阶)
    目录一、访问模式1.1 r1.2 w1.3 + 1.3.1r+1.3.2w+1.3.3a+1.4a一、访问模式模式可做操作若文件不存在是否覆盖r只能读报错-r+可读可写报错是w只能写创建是w+可读可写创建是a只能写创建否,追加写a+可读可写创建否,追加写1.1 rr:只读模式(默认模式),文件......
  • Python小白学习教程从入门到入坑------第三十课 文件定位操作(语法进阶)
    一、文件指针python中严格来说没有指针这个说法,但有指针这个用法的体现。指针概念常用于c语言、c++语言中在Python的文件操作中,文件指针(也称为文件游标或文件句柄的位置)是一个内部标记,它指示了当前文件操作的读写位置,文件指针在打开文件时初始化,并随着文件的读写操作而移动......
  • 精准投放新利器!谷歌应用广告的受众信号进阶功能来了!
    深入解读“受众信号进阶功能”优化指南大家好,我是App出海AI阿联,欢迎关注,全网同名。一、背景与定义“受众信号进阶功能”(AudienceSignal)是谷歌推出的一项全新功能,主要适用于希望提升广告效果的应用推广(AppCampaignforInstalls,简称ACi)广告主。通过引入谷歌数据源......
  • swoole,websocket服务器(协程风格)--进阶篇
        swoole的websocket服务器(协程风格)示例真不算友善,从头了解到尾,那还好,但是谁有那么多时间从头到尾了解。示例不够针对性,写websocket就该单独写websocket的东西,偏偏又加上http的东西。这里我来解读一下websocket服务器(协程风格)示例<?php  useSwoole\Http\Reque......
  • LangGraph进阶:条件边与工具调用Agent实现
    在前两篇文章中,我们讨论了LCEL和AgentExecutor的局限性,以及LangGraph的基础概念。今天,我们将深入探讨LangGraph的高级特性,重点关注条件边的使用和如何实现一个完整的工具调用Agent。条件边的高级用法条件边是LangGraph中最强大的特性之一,它允许我们基于状态动态决定执行流......
  • JavaScript语法进阶:事件监听与处理
    一、概述事件定义了用户与网页交互时产生的各种操作。例如,单击按钮时,就产生一个事件,告诉浏览器发生了需要进行处理的单击操作。为了使对象能够对某一事件做出响应,就必须编写事件处理函数。事件处理函数是一段独立的程序代码,它在对象检测到某个特定事件时执行(响应该事件)。一个......
  • 如果你搞不懂排序,看这篇文章就对了,初学者也看得懂,其三:进阶插入排序——希尔排序
    目录一.希尔排序1.1希尔排序的原理1.2希尔排序的代码思路1.3希尔排序的代码实现1.1希尔排序的原理希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重......