首页 > 其他分享 >Terraform 模块重用资源 (8)

Terraform 模块重用资源 (8)

时间:2023-09-08 17:03:20浏览次数:51  
标签:name 重用 server Terraform 模块 ssh key type

模块重用资源介绍

Terraform 模块可以简化代码,减少代码重复的内容。使用 Terraform 模块可以重用基础设施资源。

在 Terraform 本身看来模块只不过是一个或多个资源的容器。通过 Terraform 的模块机制,对想要重用的资源进行封装,即可在别处像函数一样方便的调用。


模块代码结构

通过调用 modules 目录下的模块进行重用资源。

% tree modules 
modules
|-- base-server						// 基础服务器的模块
|   |-- main.tf						// 模块中用来管理一个或多个基础设施资源
|   |-- outputs.tf				// 模块的输出,相当于通用编程语言中的返回值。
|   `-- variables.tf			// 模块的输入,相当于通用编程语言中,函数的参数
`-- perp-ssh							// ssh 相关的模块,包括添加 ssh 公钥,开放 22 端口。
    |-- main.tf
    |-- outputs.tf
    `-- variables.tf



模块 main代码

基础服务模块 main代码

base-server/main.tf 内容

创建 EC2 实例,获取安全组ID,开放其他端口。

/*
* 基础设施模块
*/

# 数据源获取安全组ID
data "aws_security_groups" "default" {
  filter {
    name = "group-name"
    values = ["default"]
  }
}


# 创建EC2实例
resource "aws_instance" "server" {
  ami = lookup(var.amis, var.region)
  instance_type = var.instance_type
  key_name = var.ssh_key_name
  user_data = var.server_script
  tags = {
    Name = var.server_name
  }
}


# 开放其他端口
resource "aws_security_group_rule" "other" {
  type = "ingress"
  from_port = var.server_port
  to_port = var.server_port
  protocol = "tcp"
  cidr_blocks = [ "0.0.0.0/0" ]
  security_group_id = data.aws_security_groups.default.ids[0]
}



Perp 设施模块 main代码

perp-ssh/main.tf 内容

获取安全组ID,创建 SSH 登陆密钥,开放22端口。

/*
* 准备 SSH
*/

# 数据源获取安全组ID
data "aws_security_groups" "default" {
  filter {
    name = "group-name"
    values = ["default"]
  }
}


# 添加 SSH 登陆密钥
resource "aws_key_pair" "ssh" {
  key_name = "admin"
  public_key = file(var.public_key)
}

# 开放 22 端口,允许 SSH 登陆
resource "aws_security_group_rule" "ssh" {
  type = "ingress"
  from_port = 22
  to_port = 22
  protocol = "tcp"
  cidr_blocks = [ "0.0.0.0/0" ]
  security_group_id = data.aws_security_groups.default.ids[0]
}


模块输入

和通用编程语言中的函数具有参数相似,Terraform 模块也支持传递参数。为了使 Terraform 模块能够使用参数,只需利用 variables 文件为他什么数据变量即可。

下面代码中不包含默认的值,因而在调用模块的时候,才能传递参数。


基础服务模块 variables代码

base-server/variables.tf 内容

variable "region" {
  type = string
  description = "aws region"
}

variable "amis" {
  type = map
  description = "ami id"
}

variable "instance_type" {
  type = string
  description = "ec2 instance type"
}

variable "ssh_key_name" {
  type = string
  description = "ssh key name"
}

variable "server_name" {
  type = string
  description = "service name"
}

variable "server_port" {
  type = string
  description = "server port"
}

variable "server_script" {
  type = string
  description = "server post run script"
}



Perp 设施模块 variables代码

perp-ssh/variables.tf 内容

variable "public_key" {
  type = string
  description = "ssh public key"
}



模块输出

Terraform 模块输出的概念来自通用编程语言中函数具有返回值的想法。跟模块输入相似。只要为 Terraform 模块定义输出变量即可实现模块输出。


基础服务模块 outputs代码

base-server/outputs.tf 内容

输出基础设施的IP地址

output "ip" {
  value = aws_instance.server.public_ip
  description = "aws ec2 public ip"
}



Perp 设施模块 outputs代码

perp-ssh/outputs.tf 内容

方便其他地方引用该模块的输出属性。

output "key_name" {
  value = aws_key_pair.ssh.key_name
  description = "ssh key name"
}



模块调用

定义完成模块之后,调用模块需要使用 Terraform 提供的 module 代码块。


主服务 main代码

main.tf 内容

/*
 * 使用基础设施服务调用
*/

# 供应商
provider "aws" {          // 云供应商
  region = var.region     // 地域
}

# 调用模块,创建 ssh key
module "ssh-key-name" {
  source = "./modules/perp-ssh"

  public_key = var.public_key
}

#调用模块创建服务器 nginx
module "nginx-server" {                   // "nginx-server" 为模块名称
  source = "./modules/base-server"        // 指定本地模块路径,或者远程模块的地址
  
  server_name = "nginx-server"            // 服务器名称
  server_port = 80                        // 开放的服务器端口
  server_script = templatefile("setup-nginx.sh", { time = timestamp()})   //服务器创建后执行的脚本
  region = var.region
  amis = var.amis
  instance_type = var.instance_type
  ssh_key_name = module.ssh-key-name.key_name
}


#调用模块创建服务器 ss
module "ss-server" {
  source = "./modules/base-server"
  
  server_name = "ss-server"
  server_port = 8388
  server_script = templatefile("setup-ss.sh", { password = var.ss_password})
  region = var.region
  amis = var.amis
  instance_type = var.instance_type
  ssh_key_name = module.ssh-key-name.key_name
}



主服务 variables代码

variables.tf 内容

variable "region" {             //  变量名 region,不可用重复。花括号里面是参数
  type = string                 //  输入变量的类型
  default = "us-west-2"         //  变量的默认值
  description = "AWS region"    //  变量的描述
}

variable "amis" {
  type = map
  default = {
    us-west-2 = "ami-03f65b8614a860c29"  // ubuntu ami
  }
  description = "AWS ID"
}

variable "instance_type" {
  type = string
  default = "t2.micro"
  description = "EC2 instance type"
}

variable "public_key" {
  type = string
  default = "id_rsa.pub"
  description = "SSH public key"
}

variable "ss_password" {
  type = string
  description = "ss password"
}


主服务 outputs代码

outputs.tf 内容

这里不再引用资源的属性,而是模块的输出。

output "WEB_IP" {
  value = module.nginx-server.ip        // 这里引用模块的输出
  description = "nginx web server ip address"
}

output "SS_IP" {
  value = module.ss-server.ip
  description = "shadowsocks server ip address"
}


setup-ss.sh脚本

setup-ss.sh 内容

sudo apt update
sudo apt install -y docker.io

cat > /vat/tmp/ss-config.json <<EOF
{
    "server": "0.0.0.0",
    "server_port": 8388,
    "local_port": 1080,
    "password": "${password}",
    "timeout": 600,
    "method": "chacha20-ietf-poly1305",
    "fast_open": true
}
EOF

sudo docker run \
    -v /var/tmp:/var/tmp \
    -e ARGS='-c /var/tmp/ss-config.json' \
    -p 8388:8388 \
    -p 8388:8388/udp \
    -d \
    shadowsocks/shadowsocks-libev


setup-nginx.sh脚本

setup-nginx.sh 内容

#!/bin/bash

sudp apt update
sudo apt install -y nginx
echo Cerated: ${time} | sudo tee  /usr/share/nginx/html/index.html
exit 0

ubuntu 系统的index文件可能不是这个路径。


Terraform 部署

初始化 Terraform

首先执行命令 terraform init 初始化 terraform 以便让 terraform 下载或更新 模块。

% terraform init

Initializing the backend...
Initializing modules...
- nginx-server in modules/base-server
- ss-server in modules/base-server
- ssh-key-name in modules/perp-ssh

...

init 了上面上个服务调用的两个模块,


Apply 部署

% terraform plan
% terraform apply

  Enter a value: Wsj@123456
  Enter a value: yes
...

Apply complete! Resources: 6 added, 0 changed, 0 destroyed.

Outputs:

SS_IP = "35.91.219.161"
WEB_IP = "54.188.38.201"



验证

Terraform 模块重用资源 (8)_Terraform

这里还需要验证一下nginx页面,和ss容器启动情况。




使用外部模块

虽然编写 Terraform 模块并不复杂,如果有人已经分享了我们想要使用的模块,那么可以直接使用。

Terraform 除了可以保存到代码仓库之外,Terraform本身也提供了 Terraform Registry ,这是一个用来公开分发 Terraform 模块的平台,有官方和社区分享的多种模块。包括AWS,Google Cloud,阿里云等。


搜索模块

搜索 ec2-instance 选择 Modules 。

Terraform 模块重用资源 (8)_Terraform_02


模块首页:

Terraform 模块重用资源 (8)_Terraform_03

查看示例代码:

Terraform 模块重用资源 (8)_Terraform_04


使用远程模块

main.tf代码如下:

/*
*   使用外部模块
*/

provider "aws" {
  region = "us-west-2"
}

# 调用外部模块
module "ec2-instance" {
  source = "terraform-aws-modules/ec2-instance/aws"     // terraform registry 的地址
  version = "5.5.0"                                     // 模块版本

  ami = "ami-03f65b8614a860c29"                         // ec2 参数
  instance_type = "t2.micro"
  name = "myec2"
  vpc_security_group_ids = ["sg-572b3b6c"]
}


执行初始化部署

terraform init
terraform plan
terraform apply


查看

Terraform 模块重用资源 (8)_modules_05


标签:name,重用,server,Terraform,模块,ssh,key,type
From: https://blog.51cto.com/u_11060853/7411583

相关文章

  • 树莓派加挂实时时钟芯片PCF8563模块
    硬件:树莓派4B,PCF8563模块树莓派系统版本::~$lsb_release-aNoLSBmodulesareavailable.DistributorID:RaspbianDescription:RaspbianGNU/Linux10(buster)Release:10Codename:buster 在开始之前需要确认自己手里的芯片是PCF8563还是PCF8583,......
  • 平台的管理角色的划分、功能模块的划分、权限的划分等
    平台当前,总共有以下几种角色:A.系统管理员:拥有所有模块的最高权限B.普通管理员:细分为:教务管理员学籍管理员系部管理员宿舍管理员、催起管理员学生处管理员后勤管理员就业处管理员班主任授课老师C.学生每个角色拥有各自应用模块的应有权限。各个模块的角色分配......
  • 视频监控/安防监控/视频云存储EasyCVR平台设备分配模块升级详解
    安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台支持将部署在监控现场的前端设备进行统一集中接入,可兼容多协议、多类型设备,管理员可选择任意一路或多路视频实时观看,视频画面支持单画面、多画面显示,视频窗口数量有1、4、9、16个可选,还能支持视频轮巡播放。平台分发的视频流......
  • Terraform 通过 Provisioner 配置服务器 (7)
    Provisioner介绍当虚拟服务器创建完成后,通常需要执行一些初始化的操作。例如:安装软件,配置系统,服务等。在前面的案例中使用云商的user_data用户数据来执行shell脚本来安装nginx服务器。Terraform也提供了Provisioner来完成这种场景。通过Provisioner可以在基础设施资源......
  • 无法找到模块“element-plus/dist/locale/zh-cn.mjs”的声明文件
    VUE报错如下无法找到模块“element-plus/dist/locale/zh-cn.mjs”的声明文件。“e:/visualstudio_code/emppre/node_modules/element-plus/dist/locale/zh-cn.mjs”隐式拥有“any”类型。如果“element-plus”包实际公开了此模块,请尝试添加包含declaremodule‘element-plus/di......
  • 使用re模块的正则表达式 将r'\n ', '[', ']'等剔除
    使用re模块的正则表达式将字符串"['移动类型',\n'物料号',\n'物料描述',\n'批次号',\n'卷号(箱号)',\n'数量',\n'基本计量单位',\n'发料库存地',\n'工厂',\n'记帐日期',\n'凭证日期',\n&......
  • 视频监控/安防监控/视频云存储EasyCVR平台设备分配模块升级详解
    安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台支持将部署在监控现场的前端设备进行统一集中接入,可兼容多协议、多类型设备,管理员可选择任意一路或多路视频实时观看,视频画面支持单画面、多画面显示,视频窗口数量有1、4、9、16个可选,还能支持视频轮巡播放。平台分发的视频流......
  • SQLAlchemy模块
    1、执行原生SQLfromsqlalchemyimportcreate_engine,text#创建engine对象engine=create_engine("sqlite:///demo.db",echo=False)withengine.connect()ascon:#先删除persons表con.execute(text('droptableifexistspersons'))#创建一......
  • 【错误记录】Android Studio 创建 Module 模块报错 ( Cannot resolve external depend
    文章目录一、报错信息二、解决方案目前使用的是最新的Gradle配置,创建Module生成的源码与Gradle配置出现了冲突,导致的问题;解决此类问题,要仔细检查Gradle构建脚本,排查每个依赖库的来源;本次错误就是AS系统自动成的Module修改了Gradle构建脚本,导......
  • 软件测试|Python random模块,超乎想象的强大
    Python的random模块是一个非常强大的工具,用于生成随机数和随机选择。它提供了许多函数和方法,可以满足各种随机化需求。本文将介绍random模块的基本功能和常见用法,以帮助读者更好地理解和利用这个模块。返回整数random.randange()语法如下:random.randrange(stop)random.ran......