什么是Packer

简单介绍一下自己

Packer 是一个轻量命令行工具, 能在几乎所有主流的操作系统上运行。

在给定一份配置文件的情况下, Packer 能为多种系统架构创建云主机镜像。同时 Packer 自身也能够做到多镜像并发创建, 大大节省了镜像创建过程中的时间成本。

为什么要用 Packer

为什么呢?

当然是因为使用预制的镜像有非常多的好处, 最简单来说,就是能最大程度地保证不同机器上服务的一致性(以经验来看这一点非常重要)。但是在实际使用中, 镜像因其创建/管理的工作单调且复杂, 很多情况下镜像还没有被完全普及。

现有的镜像自动化创建工具, 要么是不好用或不方便, 要么就是学习曲线太高。这些特点导致运维团队投入过多的精力在镜像的使用中, 进而导致工作效率以及敏捷性被阻碍。这就是为什么虽然镜像的工作方式具有非常多的优势,但是却依旧没有被大规模的普及。

Packer 依据单个的配置文件, 能做到流水线式 + 并发的创建镜像,与传统手工操作相比,其 "Infrastructure as Code" 的工作方式也大大减少了失误的概率。

至少在 Packer 官方认为:

Packer brings pre-baked images into the modern age,

unlocking untapped potential and opening new opportunities.

Infrastructure as Code 的工作方式

在这个理念被提出之前, 手工+脚本的方式非常普遍, 手工容易出错, 而脚本本身也要投入很多人力来进行维护。与此同时,一些主流的云服务厂商也在积极寻找更多的可能性。2019年4月, 在我们发布了 terraform-provider-jdcloud插件以后, 目前一些团队在使用 Terraform 的京东云插件, 有的会在 Github 上留下 issues, 有的是通过留言,表示希望能增加更多功能。用户的这些表现都从侧面验证了 "Infrastructure as Code" 工作方式的可靠性和敏捷性。

到了 Packer, 这些特性依旧被保留下来。相较于传统方式,IaC 被认为是: "Modern and Automated" , 同样是一份简单的 json 配置文件,IaC 鼓励开发者开始使用镜像, 同时使用 Packer 自动化、流水线化地管理镜像, 从而减少镜像本身管理带来的负担。

介绍一些日常的使用场景

  • 持续交付 - Packer&Chef&Puppet: Packer 因其自身体积轻量的特点, 使其被直接放到流水线里并成为流水线的一环也变成了一种可能的选择: 在 Chef/Puppet 的配置产生变动的时候触发流水线, 下一环 Packer 负责为新配置生成镜像, 这些镜像可以立刻投入测试, 测试通过后即可部署到生产环境。
  • 混合云的使用: Packer 的一份配置可以为多个云服务商生成镜像, 假设你使用 VMWare 作为开发环境, AWS 作为生产环境, 那么 Packer 能够并发生成两份镜像用于两家云服务商, 从而最大程度地减少两个镜像之间的区别。

详细一些, Packer 还包含有这些优势

  • 对于临时产物的处理上: Packer 能为你创建一些临时资源,比如在没有指定子网的情况下,Packer 能够帮你创建一个临时子网,用于安放云主机。并且在出现错误的时候终止任务,同时自动清理中间产物。而传统方式则需要自己先创建一个临时子网,并且出现错误时还需要手动清理。

  • 在问题的追溯与定位上: 在 Packer 上所有变化都是基于代码的,而代码是可以追溯的,方便快速定位问题并回滚。而在传统方式中,考虑到手动操作的过程可能涉及多人,完整地追出问题并不是一件容易的事儿。

  • 在便捷性与效率上: 由于 Packer 上的操作基于代码,变更的时候操作会非常快;而手动操作的效率则取决于个人的手速了。

  • 在操作的可重复性上: Packer 依据配置文件,随时快速重新操作;而在全手动的情况下, 想要完整的复现一次所有操作并不容易。Packer 上代码的可重复利用也说明你可以用最快的速度再创建一个一模一样的(测试)环境。

立刻开始使用 Packer

安装 Packer

安装 Packer 我们推荐去 Packer官网 下载一个二进制包,解压后直接就可以使用。另外对于 Mac OS X 用户, 也可以使用 HomeBrew 直接进行安装。

$ brew install packer

准备配置文件

在开始之前,你需要准备一份配置文件jdcloud.json,在配置文件里给出相应的参数。

