Terraform 通过 Provisioner 配置服务器

2024-04-12 00:20

本文主要是介绍Terraform 通过 Provisioner 配置服务器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Provisioner 介绍

当虚拟服务器创建完成后,通常需要执行一些初始化的操作。例如:安装软件,配置系统,服务等。

在前面的案例中使用云商的 user_data 用户数据来执行 shell 脚本来安装 nginx 服务器。

Terraform 也提供了 Provisioner 来完成这种场景。通过 Provisioner 可以在基础设施资源创建或销毁时,执行定制化的操作。 Provisioner 可以于 ansible,puppet,saltstack 配置管理工具结合使用,利用现有的配置管理工具管理资源。

Provisioner 使用案例

使用 Provisioner 购买基础设施并搭建一个服务。使用3个文件

mian.tf

/*创建 AWS EC2 实例运行 Docker 容器
*/# 供应商
provider "aws" {          // 云供应商region = var.region     // 地域
}// 数据源
data "aws_security_groups" "default" {  // 数据源为"aws_security_groups",数据源名称"default"filter {name = "group-name"                 // 过滤 group_name = default 的安全组values = ["default"]}
}// 创建 EC2 实例,运行 docker 容器
resource "aws_instance" "ss" {  ami = lookup(var.amis, var.region)    # 配置参数,ami的id。instance_type = var.instance_type     # 配置参数,启动的ec2的类型,t2.micro是免费的key_name = aws_key_pair.ssh.key_name  # 引用了 aws_key_pair ssh 中的 key_name。于EC2实例绑定,实现可以ssh的目的。tags = {    # 将EC2 实例命名为 "ss-server"Name = "ss-server"}# 连接远程服务器connection {type = "ssh"user = "ubuntu"private_key = file("id_rsa")host = aws_instance.ss.public_ip}# 安装 docker 并运行 ss 容器provisioner "remote-exec" {inline = ["sudo apt update","sudo apt install -y docker.io","sudo docker run -e PASSWORD=${var.ss_password} -p 8388:8388 -p 8388:8388/udp -d shadowsocks/shadowsocks-libev",]}
}# 添加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 = 22to_port = 22protocol = "tcp"cidr_blocks = ["0.0.0.0/0"]security_group_id = data.aws_security_groups.default.ids[0]   // 调用数据源的信息,列表的第一个值
}// 开放80端口,允许WEB访问   
resource "aws_security_group_rule" "web" {type = "ingress"from_port = 8388to_port = 8388protocol = "all"cidr_blocks = ["0.0.0.0/0"]security_group_id = data.aws_security_groups.default.ids[0]
}

variables.tf

