使用terraform 来创建GCP的instance template 和基于它的vm

news2024/12/27 10:38:37

本人在上一篇的文章中已经介绍了如何去创建 google cloud的 vm 的image 和 instance template了
url:
快速构建自定义配置好的VM - 使用GCP instance-template 和 custom-image

但是里面的操作是基于gcloud CLI的。

在实际项目上, 我们对google cloud infra的change 更常有的是terraform。 这里也简单介绍下如何利用terraform去创建vm instance template 和对应的vm

下面的内容都是参考自官方terraform 文档:
https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_instance_from_template




创建 实例模板 vm instance template

首先在terraform的vm module里新建1个tf 文件 instance_template.tf, 其实terraform的module folder 内是支持把内容写在多个文件的, 比起单一的main.tf 来讲更加容易管理
在这里插入图片描述

接下来就简单了, 我们可以把vm module原来了定义vm的代码块抄过来, 只是下面的部分需要注意修改:

resource "google_compute_instance_template" "vm-template-vpc0-subnet0-e2-small-tomcat" {
  name         = "vm-template-vpc0-subnet0-e2-small-tomcat"
  machine_type = "e2-small"

  disk {
    source_image = "https://compute.googleapis.com/compute/v1/projects/jason-hsbc/global/images/e2-small-tomcat-image"
    auto_delete  = true
    disk_size_gb = 20
    boot         = true
  }

  network_interface {
    network =  var.vpc0
    subnetwork =  var.vpc0_subnet0    
  }

 service_account {
    email  = "vm-common@jason-hsbc.iam.gserviceaccount.com"
    scopes = ["https://www.googleapis.com/auth/cloud-platform"]
  }

  # https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_instance#provisioning_model
  # to reduce cost
  scheduling { 
    automatic_restart = false # Scheduling must have preemptible be false when AutomaticRestart is true.
    provisioning_model = "SPOT"
    preemptible         = true
    instance_termination_action = "STOP"
  }

  can_ip_forward = false
}

注意修改的部分:

  1. resource 是google_compute_instance_template 而不是 google_compute_instance
  2. source image 记得改成你自定义的image, 如果你需要预安装配置某些软件的话(jdk/tomcat…)

当执行玩terraform 一套命令后(init/plan/apply) , 1个新的vm instance template 就会被创建vm-template-vpc0-subnet0-e2-small-tomcat

[gateman@manjaro-x13 ~]$ gcloud compute instance-templates list
NAME                                      MACHINE_TYPE  PREEMPTIBLE  CREATION_TIMESTAMP
e2-small-tomcat                           e2-small      true         2023-12-18T11:31:14.226-08:00
vm-template-vpc0-subnet0-e2-small-tomcat  e2-small      true         2023-12-21T08:47:49.748-08:00
[gateman@manjaro-x13 ~]$ gcloud compute instance-templates describe vm-template-vpc0-subnet0-e2-small-tomcat
creationTimestamp: '2023-12-21T08:47:49.748-08:00'
description: ''
id: '7261720283884147418'
kind: compute#instanceTemplate
name: vm-template-vpc0-subnet0-e2-small-tomcat
properties:
  disks:
  - autoDelete: true
    boot: true
    deviceName: persistent-disk-0
    index: 0
    initializeParams:
      diskSizeGb: '20'
      diskType: pd-standard
      sourceImage: projects/jason-hsbc/global/images/e2-small-tomcat-image
    interface: SCSI
    kind: compute#attachedDisk
    mode: READ_WRITE
    type: PERSISTENT
  machineType: e2-small
  metadata:
    fingerprint: t09GrcHA4z0=
    kind: compute#metadata
  networkInterfaces:
  - kind: compute#networkInterface
    name: nic0
    network: https://www.googleapis.com/compute/v1/projects/jason-hsbc/global/networks/tf-vpc0
    subnetwork: https://www.googleapis.com/compute/v1/projects/jason-hsbc/regions/europe-west2/subnetworks/tf-vpc0-subnet0
  scheduling:
    automaticRestart: false
    instanceTerminationAction: STOP
    onHostMaintenance: TERMINATE
    preemptible: true
    provisioningModel: SPOT
  serviceAccounts:
  - email: vm-common@jason-hsbc.iam.gserviceaccount.com
    scopes:
    - https://www.googleapis.com/auth/cloud-platform
selfLink: https://www.googleapis.com/compute/v1/projects/jason-hsbc/global/instanceTemplates/vm-template-vpc0-subnet0-e2-small-tomcat
[gateman@manjaro-x13 ~]$ 




创建 基于vm instance template 创建vm

这个也很简单
首先继续在vm module里添加1个新的tf文件 vm_from_template.tf
在这里插入图片描述
接下来, 使用下面的terraform代码创建1个vm

