前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Terraform系列三腾讯云CVM中的玩法

Terraform系列三腾讯云CVM中的玩法

原创
作者头像
对你无可奈何
修改2022-04-03 21:35:45
3.8K1
修改2022-04-03 21:35:45
举报
文章被收录于专栏:运维专栏

背景:

紧接:Terraform系列一腾讯云CVM相关简单创建Terraform系列二腾讯云CVM进一步相关玩法。cvm创建完成,准备初始化一下系统,挂载一下数据盘,在cvm中安装一些软件,做一些简单的配置!

Terraform系列三腾讯云CVM中的玩法

1. Terraform output

我们通过terraform创建了cvm相关资源,我们该如何获取cvm的相关信息呢?前面我都是登陆控制台后台查看的。我能不能通过terraform获取相关的我需要的信息输出呢?可以的!这里顺路提一下output......

1. 首先拿一个简单的例子来演示一下:

我需要打印出cvm_almalinux cvm云主机 的区域,id ,名称,公网ip相关信息。这样我就可以获取公网ip信息,不用去控制台查找ip信息,可以直接登陆服务器了。

1. cat output.tf
代码语言:txt
复制
output "cvm_az" {
  value = "${tencentcloud_instance.cvm_almalinux.availability_zone}"
}
output "cvm_id" {
  value = "${tencentcloud_instance.cvm_almalinux.id}"
 }
output "cvm_name" {
  value = "${tencentcloud_instance.cvm_almalinux.instance_name}"
 }
output "cvm_public_ip" {
  value = "${tencentcloud_eip.cvm_almalinux_eip.public_ip}"
}
2. terraform apply and terraform out
image.png
image.png

这样我们就可以获取到服务器的公网ip了,可以至今ssh登陆服务器!当然了这里只是抛砖引玉。你可以通过output输出各种资源相关的信息-你所需要的!

3. terraform output 其他的用法

从腾讯云的腾讯云Terraform应用指南学到的

代码语言:txt
复制
[root@zhangpeng terraform]# terraform output cvm_id
"ins-hsakr7ah"

同理也可以打印其他相关信息.了解一个命令的最好方法还是通过--hlep看文档

代码语言:txt
复制
[root@zhangpeng terraform]# terraform output --help
Usage: terraform [global options] output [options] [NAME]

  Reads an output variable from a Terraform state file and prints
  the value. With no additional arguments, output will display all
  the outputs for the root module.  If NAME is not specified, all
  outputs are printed.

Options:

  -state=path      Path to the state file to read. Defaults to
                   "terraform.tfstate".

  -no-color        If specified, output won't contain any color.

  -json            If specified, machine readable output will be
                   printed in JSON format.

  -raw             For value types that can be automatically
                   converted to a string, will print the raw
                   string directly, rather than a human-oriented
                   representation of the value.

竟然可以json输出?体验一下!

代码语言:txt
复制
[root@zhangpeng terraform]# terraform output -json
{
  "cvm_az": {
    "sensitive": false,
    "type": "string",
    "value": "ap-beijing-2"
  },
  "cvm_id": {
    "sensitive": false,
    "type": "string",
    "value": "ins-hsxxxx"
  },
  "cvm_name": {
    "sensitive": false,
    "type": "string",
    "value": "cvm-almalinux"
  },
  "cvm_public_ip": {
    "sensitive": false,
    "type": "string",
    "value": "xxx.xxx.xxx.xxx"
  }
}

更多的用法以后慢慢区发现了。这只是获取公网ip引申出来的

2. 如何通过terraform给cvm运行shell

1. 格式化vdb并挂载到data目录

1. 创建格式化tf配置文件

cat mkfs.tf

代码语言:txt
复制
resource "null_resource" "connect_private" {
  connection {
    host        = "${tencentcloud_eip.cvm_almalinux_eip.public_ip}"
    type        = "ssh"
    user        = "root"
  }

  # set hostname
  provisioner "remote-exec" {
    inline = [
      "sudo mkfs -t ext4 /dev/vdb",
      "sudo mkdir /data",
      "sudo mount /dev/vdb /data"
    ]
  }
}
2. terraform plan and terraform init --upgrade
代码语言:txt
复制
[root@zhangpeng terraform]# terraform plan

恩?提示我要uprade?什么鬼先执行一下!目测是要安装一个null的组件好吧......

代码语言:txt
复制
[root@zhangpeng terraform]# terraform init --upgrade
j7C79C7Yja.png
j7C79C7Yja.png
3. terraform apply
代码语言:txt
复制
[root@zhangpeng terraform]# terraform apply
image.png
image.png

我以为我设置免密不用设置私钥或者密码就可以的.....这是不对的。设置一下私钥再走一遍!

4.正确的方式---特别强调

cat mkfs.tf

代码语言:txt
复制
resource "null_resource" "connect_private" {
  connection {
    host        = "${tencentcloud_eip.cvm_almalinux_eip.public_ip}"
    type        = "ssh"
    user        = "root"
    private_key = "${file("~/.ssh/id_rsa")}"
  }

  # set hostname
  provisioner "remote-exec" {
    inline = [
      "sudo mkfs -t ext4 /dev/vdb",
      "sudo mkdir /data",
      "sudo mount /dev/vdb /data"
    ]
  }
}

注:增加了private_key配置

terraform plan and terraform apply

image.png
image.png

ssh登陆服务器查看验证:

代码语言:txt
复制
[root@cvm-almalinux /]# lsblk
image.png
image.png

ok 格式化硬盘的任务就算是成功了!当然了也可以在remote-exec中将配置写入fstab防止服务器重启失效!

2.安装一个软件,比如nginx?

1. 创建nginx.tf配置文件

cat nginx.tf

代码语言:txt
复制
resource "null_resource" "connect_private_nginx" {
  connection {
    host        = "${tencentcloud_eip.cvm_almalinux_eip.public_ip}"
    type        = "ssh"
    user        = "root"
    private_key = "${file("~/.ssh/id_rsa")}"
  }

  # set hostname
  provisioner "remote-exec" {
    inline = [
      "sudo yum update -y",
      "sudo yum install nginx -y",
      "sudo systemctl start nginx"
    ]
  }
}
2. terraform plan and terraform apply
s1oB7BjyAX.png
s1oB7BjyAX.png

install 滚动条一直0怎么会事情.......登陆服务器查看一下

xZSY7M1mIX.png
xZSY7M1mIX.png

调用的是一个platform-python安装软件没有仔细区看接着等待ing.....

cgQFuUBiYD.png
cgQFuUBiYD.png

连接不到yum源?突然就想到了防火墙......

果不其然,出口默认都是deny拒绝!

dTXAUA6EdS.png
dTXAUA6EdS.png

修改安全组配置文件如下:

代码语言:txt
复制
[root@zhangpeng terraform]# cat security_group.tf 
resource "tencentcloud_security_group" "sg_bj" {
    name = "sg-bj"    
}

resource "tencentcloud_security_group_rule" "sg_bj_1" {
    security_group_id = "${tencentcloud_security_group.sg_bj.id}"
    type = "ingress"
    cidr_ip = "0.0.0.0/0"
    ip_protocol = "tcp"
    port_range = "22,80"
    policy = "accept"
}
resource "tencentcloud_security_group_rule" "sg_bj_2" {
    security_group_id = "${tencentcloud_security_group.sg_bj.id}"
    type = "egress"
    cidr_ip = "0.0.0.0/0"
    ip_protocol = "tcp"
    policy = "accept"
}

继续terrafrom plan terraform apply

6hbI6Btsdo.png
6hbI6Btsdo.png
WEycbfODsB.png
WEycbfODsB.png

进度条可以走了总算!等待任务结束

image.png
image.png

访问公网Ip nginx正常访问成功!

image.png
image.png

3.其他的方式?

不想讲脚本写在tf文件里面,我可不可以写一个shell脚本,然后用remote-exec去运行呢?可以的!安装一个httpd如下:

1. 编写install-http.sh脚本

install-httpd.sh

代码语言:txt
复制
[root@k8s-master-01 terraform]# cat install-httpd.sh 
#!/bin/bash
systemctl stop nginx
yum install -y httpd
systemctl start httpd

注:主机名变了....放假回家拿另外服务器跑的。嗯id_isa也搞了过来!前面安装过nginx了不做复杂设置,先把!nginx停止了!

2. 编写httpd.tf

httpd.tf

代码语言:txt
复制
resource "null_resource" "connect_private_httpd" {
  provisioner "file" {
    source = "install-httpd.sh"
    destination = "/tmp/install-httpd.sh"
  }
  # set hostname
  provisioner "remote-exec" {
    inline = [
      "chmod +x /tmp/install-httpd.sh && sh /tmp/install-httpd.sh"
    ]
  }
  connection {
    host        = "${tencentcloud_eip.cvm_almalinux_eip.public_ip}"
    type        = "ssh"
    user        = "root"
    private_key = "${file("~/.ssh/id_rsa")}"
  }
}
3. terraform plain and terraform apply
代码语言:txt
复制
[root@k8s-master-01 terraform]# terraform plan
[root@k8s-master-01 terraform]# terraform apply
8e26244fd9dc62a9a0837c638a32090.png
8e26244fd9dc62a9a0837c638a32090.png
image.png
image.png

访问80也是可以的。当然了复杂的脚本自己编写测试吧只是抛砖引玉!

767566fb1727fa1fcf7addd06bef939.png
767566fb1727fa1fcf7addd06bef939.png

另外看方法还有local-exec?看其他文章笔记还有ansible结合的?有时间都可以尝试一下

下一步的计划

  1. 讲腾讯云后台的现有资源导出成terraform的配置。嗯就是导出资产...将资产统一管理一下配置即代码。
  2. tf文件更规范的模块化管理?
  3. 变量的更合理运用?
  4. ansible或者其他软件的整合?
  5. 日志输出的规范标准化

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景:
  • Terraform系列三腾讯云CVM中的玩法
    • 1. Terraform output
      • 1. 首先拿一个简单的例子来演示一下:
    • 2. 如何通过terraform给cvm运行shell
      • 1. 格式化vdb并挂载到data目录
      • 2.安装一个软件,比如nginx?
      • 3.其他的方式?
  • 下一步的计划
相关产品与服务
资源编排 TIC
资源编排 TIC 为您提供易用、高效、安全的基础架构管理平台。平台使用声明型语言,兼容众多优秀的开源社区工具,同时提供代码编辑和视图编辑两种模式,有效降低学习成本和使用难度。TIC 使用代码版本管理的方式管理基础架构,保障基础设施的构建、管理和迁移的可靠性和安全性。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档