配置文件的模板如下:

 {
"builders": [
{ # 服务商与身份信息
"type": "jdcloud",
"access_key": "<Your access_key>",
"secret_key": "<Your secret_key>",
# 云主机规格信息
"image_id": "<Base Image Id>",
"region_id": "cn-north-1",
"az": "cn-north-1c",
"instance_name": "packer_demo",
"instance_type": "g.n2.medium",
"ssh_password": "DevOps2018",
"image_name": "packer_image_demo",
"subnet_id": "subnet-jo6e38sdli", # 登录设置(不用改)
"communicator": "ssh",
"ssh_username": "root"
}
], "provisioners": [
{
"type": "shell",
"inline": [ # 云主机运行的脚本信息
"sleep 30",
"sudo apt update",
"sudo apt install nginx -y"
]
}
]
}
  • 服务商与身份信息 : 服务提供商-jdcloud, 其次你需要提供你的AccessKey/SecretKey 向我们说明你的身份。
  • 云主机规格信息 :

    这里包含:

云主机/地域/可用区/机型与规格

基础镜像: 可以是京东云官方提供的 Centos/Ubuntu,也可以是你的私人镜像,将它的ID填写在这里即可。

子网信息: 可以为空,如果为空的话,我们会为你创建一个临时的子网。

登录密码: 在这里我们选择使用密码来登录,在这儿还有另一个示例,会告诉用户如何使用秘钥的方式来创建云主机镜像。

  • 运行命令: 在这里作为示例,我们选择安装一个 nginx。

使用配置文件开始创建镜像

bash
~ $ packer build jdcloud.json ==> jdcloud: Validating parameters...
jdcloud: validating your subnet:subnet-xxx
jdcloud: subnet found: Packer 测试子网
jdcloud: validating your base image:img-1iubdz7gzu
jdcloud: image found:Ubuntu 16.04 64位
jdcloud: Password detected, we are going to login with this password :) ==> jdcloud: Creating instances
jdcloud: Creating public-ip
jdcloud: Associating public-ip with instance
jdcloud: Hi, we have created the instance, its name=packer_demo , its id=i-xxxx, and its eip=116.196.xx.xx :) ==> jdcloud: Using ssh communicator to connect: 116.196.xx.xx
==> jdcloud: Waiting for SSH to become available...
==> jdcloud: Connected to SSH!
==> jdcloud: Provisioning with shell script
==> jdcloud: Stopping this instance
jdcloud: Instance has been stopped :)
==> jdcloud: Creating images
Build 'jdcloud' finished. ==> Builds finished. The artifacts of successful builds are:
--> jdcloud: A VMImage was created: img-riggr2xxx

在上面的创建过程中, 我们可以看到, 镜像的创建过程大体可以分成四个阶段:

  1. 阶段-1 参数验证阶段: 在这个阶段里我们将要去验证参数的有效性,包括是否指定子网,需不需要创建临时子网,给出的运行镜像是否存在,是否指定使用密码登录或指定密钥登录。
  2. 阶段-2 创建云主机阶段: 在这个阶段我们按照给出的云主机规格创建出一台云主机,并创建出一个公网IP, 用于稍后登录这台云主机执行命令。
  3. 阶段-3 执行命令阶段: 命令的输出都会打印在这里。
  4. 阶段-4 创建镜像阶段: Packer 会将这台云主机创建出一个镜像,并保存到镜像仓库里, 在上面我们可以看到对应的镜像ID为:img-riggr2xxx。

创建出来的新镜像,用户可以拿来手动创建云主机,也可以通过 terraform 自动创建云主机。

更进一步地,如果考虑到服务的多地域性,用户可能会希望为每个地域都创建出各自的专属镜像。这个时候,只需要在配置文件后面追加出其余地域的配置信息,Packer 就能在一次并发内完成所有镜像的创建,很大程度的提升了镜像创建的效率。

Packer 以其 "Infrastructure as Code" 的工作方式,在帮助用户降低失误故障风险的同时,提高了持续交付效率和业务可用性,解决了传统镜像创建方式在跨云平台环境下的诸多弊端。

看了这篇文章,您是否对Packer有一个全面的了解呢?如果您想了解更多关于京东云翼的相关讯息,请点击“这里”,进入京东云官网了解相关产品噢~

欢迎点击“京东云”了解更多精彩内容