resource "google_compute_instance_from_template" "tf-vpc0-subnet0-vm21" {
  name         = "tf-vpc0-subnet0-vm21"
  project      = var.project_id
  zone         = var.zone_id

  # from a instance template
  source_instance_template = google_compute_instance_template.vm-template-vpc0-subnet0-e2-small-tomcat.self_link_unique
}

注意的是resource 那么不能是google_compute_instance 而是 google_compute_instance_from_template

但执行玩terraform 命令一套后, 1个新的vm会被创建

[gateman@manjaro-x13 ~]$ gcloud compute ssh tf-vpc0-subnet0-vm21                                                                                                            │
No zone specified. Using zone [europe-west2-c] for instance: [tf-vpc0-subnet0-vm21].                                                                                        │
External IP address was not found; defaulting to using IAP tunneling.                                                                                                       │
WARNING:                                                                                                                                                                    │
                                                                                                                                                                            │
To increase the performance of the tunnel, consider installing NumPy. For instructions,                                                                                     │
please see https://cloud.google.com/iap/docs/using-tcp-forwarding#increasing_the_tcp_upload_bandwidth                                                                       │
                                                                                                                                                                            │
Warning: Permanently added 'compute.442217657071685871' (ED25519) to the list of known hosts.                                                                               │
Linux tf-vpc0-subnet0-vm21 5.10.0-26-cloud-amd64 #1 SMP Debian 5.10.197-1 (2023-09-29) x86_64                                                                               │
                                                                                                                                                                            │
