自动化构建镜像:Packer

news/2024/12/26 3:47:48/文章来源:https://www.cnblogs.com/robindevnotes/p/18548381

在介绍Packer之前,先来回顾一下未使用Packer时自定义虚拟机镜像的步骤。先在本地启动一个虚拟机,从安装系统开始,再进行自定义配置或应用安装,最后封装压缩成镜像,详细操作步骤可以参考我之前写的文档,制作Centos 7镜像:https://robin-2016.github.io/2019/04/08/制作openstack的centos7镜像/,制作Windows镜像:https://robin-2016.github.io/2019/04/23/制作openstack的windows-server-2016镜像/。还可以借助阿里云或华为云等公有云,可以直接运行一个虚拟机实例,再进行相关配置,最后导出镜像,使用公有云相比本地构建镜像节省了安装系统的时间,相关云配置也能减少,只需进行自定义相关配置。

不论在本地还是在云上构建虚拟机镜像,都需要很多手动操作步骤,而Packer就是为了构建镜像自动化,和Terraform一样都是HashiCorp公司出品,官网地址:https://www.packer.io/,在官网首页还提出了镜像即代码(Images as code)的概念,支持虚拟机和容器镜像构建,我体验了一下容器构建过程,相比dockerfile略显复杂难懂,推荐容器镜像还是写dockerfile,用Packer来构建虚拟机镜像,容器构建之前已经实现了自动化,虚拟机镜像构建还是手动操作,Packer能大大提高效率。下面进入实操演示。

Packer安装,参考官网:https://developer.hashicorp.com/packer/install,基本1-2条命令就能完成安装,示例配置文件代码仓库:https://github.com/robin-2016/terraform-demo,克隆后进行packer-demo目录下

先来看一下aws-demo.pkr.hcl配置文件内容结构,第一部分packer部分定义了使用的插件,这里使用的AWS云,AWS第一次注册使用有750小时免费使用计划(限定规格)。第二部分source部分定义了镜像来源,amazon-ebs标识是AWS的云硬盘,ami_name为最终生成的镜像名称,{{timestamp}}为时间戳变量,多次执行时镜像名称会因为执行时间不同而不同,不会名称冲突,instance_type为虚拟机实例规格,其实Packer底层原理还是创建了一个虚拟机实例,执行脚本命令,导出镜像,再删除虚拟机实例,Packer是把上面步骤自动化了,region为实例运行区域,ap-east-1是香港地区,source_ami为基础镜像ID,这里选择的公有Ubuntu Server 24镜像。第三部分build是定义构建过程,主要是shell部分,可以写脚本来安装配置应用程序,示例中是安装的redis程序。

packer {required_plugins {amazon = {version = ">= 1.2.8"source  = "github.com/hashicorp/amazon"}}
}source "amazon-ebs" "ubuntu" {ami_name      = "aws-demo-ubuntu-{{timestamp}}"instance_type = "t3.micro"region        = "ap-east-1"source_ami    = "ami-0ad7f83eab34d93a7"ssh_username  = "ubuntu"
}build {name = "learn-packer"sources = ["source.amazon-ebs.ubuntu"]provisioner "shell" {environment_vars = ["FOO=hello world",]inline = ["echo Installing Redis","sleep 30","sudo apt-get update","sudo apt-get install -y redis-server","echo \"FOO is $FOO\" > example.txt",]}
}

在具体执行前先配置下面两个环境变量,AWS的AK和SK,Packer会读取环境变量就能有权限操作AWS了。

export AWS_ACCESS_KEY_ID="<YOUR_AWS_ACCESS_KEY_ID>"
export AWS_SECRET_ACCESS_KEY="<YOUR_AWS_SECRET_ACCESS_KEY>"

依次执行下面命令,就能完成镜像的构建了,先进行初始化,格式化和验证配置文件命令是可选的,最后进行镜像构建,操作看着和Terraform非常相似。

#初始化
packer init .
#格式化配置-可选
packer fmt .
#验证配置-可选
packer validate .
#构建镜像
packer build aws-demo.pkr.hcl

等待构建命令执行完成,镜像就构建完成了,可以登录进入到AWS的镜像服务,就能看到本次Packer构建的镜像了,演示完成后如不需要记得手动删除镜像。

本示例构建镜像过程耗时大约5分钟,相比之前手动操作效率提高不少,还可以把配置文件添加到代码仓库中,同代码一起进行版本管理,和Jenkins等工具结合,实现流水线构建镜像,AWS支持Windows镜像,需要使用Powershell脚本,参考官网文档:https://developer.hashicorp.com/packer/integrations/hashicorp/amazon/latest/components/builder/ebs#windows-2016-sysprep-commands-for-amazon-windows-amis-only。

AWS支持并行构建多个镜像,参考官网文档:https://developer.hashicorp.com/packer/tutorials/aws-get-started/aws-get-started-parallel-builds

Packer官方供应商还支持阿里云、腾讯云和OpenStack,没有华为云,但在华为云自己的文档中有使用Packer构建镜像文档,参考链接:https://support.huaweicloud.com/bestpractice-ims/ims_bp_0031.html,在阿里云、腾讯云和华为云中没有看到对Windows镜像支持的文档,对比来看,还是AWS使用文档最详细。