DevOps专题|Packer使用教程的更多相关文章

  1. DevOps专题 |监控,可观测性与数据存储

    对于DevOps而言,监控是其中重要的一环,上一次的专题内容中,我们与大家分享了大型企业级监控系统的设计.今天我们将和大家从另一个角度进一步探讨互联网工程技术领域的监控设计(monitoring):系 ...

  2. DevOps专题|玩转Kubernetes网络

    Kubernetes无疑是当前最火热的容器编排工具,网络是kubernetes中非常重要的一环, 本文主要介绍一些相应的网络原理及术语,以及kubernetes中的网络方案和对比. Kubernete ...

  3. DevOps专题|Lua引擎打造超轻量级客户端

    Lua 作为一门轻量级脚本语言,源码使用标准C语言发布,语法简洁,非常适合嵌入式.客户端.游戏等场景. Lua引擎语言特点 轻量级 源码简单,以lua最新版5.3.5为例,加上lua自身提供的lib库 ...

  4. DevOps专题 | 大型企业级监控系统设计

    10月30日,全球权威数据调研机构IDC正式发布<IDCMarketScape: 中国DevOps云市场2019,厂商评估>报告.京东云凭借丰富的场景和实践能力,以及高质量的服务交付和平台 ...

  5. DevOps专题|基础Agent部署系统

    随着京东云业务规模.管理机器规模的扩大,各类agent也在逐渐增多,如日志agent.监控agent.控制系统agent等.这对agent的部署.升级.状态维护提出了很高的要求,一旦某个全局agent ...

  6. [转载]逐步建设企业DevOps能力

    当软件行业进入互联网时代,市场对软件产品和服务的交付提出了更高的要求:不仅要快速实现需求,而且要快速发布上线,并且必须保证业务可靠.高效运行.为了满足这些要求,IT组织需要强有力的流程.技术和人员作为 ...

  7. [转载] DevOps年中盘点:国外最受欢迎的10篇技术文章

    本文根据高效运维系列微信群的群友投稿整理而成.“高效运维”公众号作为本系列群的官方唯一公众号,原创并独家首发. 欢迎关注“高效运维”公众号,以免费参加「运维讲坛」每月一次的线下交流活动:并抢先赏阅干货 ...

  8. Fbric、Ansible、Docker、Chaos Monkey:DevOps工具的年中回顾

    Fbric.Ansible.Docker.Chaos Monkey:DevOps工具的年中回顾 [编者按]近日,Cyber Engineering Solutions Group 技术经理 Hasan ...

  9. DevOps之服务器

    唠叨话 关于德语噢屁事的知识点,仅提供专业性的精华汇总,具体知识点细节,参考教程网址,如需帮助,请留言. <服务器(Server)> DevOps之服务器划分为三部分:系统.虚拟化.器件. ...

随机推荐

  1. 留学Essay写作:精准用词很重要

    很多觉得自己英语成绩还行的同学经常在自己的文章里用一些浮夸或者是难度特别大的词语,以显示自己的英语水平.当然了,成功了倒也无可厚非,要是有些词语用错了那可是会被别人笑掉大牙的.因此英语中的精准用词就成 ...

  2. 区块链 - 哈希(Hash)

    章节 区块链 – 介绍 区块链 – 发展历史 区块链 – 比特币 区块链 – 应用发展阶段 区块链 – 非对称加密 区块链 – 哈希(Hash) 区块链 – 挖矿 区块链 – 链接区块 区块链 – 工 ...

  3. gpg加密和解密

    linux:gpg加密和解密 1 创建密钥 2 查看私钥 3 导出公钥 4 导出私钥 5 导入秘钥 5.1 公钥 6 公钥加密 7 私钥解密 创建密钥 gpg --gen-key 你要求输入一下内容, ...

  4. uboot配置和编译过程详解

    根据朱有鹏老师讲解整理 一.uboot主Makefile分析 1.uboot version确定(Makefile的24-29行) include/version_autogenerated.h文件是 ...

  5. 2013蓝桥杯预赛C/C++本科B组

    题目标题: 高斯日记 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示那一天是高斯 ...

  6. Python最新暴力破解WiFi,攻破所有密码限制,最强破解!

    暴力破解wifi密码 这个代码也是非常简单,这里需要用Python中的pywifi这个库,所以需要在DOS命令下安装这个库,同样使用pip install pywifi,很简单就安装成功了,我用的是P ...

  7. java关键字“static”

    Java中static使用方法 1.static静态变量 静态变量:每个类只有一个,所有实例共享: 实例变量:每个实例只有一个: package test2; import java.lang.Str ...

  8. ②java基础——标识符、关键字和基础数据类型

    Java标识符: 1.由英文字母.数字._(下划线)和$组成,长度不限.其中英文字母包含大写字母(A~Z)和小写字母(a~z),数字包含0到9 2.标识符的第一个字符不能是数字(即标识符不能以数字开头 ...

  9. 七、Vue组件库:Element、Swiper(轮播专用组件)

    一.vue的Element组件库 官网:https://element.eleme.cn/#/zh-CN 1.1安装 推荐安装方法: 首先要进入项目目录 cnpm i element-ui -S 或 ...

  10. 剑指offer自学系列(三)

    题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变,例如{5,1,4,2 ...