The programs included with the Debian GNU/Linux system are free software;                                                                                                   │
the exact distribution terms for each program are described in the                                                                                                          │
individual files in /usr/share/doc/*/copyright.                                                                                                                             │
                                                                                                                                                                            │
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent                                                                                                           │
permitted by applicable law.                                                                                                                                                │
Last login: Mon Dec 18 17:25:44 2023 from 35.235.242.0                                                                                                                      │
gateman@tf-vpc0-subnet0-vm21:~$ ps -ef | grep java                                                                                                                          │
gateman      608       1  9 16:55 ?        00:00:06 /usr/bin/java -Djava.util.logging.config.file=/home/gateman/server/tomcat10/conf/logging.properties -Djava.util.logging.│
manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security│
.SecurityListener.UMASK=0027 --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=j│
ava.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED -classpath /home/gateman/server/tomcat10/bin/bootstrap.jar:/home/gateman/server│
/tomcat10/bin/tomcat-juli.jar -Dcatalina.base=/home/gateman/server/tomcat10 -Dcatalina.home=/home/gateman/server/tomcat10 -Djava.io.tmpdir=/home/gateman/server/tomcat10/tem│
p org.apache.catalina.startup.Bootstrap start                                                                                                                               │
gateman      981     976  0 16:57 pts/0    00:00:00 grep java                                                                                                               │
gateman@tf-vpc0-subnet0-vm21

测试过, 可以正确加载我们的自定义镜像, 也就是tomcat 已经被安装和启动了




创建 基于vm 的单独设置 可以覆盖 Instance template 上相应的值

这里做个测试
我在terraform加多1个resource tf-vpc0-subnet1-vm1

resource "google_compute_instance_from_template" "tf-vpc0-subnet0-vm21" {
  name         = "tf-vpc0-subnet0-vm21"
  project      = var.project_id
  zone         = var.zone_id

  # from a instance template
  source_instance_template = google_compute_instance_template.vm-template-vpc0-subnet0-e2-small-tomcat.self_link_unique
}


# The custom properties of vm_from_template could overwrite the pre-defined properties in instance template
resource "google_compute_instance_from_template" "tf-vpc0-subnet1-vm1" {
  name         = "tf-vpc0-subnet1-vm1"
  project      = var.project_id
  zone         = var.zone_id

  network_interface {
    network =  "tf-vpc0"
    subnetwork =  "tf-vpc0-subnet1"  # here the subnet property will overwrite the setting in instance template
  }
  # from a instance template
  source_instance_template = google_compute_instance_template.vm-template-vpc0-subnet0-e2-small-tomcat.self_link_unique
}

其中 subnetwork 我显式设为了 tf-vpc0-subnet1 , 而 模板上的subnet 是 tf-vpc0-subnet0
当资源创建后, 可以见到subnet的值被 覆盖了, 相当方便。

[gateman@manjaro-x13 ~]$ gcloud compute instances describe tf-vpc0-subnet1-vm1
No zone specified. Using zone [europe-west2-c] for instance: [tf-vpc0-subnet1-vm1].
cpuPlatform: Intel Broadwell
creationTimestamp: '2023-12-21T10:20:06.917-08:00'
deletionProtection: false
disks:
- architecture: X86_64
  autoDelete: true
  boot: true
  deviceName: persistent-disk-0
  diskSizeGb: '20'
  guestOsFeatures:
  - type: UEFI_COMPATIBLE
  - type: VIRTIO_SCSI_MULTIQUEUE
  - type: GVNIC
  - type: SEV_CAPABLE
  index: 0
  interface: SCSI
  kind: compute#attachedDisk
  licenses:
  - https://www.googleapis.com/compute/v1/projects/debian-cloud/global/licenses/debian-11-bullseye
  mode: READ_WRITE
  source: https://www.googleapis.com/compute/v1/projects/jason-hsbc/zones/europe-west2-c/disks/tf-vpc0-subnet1-vm1
  type: PERSISTENT
fingerprint: 5624YdVwPFw=
id: '9061352765349510970'
kind: compute#instance
labelFingerprint: 42WmSpB8rSM=
lastStartTimestamp: '2023-12-21T10:20:12.479-08:00'
machineType: https://www.googleapis.com/compute/v1/projects/jason-hsbc/zones/europe-west2-c/machineTypes/e2-small
metadata:
  fingerprint: t09GrcHA4z0=
  kind: compute#metadata
name: tf-vpc0-subnet1-vm1
networkInterfaces:
- fingerprint: z9Z5YCAsnOo=
  kind: compute#networkInterface
  name: nic0
  network: https://www.googleapis.com/compute/v1/projects/jason-hsbc/global/networks/tf-vpc0
  networkIP: 192.168.1.5
  stackType: IPV4_ONLY
  subnetwork: https://www.googleapis.com/compute/v1/projects/jason-hsbc/regions/europe-west2/subnetworks/tf-vpc0-subnet1
satisfiesPzs: true
scheduling:
  automaticRestart: false
  instanceTerminationAction: STOP
  onHostMaintenance: TERMINATE
  preemptible: true
  provisioningModel: SPOT
selfLink: https://www.googleapis.com/compute/v1/projects/jason-hsbc/zones/europe-west2-c/instances/tf-vpc0-subnet1-vm1
serviceAccounts:
- email: vm-common@jason-hsbc.iam.gserviceaccount.com
  scopes:
  - https://www.googleapis.com/auth/cloud-platform
shieldedInstanceConfig:
  enableIntegrityMonitoring: true
  enableSecureBoot: false
  enableVtpm: true
shieldedInstanceIntegrityPolicy:
  updateAutoLearnPolicy: true
startRestricted: false
status: RUNNING
tags:
  fingerprint: 42WmSpB8rSM=
zone: https://www.googleapis.com/compute/v1/projects/jason-hsbc/zones/europe-west2-c
[gateman@manjaro-x13 ~]$ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1327775.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python:正则表达式---贪婪匹配

在正则表达式中,贪婪匹配是指匹配尽可能多的字符,而非贪婪匹配(也称为懒惰匹配或最小匹配)则是匹配尽可能少的字符。 .* 表示匹配任意数量的任意字符(除换行符外)。贪婪匹配会将尽可能多的字符都作为匹配结…

vue中监听Form表单值的变化

想要监听From表单中某个值的变化需要用到vue中的 watch watch: {inputForm.isHeating() {this.inputForm.otherHeating}}, isHeating是表单中的某个值,如果他变化就会清空另一个值

【SpringMVC】SpringMVC的请求与响应

文章目录 0. Tomcat环境的配置1. PostMan工具介绍创建WorkSpace建立新的请求 2. 请求映射路径案例结构与代码案例结构案例代码 案例存在问题解决方案方法方法升级版——配置请求路径前缀注解总结 3. Get请求与Post请求案例结构与案例代码案例结构案例代码 Get请求Post请求接收中…

HotRC DS600遥控器+F-06A接收机

PWM原理说明 DS600遥控器说明 DS600遥控器的默认高电平是1.5ms 1通道 左右 2通道 前后 3通道 接管 上电后是1ms ,按一下是2ms,1ms和2ms切换 DS600接收机说明 */ #include "ps2.h" #include "common.h"#define LEFT_RIGHT_CHAN…

工具系列:PyCaret介绍_多分类代码示例

👋 工具系列:PyCaret介绍_多分类代码示例 PyCaret 介绍 PyCaret是一个开源的、低代码的Python机器学习库,可以自动化机器学习工作流程。它是一个端到端的机器学习和模型管理工具,可以大大加快实验周期并提高生产效率。 与其他开…

理解按需自动导入 unplugin-auto-import unplugin-vue-components

