使用Packer创建私有镜像
Packer是一款可以创建自定义镜像的开源工具。Packer包含构建器(Builder)、配置器(Provisioner)、后处理器(Post-Processor)三个组件,通过json格式的模板文件,可以灵活组合这三种组件并行地、自动化地创建镜像文件。使用Packer通过配置代码的形式,降低了创建私有镜像复杂度,并且将创建镜像的过程变成可以配置管理代码的形式,在支持用户灵活定制个性化镜像的同时,也为镜像在不同云平台间的切换提供了一种新的途径。
本节以在CentOS 7.4 64bit云服务器中创建Ubuntu 16.04 Server 64bit私有镜像并上传到公有云平台为例,介绍使用Packer创建镜像的操作步骤。
约束与限制
不支持Packer使用整机镜像作为源镜像来创建私有镜像。
操作流程
安装Packer
- 登录管理控制台,创建一台弹性云服务器(以CentOS 7.4 64bit为例),并绑定弹性公网IP。
- 登录弹性云服务器。
- 在Packer工具下载页面选择与云服务器操作系统及架构类型相对应的Packer版本,版本号建议选择1.2.3到1.4.2之间。
- 执行以下命令,安装Packer(本节操作以packer_1.4.2_linux_amd64.zip为例)。
wget --no-check-certificate https://releases.hashicorp.com/packer/1.4.2/packer_1.4.2_linux_amd64.zip
- 需要提前给云服务器绑定弹性公网IP,以便能够访问外网。
- 如果执行本步骤命令后报“command not found”的错误,说明没有预装wget工具,需要执行yum install wget进行安装。
- 执行以下命令,解压Packer安装包。
- 执行以下命令,将Packer安装包移动至“/usr/local/bin”目录下。
- 执行以下命令,查询Packer版本号,检查Packer是否安装成功。
- 如果回显信息为Packer版本号,表示已完成Packer安装。
- 如果回显信息为“command not found”,表示Packer安装失败,请检查Packer所在目录是否被添加到环境变量中。
使用命令env | grep PATH打印环境变量,查看环境变量PATH是否包含Packer的安装目录。
如果环境变量PATH中没有包含Packer安装目录,请依次使用以下命令,将Packer的安装路径添加到环境变量PATH中:
定义Packer模板
使用Packer创建镜像,需要一个json格式的模板文件。在模板文件中,您需要指定构建器、配置器,还可以指定后处理器。在配置器中,您可以指定对源镜像的任何操作,可以指定安装软件也可以对相关配置做修改。在本示例中,我们使用后处理器重定向manifest的输出路径,如果您的Packer模板文件中有多个builders(构建器),你可以通过manifest的输出内容,找到每个builder创建镜像的ID。关于构建器、配置器以及后处理器的详细介绍请参考Packer官方文档。
本节操作以Shell配置器为例。
- 执行以下命令,创建hwcloud.json文件。
- 执行以下命令,打开hwcloud.json文件。
- 按“i”进入编辑模式,根据实际需求编写模板,以下内容仅供参考,参数列表请查看表1。
{ "builders": [{ "type": "openstack", "identity_endpoint": "https://iam.xxx.com/v3", "tenant_name": "xxx", "domain_name": "domain_name", "username": "username", "password": "password", "ssh_username": "root", "region": "xxx", "image_name": "Ubuntu-image-updating-powered-by-Packer", "instance_name": "Ubuntu-image-updating-powered-by-Packer", "source_image": "f1dd2272-7041-479e-9663-646632b6ac00", "availability_zone": "xxx", "flavor": "s3.medium.2", "use_blockstorage_volume": true, "networks": ["11d661c4-e41f-487f-a6f6-9b88d623dd5d"], "floating_ip": "8f686f9a-3408-4fdd-be75-ea768065800c" }], "provisioners": [{ "inline": [ "apt-get update -y" ], "inline_shebang": "/bin/sh -x", "type": "shell", "skip_clean": true }], "post-processors": [{ "strip_path": true, "output": "packer-template-ubuntu-updating-result.log", "type": "manifest" }] }
表1 Packer模板参数列表 参数
描述
是否为必选
type
保持默认值“openstack”。
是
identity_endpoint
身份鉴别节点地址,格式为:https://IAM的Endpoint/v3
其中,IAM的Endpoint可参考地区和终端节点获取。
是
tenant_name
项目名称。获取方式:
- 在管理控制台页面,鼠标悬停在右上角的用户名,选择“我的凭证”。
- 在“API凭证”页面获取项目名称(项目列表中的“项目”列)。
是
domain_name
帐号名。获取方式:
- 在管理控制台页面,鼠标悬停在右上角的用户名,选择“我的凭证”。
- 在“API凭证”页面获取帐号名。
是
username
IAM用户名。获取方式:
- 在管理控制台页面,鼠标悬停在右上角的用户名,选择“我的凭证”。
- 在“API凭证”页面获取IAM用户名。
是
password
管理控制台的登录密码。
是
ssh_username
待创建私有镜像的ssh登录用户名。
是
region
区域名称。参考地区和终端节点获取。
是
image_name
待创建私有镜像的名称。
是
instance_name
创建私有镜像时生成的临时实例的名称。此项如果不填写,系统会随机分配。
否
source_image
源镜像ID,可以从镜像服务控制台公共镜像列表获取。当然,如果您已有Ubuntu 16.04 Server 64bit系统的私有镜像,想通过Packer进行改造,此处也可以填写该私有镜像的ID。
是
availability_zone
可用区。参考地区和终端节点获取。
是
flavor
云服务器的规格。
是
use_blockstorage_volume
使用系统盘导出镜像,而不是整台服务器创建镜像。
是,且值必须设置为true。
networks
VPC子网网络ID。
是
floating_ip
弹性公网IP的ID。
如果在Packer创建的镜像实例中需要使用外网,那么该配置项必选。
provisioners
创建私有镜像时使用的Packer配置器类型。详情请参见Packer配置器。
是
post-processors
创建私有镜像时使用的Packer后处理器类型。
否
使用Packer创建镜像
- Packer模板文件制作完成后,请执行以下命令创建镜像。
运行结果如下所示:
openstack output will be in this color. ==> openstack: Loading flavor: s3.small.1 openstack: Verified flavor. ID: s3.small.1 ==> openstack: Creating temporary keypair: packer_5be8d358-2cc6-66a4-f1b5-31e8587c7bfa ... ==> openstack: Created temporary keypair: packer_5be8d358-2cc6-66a4-f1b5-31e8587c7bfa ==> openstack: Launching server... ==> openstack: Launching server... openstack: Server ID: fcf2014e-2f70-46c5-80d5-870ae0d1e659 ==> openstack: Waiting for server to become ready... openstack: Selected floating IP: '8f686f9a-3408-4fdd-be75-ea768065800c' (119.3.67.11) ==> openstack: Associating floating IP '8f686f9a-3408-4fdd-be75-ea768065800c' (119.3.67.11) with instance port... openstack: Added floating IP '8f686f9a-3408-4fdd-be75-ea768065800c' (119.3.67.11) to instance! ==> openstack: Using ssh communicator to connect: 119.3.67.11 ==> openstack: Waiting for SSH to become available... ==> openstack: Connected to SSH! ==> openstack: Provisioning with shell script: /tmp/packer-shell133419321 openstack: + apt-get update -y openstack: Hit:1 http://archive.ubuntu.com/ubuntu xenial InRelease ...... openstack: Fetched 7,088 kB in 9s (778 kB/s) openstack: Reading package lists... ==> openstack: Stopping server: fcf2014e-2f70-46c5-80d5-870ae0d1e659 ... openstack: Waiting for server to stop: fcf2014e-2f70-46c5-80d5-870ae0d1e659 ... ==> openstack: Creating the image: CentOS-image-updating-powered-by-Packer openstack: Image: 9eccbb17-9aed-4beb-bf44-1e8c80448ba3 ==> openstack: Waiting for image CentOS-image-updating-powered-by-Packer (image id: 9eccbb17-9aed-4beb-bf44-1e8c80448ba3) to become ready... ==> openstack: Terminating the source server: fcf2014e-2f70-46c5-80d5-870ae0d1e659 ... ==> openstack: Deleting temporary keypair: packer_5be8d358-2cc6-66a4-f1b5-31e8587c7bfa ... ==> openstack: Running post-processor: manifest Build 'openstack' finished. ==> Builds finished. The artifacts of successful builds are: --> openstack: An image was created: 9eccbb17-9aed-4beb-bf44-1e8c80448ba3 --> openstack:
- 命令执行成功后,登录控制台,选择“计算 > 镜像服务”。
- 在“私有镜像”列表页面,查看使用Packer创建的镜像,如图1所示。
相关链接
Packer官方指导:https://www.packer.io/intro/getting-started/install.html
