使用Packer构建镜像
什么是Packer
Packer 是一个强大的工具,它可以帮助我们轻松地构建各种类型的镜像,如虚拟机镜像、Docker 镜像等。
Packer 的工作原理是通过定义一个配置文件,该文件描述了要构建的镜像的特征和要求。然后 Packer 使用这个配置文件来执行一系列的步骤,例如安装必要的软件、配置系统设置、复制文件等,最终生成一个可用的镜像。
为什么要用 Packer
使用 Packer 构建镜像的好处是多方面的。
- 可移植性:首先,它提供了一种可重复的、自动化的方式来创建镜像,这意味着我们可以确保每次构建的镜像都是一致的,从而减少了人为错误的风险。其次,Packer 支持多种基础设施提供商,如 AWS、VMware、Azure 等,这使得我们可以在不同的环境中轻松地部署镜像。
- 自动化:Packer 依据单个的配置文件, 能做到流水线式 + 并发的创建镜像,与传统手工操作相比,其 "Infrastructure as Code" 的工作方式也大大减少了失误的概率。
- 问题的追溯与定位:在 Packer 上所有变化都是基于代码的,而代码是可以追溯的,方便快速定位问题并回滚。而在传统方式中,考虑到手动操作的过程可能涉及多人,完整地追出问题并不是一件容易的事儿。
- 快速迭代:Packer 的配置文件是可编辑的,因此我们可以轻松地修改配置文件,然后重新构建镜像,从而快速迭代。
Packer的组成及及原理
Packer包含构建器(Builder),(派生器)Provisioner,(后处理器)Post-Processor三个组件,通过JSON格式的模板文件,可以灵活的组合这三种组件并行的、自动化的创建多平台一致的镜像文件。为单个平台生成镜像的单个任务称为构建,而单个构建的结果也称为工件(Artifact),多个构建可以并行运行。
- Builder又称构建器,能够为单个平台创建镜像。构建器读取一些配置并使用它来运行和生成镜像。作为构建的一部分调用构建器以创建实际生成的镜像。常见的构建器包括VirtualBox,Alicloud ECS和Amazon EC2。构建器可以以插件的形式创建并添加到Packer中。
- Provisioner(派生器),这一组件在Buider创建的运行的机器中安装和配置软件。他们执行使镜像包含有用软件的主要工作。常见的派生器包括shell脚本,Chef,Puppet等。
- Post-Processors(后处理器),它使用构建器或另一个后处理器的结果来创建新工件的过程。例如压缩后处理器压缩工件,上传后处理器上传工件等。
落地
- 通过qemu-kvm本地构建镜像
- 通过gitlab仓库管理镜像构建的参数配置模板
- 通过gitops触发构建,跟踪构建日志以及构建结果(提交模板变更merge request,通过评论触发构建任务)
工具 | 版本 | 说明 |
---|---|---|
Packer | 1.9.4 | 官方文档 |
Packer-plugin-qemu | 1.0.10 | Packer 插件 |
qemu-kvm | 7.0.0 | QEMU 7.0.0 |
模板
packer {
required_plugins {
qemu = {
source = "github.com/hashicorp/qemu"
version = ">= 1.0.10"
}
}
}
variable "checksum" {
type = string
default = "xxxxxxx"
}
variable "ssh_password" {
type = string
default = "xxxxx"
}
source "qemu" "autogenerated_1" {
accelerator = "kvm"
boot_command = ["<tab> inst.text ", "console=ttyS0,115200n8 ", "inst.ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/ks/rocky9.ks ", "nameserver=1.1.1.1 ", "<enter><wait> "]
boot_wait = "0s"
communicator = "ssh"
format = "qcow2"
headless = true
iso_checksum = "sha256:${var.checksum}"
iso_url = "../../../Rocky-9.2-x86_64-minimal.iso"
qemu_binary = "/usr/libexec/qemu-kvm"
qemuargs = [["-m", "4096"], ["-smp", "2,sockets=2,cores=1,threads=1"], ["-cpu", "host"], ["-serial", "file:serial.out"]]
shutdown_command = "/sbin/halt -h -p"
shutdown_timeout = "120m"
ssh_password = "${var.ssh_password}"
ssh_timeout = "1500s"
ssh_username = "root"
http_content = {
"/ks/rocky9.ks" = file("../../kickstart/rocky9.ks")
}
}
build {
description = "\tMinimal Rockylinux 9 Qemu Imageni\n__________________________________________"
sources = ["source.qemu.autogenerated_1"]
provisioner "shell" {
script = "./provisioner.sh"
}
# provisioner "file" { // 拷贝配置文件
# destination = "/etc/cloud/cloud.cfg"
# source = "../../resource/cloud.cfg"
# }
}
配置库组织形式
- 配置仓库模板化了kickstart文件(这个部分往往是不经常变动的)
- 对于不同镜像的模板文件放在不同的目录下,方便管理
- 同一个镜像目录下三个文件
- packer的hcl文件(packer模板主文件)
- provisioner.sh 制备过程中脚本,镜像中需要安装的包,修改的文件等等
- env.yaml 为了联动DevOps系统的一些配置,比如标识当前这个镜像的版本、类型、用途等等
- resources 目录主要存放一些资源文件,如配置文件,脚本等等
├── kickstart # kickstart 配置文件存放目录
│ ├── rocky9.ks
├── packer # 不同版本镜像模板文件
│ ├── rocky9
│ │ ├── rocky9.pkr.hcl
│ │ ├── provisioner.sh # 制备过程中脚本,安装包,修改内核参数等等
│ │ ├── env.yaml # 系统一些配置,如os_type,os_version
│ ├── centos7
│ │ ├── centos7.pkr.hcl
│ │ ├── provisioner.sh
│ │ ├── env.yaml # 系统一些配置,如os_type,os_version
├── resources # 一些资源文件,配置文件可以直接cpoy过去
效果
好处
- 提升构建镜像自动化程度,提升效率:以往运维同学手动到云上打镜像得到镜像ID然后配置到DevOps系统中
- 镜像版本可以描述,版本可追溯,更透明:以往的镜像版本都是通过人工打的,过段时间没人知道当前运行的镜像里面做了哪些改动,装了哪些东西,具有什么特性
使用Packer构建镜像的更多相关文章
- Dockerfile 构建镜像 - 每天5分钟玩转容器技术(13)
Dockerfile 是一个文本文件,记录了镜像构建的所有步骤. 第一个 Dockerfile 用 Dockerfile 创建上节的 ubuntu-with-vi,其内容则为: 下面我们运行 dock ...
- 使用Dockerfile构建镜像-Docker for Web Developers(5)
1.理解Dockerfile语法 语法命令 命令功能 举例 FROM 所有的dockerfile都必须以FROM命令指定镜像基于哪个基础镜像来制作 FROM ubuntu:14:04 MAINTAIN ...
- Docke--利用 commit 理解构建镜像
Docker 利用commit理解构建镜像 镜像是容器的基础,每次执行 docker run 的时候都会指定哪个镜像作为容器运行的基础.当我们使用Docker Hub的镜像无法满足我们的需求时,我们就 ...
- docker(四) 使用Dockerfile构建镜像
下面以一个例子来演示构建镜像的过程. #在/tmp目录下演示 cd tmp mkdir build-redis-image 1.创建Dockerfile文件 vim Dockerfile 并写入如下内 ...
- Docker:dockerfile自动构建镜像 [六]
一.手动docker镜像的缺点 相对于手动制作的docker镜像,使用dockerfile构建的镜像有以下优点: 1.dockerfile只有几kb,便于传输 2.使用dockerfile构建出来的镜 ...
- docker学习构建镜像---第三章节
一.docker镜像使用 运行docker容器时,使用的镜像如果在本地不存在,docker会自动从docker镜像仓库中下载,默认是从docker hub公共镜像源下载 在这里,我们需要了解:管理和使 ...
- Docker系列(三)Dockerfile 离线构建镜像
一.Dockfile介绍: Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令.Docker程序将这些Dockerfil ...
- docker构建镜像
Docker 提供了两种构建镜像的方法: docker commit 命令Dockerfile 构建文件 示例: Dockerfile FROM golang:1.7.5 #基础镜像 RUN apt- ...
- 使用Dockerfile来构建镜像
Dockerfile原理 创建Dockerfile Dockerfile实例 Dockerfile指令 注释 FROM MAINTAINER RUN ADD WORKDIR ENV USER COPY ...
- Docker build Dockerfile 构建镜像 - 二
Dockerfile 制作镜像 https://hub.docker.com/ 搜索需要镜像: https://hub.docker.com/_/centos/ 官方示例: centos:6 1.这里 ...
随机推荐
- STM32 CubeMX 学习:06-配置DMA
--- title: mcu-stm32-cube-06-配置DMA date: 2020-05-31 16:39:05 categories: tags: - stm32 - cubeMx - dm ...
- FFMpeg 中的数据结构
FFMpeg 中比较重要的函数以及数据结构如下: 数据结构: (1) AVFormatContext (2) AVOutputFormat (3) AVInputFormat (4) AVCodecC ...
- P8571 题解
既然字符串的总长一定,不妨对于每个询问中的 \(s_k\) 的长度根号分治,假定分治阈值为 \(B\).下面令 \(L\) 为所有串长度总和. 对于长度大于 \(B\) 的字符串,这样的不同字符串至多 ...
- 作业错题集锦(pta英文数据结构)
A graph with 30 vertices and 40 edges must have at most twenty one connected component(s). 要计算最大连通分量 ...
- 类、事件与对象---Dad&Mom简单练习
目的: 模拟一个家庭日常发生的场景:妈妈做好饭,说:"开饭了!",这是爸爸听到了妈妈的喊话就立马动身开始饭吃.而儿子此时正在打游戏,于是他就说:"等我打完这把游戏再吃!& ...
- [oeasy]python0043_八进制_oct_octal_october_octave
八进制(oct) 回忆上次内容 什么是 转义? 转义转义 转化含义 \ 是 转义字符 \n.\r是 转义序列 还有什么 转义序列 吗? \a是 响铃 \b 退格键 \t 水平制表符 tab键 \v.\ ...
- ABC361-D题解
背景 保佑LC能来一中. 题意 给你一个长度为 \(n\) 的初始字符串和目标字符串,都由 W 和 B 两种字符构成. 现在初始字符串末尾接有两个空格字符,每次你可以在该字符串中选出连续两个非空格字符 ...
- 深入理解 Vue 3 组件通信
在 Vue 3 中,组件通信是一个关键的概念,它允许我们在组件之间传递数据和事件.本文将介绍几种常见的 Vue 3 组件通信方法,包括 props.emits.provide 和 inject.事件总 ...
- Flink 架构学习总结
Flink是一个分布式系统,要求有效地分配和管理计算资源以执行流式应用程序.它集成了所有常见的集群资源管理器,如Hadoop YARN和Kubernetes,但也可以设置为作为standalone甚至 ...
- c++ 17 demo
1 // Cpp.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. 2 // 3 4 #include <iostream> 5 #includ ...