主动化构建镜像:Packer

打印 上一主题 下一主题

主题 1008|帖子 1008|积分 3024

在介绍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步伐。
  1. packer {
  2.   required_plugins {
  3.     amazon = {
  4.       version = ">= 1.2.8"
  5.       source  = "github.com/hashicorp/amazon"
  6.     }
  7.   }
  8. }
  9. source "amazon-ebs" "ubuntu" {
  10.   ami_name      = "aws-demo-ubuntu-{{timestamp}}"
  11.   instance_type = "t3.micro"
  12.   region        = "ap-east-1"
  13.   source_ami    = "ami-0ad7f83eab34d93a7"
  14.   ssh_username  = "ubuntu"
  15. }
  16. build {
  17.   name = "learn-packer"
  18.   sources = [
  19.     "source.amazon-ebs.ubuntu"
  20.   ]
  21.   provisioner "shell" {
  22.     environment_vars = [
  23.       "FOO=hello world",
  24.     ]
  25.     inline = [
  26.       "echo Installing Redis",
  27.       "sleep 30",
  28.       "sudo apt-get update",
  29.       "sudo apt-get install -y redis-server",
  30.       "echo "FOO is $FOO" > example.txt",
  31.     ]
  32.   }
  33. }
复制代码
在具体执行前先设置下面两个环境变量,AWS的AK和SK,Packer会读取环境变量就能有权限操纵AWS了。
  1. export AWS_ACCESS_KEY_ID="<YOUR_AWS_ACCESS_KEY_ID>"
  2. export AWS_SECRET_ACCESS_KEY="<YOUR_AWS_SECRET_ACCESS_KEY>"
复制代码
依次执行下面命令,就能完成镜像的构建了,先辈行初始化,格式化和验证设置文件命令是可选的,末了举行镜像构建,操纵看着和Terraform非常相似。
  1. #初始化
  2. packer init .
  3. #格式化配置-可选
  4. packer fmt .
  5. #验证配置-可选
  6. packer validate .
  7. #构建镜像
  8. 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介绍和演示到此结束,如果对你有帮助,请点个关注,嘿嘿。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

美食家大橙子

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表