# variables.tfvariable "region" {             //  变量名 region,不可用重复。花括号里面是参数type = string                 //  输入变量的类型default = "us-west-2"         //  变量的默认值description = "AWS region"    //  变量的描述
}variable "amis" {type = mapdefault = {us-west-2 = "ami-03f65b8614a860c29"  // ubuntu ami}description = "AWS ID"
}variable "instance_type" {type = stringdefault = "t2.micro"description = "EC2 instance type"
}variable "public_key" {type = stringdefault = "id_rsa.pub"description = "SSH public key"
}variable "ss_password" {type = stringdescription = "ss password"
}

outputs.tf

output "IP" {value = aws_instance.ss.public_ipdescription = "AWS EC2 public IP"
} 

connection 连接

connection 块告诉 Terraform 用什么方式与远端机器进行通讯。

# 连接远程服务器
connection {type = "ssh"                                            # 连接方式user = "ec2-user"                                    # 远程服务器的服务名private_key = file("id_rsa")            # 配置使用ssh密钥登陆。也可以使用password登陆host = aws_instanc.ss.public_ip        # 远端服务器的IP地址
}

provisioner remote-exec 执行命令

登陆到服务器上之后,要关注 Terraform 执行的操作。本案例是在服务器上安装 docker,在docker上运行一个镜像服务。

inline参数支持接受一个命令列表。EC2实例创建完成后,按顺序执行命令列表中的命令。

# 安装 docker 并运行 ss 容器

provisioner "remote-exec" {inline = ["sudo apt update","sudo apt install -y docker.io","sudo docker run -e PASSWORD=${var.ss_password} -p 8388:8388 -p 8388:8388/udp -d shadowsocks/shadowsocks-libev",]
}

除了inline参数,provisioner还支持 script 和 scripts 参数,后两者支持执行脚本,这三个参数是互斥的只能使用一个参数。

Provisioner 部署
$ cp ~/.ssh/id_rsa* .$ terraform plan$ terraform apply
var.ss_passwordss passwordEnter a value: Wsj@123456...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...

提交代码

git add .
git commit -m "using remote-exec"


Provisioner file 上传文件

使用 Provisioner file 完成服务的定制化配置。

新建安装服务的配置文件模板

其中${server} 和 ${password} 是变量,由 terraform apply 的时候渲染。

$ cat ss-config.json{"server": "${server}","server_port": 8388,"local_port": 1080,"password": "${password}","timeout": 600,"method": "chacha20-ietf-poly1305","fast_open": true
}
将配置文件上传到服务器上

新增了 provisioner "file" {} 代码块。可以将文件上传到服务器上。分别定义了文件内容和文件保存路径。

修改了 docker run 命令,运行 docker 的时候将本地路径挂载到 docker 容器里面。

# main.tf
...// 创建 EC2 实例,运行 docker 容器
resource "aws_instance" "ss" {  ami = lookup(var.amis, var.region)    # 配置参数,ami的id。instance_type = var.instance_type     # 配置参数,启动的ec2的类型,t2.micro是免费的key_name = aws_key_pair.ssh.key_name  # 引用了 aws_key_pair ssh 中的 key_name。于EC2实例绑定,实现可以ssh的目的。tags = {    # 将EC2 实例命名为 "ss-server"Name = "ss-server"}# 连接远程服务器connection {type = "ssh"user = "ubuntu"private_key = file("id_rsa")host = aws_instance.ss.public_ip}# 上传文件到服务器provisioner "file" {content =  templatefile("ss-config.json", { server = aws_instance.ss.public_ip, password = var.ss_password }) // 文件内容destination = "/var/tmp/ss-config.json"  // 远端服务器的文件路径}# 安装 docker 并运行 ss 容器provisioner "remote-exec" {inline = ["sudo apt update","sudo apt install -y docker.io","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",]}
}
...
Provisioner 部署
% terraform apply
var.ss_passwordss passwordEnter a value: Wsj@123456
查看docker进程
% ssh ubuntu@18.237.89.77 sudo docker psCONTAINER ID   IMAGE                           COMMAND                  CREATED          STATUS          PORTS                                                                                  NAMES
ab71ac7234fd   shadowsocks/shadowsocks-libev   "/bin/sh -c 'exec ss…"   36 seconds ago   Up 34 seconds   0.0.0.0:8388->8388/tcp, 0.0.0.0:8388->8388/udp, :::8388->8388/tcp, :::8388->8388/udp   trusting_nobel
提交代码
git add .
git commit -m "using file provisioner"

这篇关于Terraform 通过 Provisioner 配置服务器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/895583

相关文章

SpringBoot3.4配置校验新特性的用法详解

《SpringBoot3.4配置校验新特性的用法详解》SpringBoot3.4对配置校验支持进行了全面升级,这篇文章为大家详细介绍了一下它们的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以参考... 目录基本用法示例定义配置类配置 application.yml注入使用嵌套对象与集合元素深度校验开发

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

如何为Yarn配置国内源的详细教程

《如何为Yarn配置国内源的详细教程》在使用Yarn进行项目开发时,由于网络原因,直接使用官方源可能会导致下载速度慢或连接失败,配置国内源可以显著提高包的下载速度和稳定性,本文将详细介绍如何为Yarn... 目录一、查询当前使用的镜像源二、设置国内源1. 设置为淘宝镜像源2. 设置为其他国内源三、还原为官方

CentOS7更改默认SSH端口与配置指南

《CentOS7更改默认SSH端口与配置指南》SSH是Linux服务器远程管理的核心工具,其默认监听端口为22,由于端口22众所周知,这也使得服务器容易受到自动化扫描和暴力破解攻击,本文将系统性地介绍... 目录引言为什么要更改 SSH 默认端口?步骤详解:如何更改 Centos 7 的 SSH 默认端口1

Maven的使用和配置国内源的保姆级教程

《Maven的使用和配置国内源的保姆级教程》Maven是⼀个项目管理工具,基于POM(ProjectObjectModel,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告... 目录1. 什么是Maven?2.创建⼀个Maven项目3.Maven 核心功能4.使用Maven H

SpringBoot多数据源配置完整指南

《SpringBoot多数据源配置完整指南》在复杂的企业应用中,经常需要连接多个数据库,SpringBoot提供了灵活的多数据源配置方式,以下是详细的实现方案,需要的朋友可以参考下... 目录一、基础多数据源配置1. 添加依赖2. 配置多个数据源3. 配置数据源Bean二、JPA多数据源配置1. 配置主数据

Spring 基于XML配置 bean管理 Bean-IOC的方法

《Spring基于XML配置bean管理Bean-IOC的方法》:本文主要介绍Spring基于XML配置bean管理Bean-IOC的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录一. spring学习的核心内容二. 基于 XML 配置 bean1. 通过类型来获取 bean2. 通过

springboot上传zip包并解压至服务器nginx目录方式

《springboot上传zip包并解压至服务器nginx目录方式》:本文主要介绍springboot上传zip包并解压至服务器nginx目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录springboot上传zip包并解压至服务器nginx目录1.首先需要引入zip相关jar包2.然