云原生|Packer插件开发在项目中应用

news2024/12/22 22:27:20

作者:李冠军  神州数码云基地 高级后端开发工程师

云时代我们可以在各云厂商控制台点一点,实例就生成了,但是这个点还是需要自己去点,如果把这些动作写成代码,直接运行,一切就完成了。

这就是Packer的作用,可以构建一个可以马上部署的云服务器镜像,可以在代码中定义基础镜像,预装哪些软件,装完后再生成一个镜像,然后就可以直接使用这个镜像生成实例了,实例启动后,一切险准备就绪,也不用执行什么初始化脚本,代码就可以在多个云平台上使用。

想要通过Packer构建不同云平台的镜像,这就需要安装不同云平台的Packer插件,当然一些云平台还不支持此工具,而这个时候就需要我们针对云平台进行packer插件的开发了。

Packer插件开发的本质上是通过调用云平台API来进行云资源的操作,如何进行Packer插件开发这里就不再赘述了,这里是官方文档-Packer 插件开发文档。

这里说一下我们实际的项目应用。

我们根据客户需求开发了一版针对移动合营云云平台的Packer插件(packer-plugin-hecloud)

插件基于Pakcer官方插件模板包,结合云平台SDK包调用云资源服务接口,进行镜像创建相关操作。

项目案例分享


一、Packer插件实例

实现Packer插件必须由Go语言实现

实现插件所需要做的是:

  • packer-plugin所需接口的实现
  • 使用packer-plugin-sdk中提供的服务器提供服务

Packer核心和 SDK 会处理服务器内部的所有通信细节

必须使用官方提供的两个包来实现服务器和接口

"github.com/hashicorp/packer-plugin-sdk/plugin" //包含官方提供插件的代码。这处理所有进程间通信。
"github.com/hashicorp/packer-plugin-sdk/packer" //包含必须为任何插件实现的所有接口

下图使用了其中上述之一http://github.com/hashicorp/packer-plugin-sdk/plugin

上图代码中

plugin.NewSet(): 调用处理与 Packer 核心通信和通过 RPC 为组件提供服务的所有细节。只要注册的结构实现了组件接口之一,Packer 现在就可以启动此插件并使用它。

ecsbuilder.Builder实现了"http://github.com/hashicorp/packer-plugin-sdk/packer",并通过pps.Run()提供服务

下面我们看一下builder目录中的代码

核心文件在/builder/ecs/builder.go

上图所示:

  • builder.go中的 Run()方法是实际执行自定义打包镜像的过程
  • 同级目录下的以step开头的文件,都实现了官方包http://github.com/hashicorp/packer-plugin-sdk/multistep中的Step interface,都属于打包步骤
  • 每个步骤一个文件,传入不同的配置参数,去调用云平台SDK包去实现相对应的操作
  • 最后由Builder执行Run()来进行打包操作

//打包镜像全步骤

目录都为同级builder/ecs/

  • step_load_zones.go中的StepLoadAZ用户加载可用区,listZones()方法调用云平台接口os-availability-zone
  • step_load_flavor.g中的StepLoadFlavor用户加载Flavor ,比如:s6.large.2
  • step_key_pair.go中的StepKeyPair 创建临时密钥对
  • step_source_image_info.go 设置source_image
  • step_create_volume.go 创建volume并记录volume_id
  • step_run_source_server.go ,根据配置以及source_image、flavor创建服务,并生成Server ID ,须在云平台已经开通弹性云服务
  • step_get_password.go 在使用winrm的情况下并且未设密码的情况下,自动生成密码
  • step_allocate_ip.go创建并分配IP,根据参数是否设置来分配,如下图

将浮动ip和实例端口相关联

  • step_connect.go通过ssh communicator服务建立连接
  • step_provision,官方步骤-打包过程Provision配置器处理,配置器配置的相关命令操作,如下图

  • step_cleanup_temp_keys-官方步骤清理临时密钥
  • step_stop_server 将创建的服务停掉
  • step_create_image根据当前服务实例创建镜像
  • step_add_image_members为新建镜像添加用户,未设置直接返回
  • step_update_image_mindisk更新磁盘镜像

上述步骤为实际执行过程的全步骤

//执行和返回过程

执行在b.runner.Run(ctx, state)这一步进行

如图示,执行后续根据错误返回err信息,未生成镜像返回nil,成功生成镜像,返回镜像相关信息

打包成功示意图:

以上就是Packer插件开发的代码实际流程。

二、兼容性问题