Packer介绍和演示到此结束,如果对你有帮助,请点个关注,嘿嘿。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛逼!字节 IDE 来了!!

前言 大家好,我是R哥。 最近做面试辅导,很多同学和我抱怨说,去 XX 公司面试,刚进公司,面试官还没有见着呢,就让我先手撕两道算法题,做不出来的话直接 GG。 没错,如果你想拿一份还不错的收入,想去中大厂,特别是字节、阿里、腾讯这些一线大厂,面试前都会有一次算法笔试…

虚拟串口工具和串口调试工具详解 - 附下载地址

简介 串口开发过程中, 一般需要以下工具用于开发和调试:虚拟串口工具简介 虚拟串口软件, 可以在系统中虚拟出串口, 这样开发人员可以在没有物理串口设备的情况下进行开发. 串口调试工具简介 串口调试工具主要用于给串口发送信息, 测试串口是否连通, 发送消息是否正常被接收等.本…

怎么用云游戏玩Steam?ToDesk云电脑新手入门教程

对于新手玩家来说,想要上手Steam游戏,这门槛真有点高。不说要从众多真假难辨的软件中找出正版,遇到Steam内想玩的游戏还得等着下载安装解压,费时又费力。玩家想解决这个困难也很简单,只需下个ToDesk云游戏即可。它是ToDesk云电脑中专门玩游戏的版块,预安装了上百款热门游…

Vuex与Redux比较

由于Vuex和Redux都是从Flux中衍生出来,同时Vuex对Redux部分思想也有一些借鉴,所以Vuex和Redux有很多相同点。很多资料也有介绍两者的对比,但大部分讲解的比较抽象,较难理解。笔者整理两者异同点,同时配有标准案例进行说明。注意本文不是科普vuex和redux相关概念,相关知识…

第6篇 Scrum 冲刺博客

作业要求这个作业属于哪个课程 计科34班这个作业的要求在哪里 团队作业4——项目冲刺这个作业的目标 1.站立式会议2.发布项目燃尽图3.每人的代码/文档签入记录4.适当的项目程序/模块的最新(运行)截图5.每日每人总结会议照片昨日已完成的工作/今天计划完成的工作成员 昨天已完…

RabbitMQ 五种模式

RabbitMQ是一种常用的消息队列服务,它提供了五种消息模型:简单模型、工作队列模型、发布/订阅模型、路由模型、主题模型。1. 简单模型(Simple Message Queue,简称SQS):一个生产者,一个消费者,一个队列。 2. 工作队列模型(Work Queue):多个消费者共同处理一个队列中的…

如何防止手机被远程控制,安全远控推荐ToDesk

随着电子设备及各样应用的兴起,手机可以为人们带来的便利已越来越多,从二十年前的联络通话,到现如今的社交娱乐、导航、缴费等;通过智能手机中的软件均可轻松实现。 然而虽然手机的妙用有很多,但对于一些不太善用电子设备的中老年亲友来说,在使用中却也存在一定的被诈骗风…

Docker不再神秘 ------Ubuntu20.04 安装Docker 及实用技巧,建议收藏

Dockerdocker是一种容器,简而言之就是别人把一堆环境配置好了,你可以下载下来直接拿来使用(我的个人理解),有点像虚拟机你知道吧。比如下面这样,我直接打开了一个小电脑(docker),里面桌面啊、root啊全都有,跟你ubuntu系统类似,单说细节还不完全一样,毕竟它轻便哈哈…

SELF-REFINE: Iterative Refinement with Self-Feedback

1. 概述 基于给定的Prompt,大语言模型生成的Reponse可能不是最好的(这一点我认为当前的LLM大部分都是Decoder架构,基于已生成的结果产生下一个Token,一旦之前生成结果出错,也不容易及时改正。)。 本文为原始的生成添加了额外的反思重写步骤,过程如下:对于给定的\(Input…

基于stm32的bacnet协议

bacnet协议对于国内网站来说,几乎可以说资料为零,通俗大论一遍,具体操作方法屁都没说 先从工具说起 开发工具 BACnetScan:(讯绕提供)(工具1) 链接:https://pan.baidu.com/s/1TJxc0xaEsCT3lJOlG78B7w 提取码:t7bw Yabe:(工具2) 链接:https://pan.baidu.com/s/1jfs…

未能加载文件或程序集 “项目名称对应的程序集,Version=1.0.0.0.culture=neutral.PublicKeyToken=null或它的某一个依赖项。系统找不到指定的文件。

Visual Studio 2022, AutoCAD开发, wpf项目, 因viewmodel中代码出现问题, 造成窗体设计器中无法预览(这个问题通过修改viewmodel代码解决), 删除项目路径下的obj及bin文件夹后, 重新生成项目, 出现新的错误:窗体能够显示了, 但个别控件无法正常显示, 以为是visual …

.Net Core关于项目引用和命名空间导入的一个小坑

.Net Core关于项目引用和命名空间导入的一个小坑 一、.Net Core项目嵌套引用的情况 经笔者测试验证,发现对于一个.Net Core项目Root,其引用另一个.Net Core项目Root.SubA后,Root项目会自动将Root.SubA项目引用的子项目,也纳入其引用项目池中,而无需再手动引用这些子项目。…