首页 > 其他分享 >Terraform 通过 Provisioner 配置服务器 (7)

Terraform 通过 Provisioner 配置服务器 (7)

时间:2023-09-07 17:31:39浏览次数:33  
标签:8388 ss aws Terraform key Provisioner var 服务器 docker

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 = 22
  to_port = 22
  protocol = "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 = 8388
  to_port = 8388
  protocol = "all"
  cidr_blocks = ["0.0.0.0/0"]
  security_group_id = data.aws_security_groups.default.ids[0]
}


variables.tf

# 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.tf

output "IP" {
  value = aws_instance.ss.public_ip
  description = "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_password
  ss password

  Enter 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_password
  ss password

  Enter a value: Wsj@123456


查看docker进程

% ssh [email protected] sudo docker ps

CONTAINER 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"


标签:8388,ss,aws,Terraform,key,Provisioner,var,服务器,docker
From: https://blog.51cto.com/u_11060853/7399190

相关文章

  • 云服务器——安装Maven
    1.首先新建一个maven文件夹用于下载maven安装包,可采用直接官网下载压缩包上传至服务器,也可以采用wget直接下载,这里采用wget下载wgethttps://archive.apache.org/dist/maven/maven-3/3.8.2/binaries/apache-maven-3.8.2-bin.tar.gz2.下载完之后解压缩tar-zxvfapache-maven-3.......
  • 用友NC Cloud FS文件服务器SQL注入
    漏洞描述用友NCCloudFS文件管理登录页面对用户名参数没有过滤,存在SQL注入。漏洞影响用友NCCloud且存在FS文件服务器配置管理登录页面。漏洞复现fofa语法:app="用友-NC-Cloud"&&icon_hash="1596996317"用友NCCloud登录页面如下:在应用中存在文件服务器管理登录页面htt......
  • 服务器数据恢复-断电导致Xen server虚拟化虚拟磁盘文件丢失,虚拟机不可用的数据恢复案
    服务器数据恢复环境:一台某品牌服务器通过一张同品牌某型号RAID卡将4块STAT硬盘组建为一组RAID10阵列。上层部署XenServer虚拟化平台,虚拟机上安装的是WindowsServer操作系统,包括系统盘+数据盘两个虚拟机磁盘,作为Web服务器使用,存放网站代码、SQLServer数据库以及其他网站数据。......
  • 阿贝云免费云服务器评价
    阿贝云是一家提供免费云服务器的云计算服务提供商,它在市场上享有很高的声誉。以下是对阿贝云免费云服务器的评价: 首先,阿贝云免费云服务器提供了强大的计算能力。它采用了先进的云计算技术,可以满足用户对于计算资源的需求。无论是进行网站托管、应用开发还是数据分析,阿贝云免费......
  • 如何用python连接Linux服务器
    1.安装paramiko库pipinstallparamiko2.使用paramiko库连接linux#导入库importparamiko#创建一个sshclient对象ssh=paramiko.SSHClient()#允许连接不在know_host中的主机ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())#连接主机ssh.connect(hostname="......
  • Windows服务器与本地电脑无法远程复制粘贴怎么办?
    https://www.sohu.com/a/691348953_121700737方法一、通过rdpclip.exe进程解决1、我们登录服务器后,打开任务管理器,快捷键:【ctrl+shift+ESC】2、在任务管理器中查找是否有进程【rdpclip.exe】,有的系统不一样,名字也是不同的,也有系统叫【RDP剪贴板监视程序】3、如果找到有进程,......
  • 新加坡服务器为什么比较受欢迎
    新加坡服务器为什么比较受欢迎1、服务器访问速度快新加坡是世界上网速最快的国家之一,也是全球十大高速网络架构之一,承载了东南亚地区大部分的第三方数据中心储存量。新加坡拥有大量的出口带宽,在亚洲地区及欧美地区访问新加坡服务器的速度都非常快,国内用户访问新加坡服务器的速......
  • 链接服务器导致SQL Server停止响应​
     概要如果多个实例中同时存在数据源为对方实例的链接服务器,并且开启了“分发服务器”的属性,您可能会遇到这种情况。现象14:31时,在SSMS中检查HIS实例是否有复制订阅时,点击了”发布服务器属性“后,SSMS一直无法响应。时,前端应用反馈有连不上数据库的情况,用SSMS测试也无法新建连接,但......
  • 26.高并发服务器
    26.高并发服务器阻塞函数在阻塞期间若收到信号,会被信号终端,errno设置为EINTR,这个错误不应该看成一个错误。while(1){ cfd=accept(); while(1) { n=read(cfd,buf,sizeof(buf)); if(n<=0) { break; } }}解决办法1:将cfd设置为非阻塞:fcntl假......
  • 服务器监控配置
    配置说明1、通过在服务器硬件管理口中配置SNMP协议开启进行对接,华为iBMC选择SNMP登陆Dell服务器web管理页面,开启SNMP功能并配置团体名称信息  登陆IBM服务器web管理页面,开启SNMP功能并配置团体名称信息 登陆华为服务器web管理页面,开启SNMP功能并配置团体名称信息......