这里说一下项目交付后遇到的一个问题,就是Packer v1.7.0以下的版本 云平台插件需要做兼容处理。

由于项目开发阶段,客户没有要求Packer版本等事宜,上述插件是在Packer v1.8.0的基础上开发的。

然而客户生产环境Packer版本是v1.6.6,可能因为版本导致了一些兼容性的问题。

在当前的测试环境,将Packer版本切换到v1.6.6,并执行打包命令

脚本配置如下:

报错如下:

将Packer版本切换到v1.8.0及更高版本,执行打包命令 packer build ,发现能够正常执行打包。

故推测该问题由于低版本Packer打包调用高版本hecloud-ecs插件导致。

packer-plugin的开发,这里需要packer官方包packer-plugin-sdk

而官方在v1.7.x之前的packer-plugin开发的文档是没有找到的

由于客户Pakcer版本是v1.6.6,这里看了一下Packer的源码v1.6.6版,发现packer-plugin-sdk在当前项目目录下,也就是 http://github.com/hashicorp/packer/packer-plugin-sdk,进入后发现,Packer v1.7.0之前的版本,插件也要使用v1.7.0之前版本的插件开发工具包来保证API兼容性。

把Packer源码切换到v1.7.0版,发现http://github.com/hashicorp/packer/packer-plugin-sdk 不存在了,变成了一个独立的Repo:http://github.com/hashicorp/packer-plugin-sdk。

由于我们的移动云插件是基于v1.8.0开发的,也就是基于独立Repo:http://github.com/hashicorp/packer-plugin-sdk,而v1.7.0之前的插件开发是需要基于http://github.com/hashicorp/packer/packer-plugin-sdk。问题初步判定是packer-plugin-sdk版本的问题。

接下来解决问题,将当前插件版本的独立Repo sdk依赖,切换到依赖pakcer v1.6.6项目内置的sdk。

删除项目下go.mod:rm -f go.mod

指定packer依赖版本:go get http://github.com/hashicorp/packer@v1.6.6

项目内替换依赖项:搜索 hashicorp/packer-plugin-sdk 全部替换为 hashicorp/packer/packer-plugin-sdk

下载其余依赖:go mod tidy

重新编译:CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o packer-plugin-hecloud

编译成功后将packer-plugin-hecloud 放入 /usr/local/bin下

再次测试打包 packer build

能够成功运行打包程序,问题解决。

总结一下,这个问题是由Pakcer版本引起的,Packer在v1.7.0把用于插件开发的packer-plugin-sdk,由当前项目下独立了出去,低版本Packer在执行调用对应云平台打包插件时,需要对应云平台插件做低版本兼容。

版权声明:本文由神州数码云基地团队整理撰写,若转载请注明出处。

公众号搜索神州数码云基地,后台回复“技术合集”,领取干货内容。

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

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

相关文章

使用Markdown编辑器

使用Markdown编辑器 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个注…

总结833

学习目标: 4月(复习完高数18讲内容,背诵21篇短文,熟词僻义300词基础词) 学习内容: 暴力英语:背《美丽心灵》,背《大独裁者》五六段,六百四十字的文章,明天加…

Java中的序列化与反序列化

序列化和反序列化作为 Java 里一个较为基础的知识点,但我相信很多人能了解的也就是那么几句而已,甚至都不了解,如果再深究问一下 Java 如何实现序列化和反序列化的,就可能不知所措了! 不知道怎么说好,什么是…

GD(兆易创新)系列FLASH进行FPGA和ZYNQ配置固化相关操作

写在前面 本文主要针对使用GD(兆易创新)系列的FLASH做启动配置片时,遇到的相关问题进行简单整理复盘,避免后人踩坑。 本人操作固化芯片型号为:ZYNQ7045、690T(复旦微替代型号V7 690T)。 7系列…

为类创建事务码,读取EXCEL并显示报表简单版

屏幕以及字段定义 DATA: go_container TYPE REF TO cl_gui_custom_container. DATA: lv_subrc TYPE i,gv_action TYPE int4,lt_filetab TYPE filetable,ls_filetab TYPE file_table.DATA: gv_exit TYPE flag . DATA: lt_input TYPE TABLE OF alsmex_tabline,…

人脸识别概述

博主简介 博主是一名大二学生,主攻人工智能研究。感谢让我们在CSDN相遇,博主致力于在这里分享关于人工智能,c,Python,爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主,博主会继续更新的&#xff0c…

封装 (encapsulation)--计算机程序术语