文章目录 unplugin-auto-import基础使用构建工具引入插件配置插件 import:配置自动导入规则使用预设自动引入第三方库自动导入 TypeScript 类型vue 预设的自动导入配置 dts:让编辑器环境识别 ts 类型eslintrc:解决 eslint 检查错误dirs&#…

AI 论文精读,中文视频讲解:剖析人工智能本质 | 开源日报 No.120

mli/paper-reading Stars: 21.8k License: Apache-2.0 深度学习论文精读是一个深度学习相关论文列表,包括计算机视觉、生成模型、自然语言处理等多个领域。 该项目的核心优势和特点包括: 提供了大量关于深度学习各领域热门文章内容对不同年份发表的有较…

数据类型,运算符,表达式复习

本章没太需要复习的,重点复习一下逗号表达式还有习题吧 总结 表达式1,表达式2 计算的过程为,先算表达式1,再算表达式2,整个表达式的值为表达式2的值 还可以无限套娃,像这样((a,b&…

03-JVM对象创建与内存分配机制深度剖析

文章目录 对象的创建对象创建的主要流程一、类加载检查二、分配内存划分内存的方法解决并发问题的方法 三、初始化零值四、设置对象头五、执行<init>方法 对象半初始化对象大小与指针压缩什么是java对象的指针压缩&#xff1f;为什么要进行指针压缩&#xff1f; 对象内存…

Linux常用的基础命令

一、通配符 1、定义&#xff1a; 有些符号不表示原来的意思&#xff0c;它代表了一类字符 " * "&#xff1a;代表任意长度的字符&#xff0c;不能显示隐藏文件 " ? "&#xff1a;代表任意一个字符 2、作用&#xff1a; 去匹配文件的名字。 例如&am…

『Linux升级路』基础开发工具——gdb篇

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;Linux &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、背景知识介绍 二、gdb指令介绍 一、背景知识介绍 在软件开发中&#xff0c…

用Go语言实现HTTP API的安全验证

HTTP API的安全验证&#xff0c;通常我们会使用诸如OAuth、API密钥、JWT&#xff08;JSON Web Tokens&#xff09;等方法。这里&#xff0c;我将向您展示如何使用JWT在Go语言中实现HTTP API的安全验证。 1. JWT简介 JWT是一种开放标准&#xff08;RFC 7519&#xff09;&#…

软件项目安全保证措施

一、 身份鉴别 二、 访问控制 三、 通信完整性、保密性 四、 抗抵赖 五、 数据完整性 六、 数据保密性 七、 应用安全支撑系统设计 软件开发全流程文档支撑下载&#xff1a;软件项目开发全套文档下载-CSDN博客

VScode 工作区配置 和 用户配置

一、工作区配置 通常不同的项目都有不同的配置&#xff0c;我一般都是使用eslint和prettier一起用&#xff0c;所以经常会有这几个文件&#xff1a; 这里简单介绍一下这几个文件的作用吧。 1.vscode文件夹下 一般有两个文件&#xff0c;extensions.json和settings.json。 e…

基于Java SSM框架实现人事员工考勤签到请假管理系统项目【项目源码+论文说明】

基于java的SSM框架实现人事员工考勤签到请假管理系统演示 摘要 在高速发展的时代&#xff0c;众多的软件被开发出来&#xff0c;给用户带来了很大的选择余地&#xff0c;而且人们越来越追求更个性的需求。在这种时代背景下&#xff0c;人们对人事管理系统越来越重视&#xff0…

Java Web Day06_JQuery基础

课程安排 jQuery是什么 框架&#xff08;framework&#xff09;是一个框子——指其约束性&#xff0c;也是一个架子——指其支撑性。是一个基本概念上的结构&#xff0c;用于去解决或者处理复杂的问题。 jQuery是目前使用最广泛的javascript函数库&#xff0c;极大地简化了ja…

100GPTS计划-AI学术AcademicRefiner

地址 https://chat.openai.com/g/g-LcMl7q6rk-academic-refiner https://poe.com/AcademicRefiner 测试 减少相似性 增加独特性 修改http://t.csdnimg.cn/jyHwo这篇文章微调 专注于人工智能、科技、金融和医学领域的学术论文改写&#xff0c;秉承严格的专业和学术标准。 …

华为OD机试 - 发广播 - 并查集(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、并查集Java 实现并查集 五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&…

机器学习算法(11)——集成技术(Boosting——梯度提升)

一、说明 在在这篇文章中&#xff0c;我们学习了另一种称为梯度增强的集成技术。这是我在机器学习算法集成技术文章系列中与bagging一起介绍的一种增强技术。我还讨论了随机森林和 AdaBoost 算法。但在这里我们讨论的是梯度提升&#xff0c;在我们深入研究梯度提升之前&#xf…

【算法设计与分析】——动态规划算法

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…