封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的 访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的 源代码进行有机的结合&…

以轻量级服务器niginx为核心的JavaWeb项目:第一章 项目设计

这里写目录标题 一 需求分析与环境搭建1.需求分析2.环境搭建1.2.1首先配置mysql环境1.2.2 配置maven环境 二 打成War包,发到linux上 一 需求分析与环境搭建 1.需求分析 2.环境搭建 1.2.1首先配置mysql环境 先查找一下mysql环境 [roothadoop122 ~]# mysql --vers…

SpringCloudAlibaba分布式事务——Seata

Seata 本专栏学习内容来自尚硅谷周阳老师的视频 有兴趣的小伙伴可以点击视频地址观看 分布式事务问题 在使用分布式之前,一般都是单机单库或者是单机多库的情况,一个服务对应一个数据库或者多个数据库,这样事务的问题可以通过Transaction解决…

Python学习:Anaconda23.3.1+spyder5.4.3+Python3.10.11环境配置

问题1:Anaconda安装配置教程(真的非常详细的安装过程,还带环境配置) 【参考文献】本文链接:Windows安装Anaconda使用教程_在奋斗的大道的博客-CSDN博客 问题2:Anaconda半天打不开,就在这转啊转…

MYSQL(六)函数

函数是指一段可以直接被另一端程序调用的代码 字符串函数 update employees set workn lpad(workno,5, 0); 数值函数 根据数据库的函数,生成一个六位数的随机验证码 select rpad(round(rand()*1000000, 0), 6, 0); 日期函数 流程函数

尚融宝24-标的管理

目录 一、需求介绍 (一)借款人申请借款 (二)流程 二、生成新标的 三、标的列表 (一)后端 (二)前端 四、标的详情 (一)后端 (二&#xf…

FPGA动态配置si5338输出差分时钟,提供工程源码和技术支持

目录 1、前言2、设计框图3、si5338原理图设计4、si5338使用流程5、vivado工程详解6、上板调试验证并演示7、福利:工程代码的获取 1、前言 如今的FPGA板卡随着FPGA本身性能的提高也越来越高端,特别是在高速接口方面表现得越发明显,以Xilinx的…

Redis(10)哨兵

redis哨兵 哨兵配置步骤步骤一 启动redis节点步骤二 配置哨兵节点第三步 设置主从复制第四步 查看状态第五步 验证哨兵配置是否成功第六步 测试 哨兵配置步骤 本文将介绍redis哨兵的配置步骤。Redis哨兵是一种用于监控Redis主从复制和自动故障转移的系统 Redis哨兵是Redis的核…

“探索C++非质变算法:如何更高效地处理数据“

📖作者介绍:22级树莓人(计算机专业),热爱编程<目前在c++阶段>——目标Windows,MySQL,Qt,数据结构与算法,Linux,多线程&…

无线电设备发射型号核准证(SRRC)

SRRC认证简介 SRRC为国家无线电管理委员会State Radio Regulatory Commission of the People’s Republic of China SRMC认证(又称SRRC认证)自1999年6月1日起,中国信息产业部(Ministry of Information Industry,MII)强制规定,所有在中国境内销售及使用的…

【c语言】static静态变量

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…

C++【二叉搜索树】

文章目录 一、二叉搜索树&#xff08;1&#xff09;概念&#xff08;2&#xff09;操作&#xff08;3&#xff09;应用 二、BST模拟实现及函数解析&#xff08;1&#xff09;构建BST结点结构体&#xff08;2&#xff09;BST默认构造及拷贝构造&#xff08;3&#xff09;BST赋值…

2023亚马逊云科技行业峰会,汇聚行业专家分享行业数字化创新之道

从实验室扩展到真实世界&#xff0c;从前沿技术探索到医疗生命科学行业的快速创新实践&#xff0c;亚马逊云科技不断地通过数字化助力医疗和生命科学的行业创新。由上海徐汇区科委指导&#xff0c;上海枫林集团作为支持单位&#xff0c;亚马逊云科技主办的2023亚马逊云科技医疗…

yum仓库及NFS共享服务

部署yum仓库及NFS共享服务 一、yum仓库服务yum概述源种类&#xff1a; 二、安装源安装ftp源安装在线源本地源和在线源同时使用将软件包变成Yum源 三、NFS共享存储服务NFS架构NFS原理 四、NFS实操 一、yum仓库服务 yum概述 基于RPM包构建的软件更新机制可以自动解决依赖关系所…