有什么方法可以让打包机连接到 Debian
genericcloud
镜像吗?我们没有使用 cloud-init,而是使用 packer 为我们的私有云创建我们自己的镜像模板。使用 iso 并构建图像模板可以直接进行。
nocloud
图像允许root登录而无需密码。不幸的是 ssh 端口 22 在 sshd_config
中被注释,因此 ssh 会失败,直到手动注释掉它,这使得自动化过程变得不可能。
有什么方法可以让加壳器将临时 pub 密钥注入到
genericcloud
图像中并连接到它以进行进一步修改吗?
我尝试使用 https://github.com/ivoronin/packer-plugin-sshkey 但我不太确定它应该如何工作,该过程停留在
Waiting for SSH to become available...
并在 ssh_wait_timeout
结束后中断。
谢谢
是的,有办法,花了几个小时才弄清楚。
使用 qemu 插件时,您可以指定
cd_files
和 cd_label
在本机内运行 cloud-init
,但有一点很重要。 cd_label
应该与大写字母的 "CIDATA"
完全一样,您还应该传递到 cd_files exactly 两个文件 user-data
和 meta-data
。
没有这个
cloud-init
就无法理解你。
有一个包含文件内容的示例目录:
$ ls -1
config.pkr.hcl
meta-data
packer_key
packer_key.pub
user-data
packer_key
是通过ssh-keygen
新生成的rsa ssh密钥文件,没有密码,packer_key.pub
它是公共部分
$ cat meta-data
#cloud-config
$ cat user-data
#cloud-config
users:
- name: root
ssh_authorized_keys:
- "here_is_content_of_packer_key.pub"
$ cat config.pkr.hcl
packer {
required_plugins {
qemu = {
version = "~> 1"
source = "github.com/hashicorp/qemu"
}
}
}
source "qemu" "example" {
accelerator = "kvm"
boot_command = []
disk_compression = true
disk_interface = "virtio"
disk_image = true
disk_size = "10000M"
boot_wait = "2s"
vm_name = "debian-genericcloud-amd64-packer.qcow2"
format = "qcow2"
headless = "false"
iso_checksum = "sha512:49cbcfdb3d5401e8c731d33211cff5e1ef884f179a936c7378eeab00c582ace45dd7154ac9e4c059f1bd6c7ae2ce805879cb381a12a1cc493e3a58c847e134c7"
iso_url = "https://cloud.debian.org/images/cloud/bookworm/20240102-1614/debian-12-genericcloud-amd64-20240102-1614.qcow2"
net_device = "virtio-net"
output_directory = "artifacts_tests"
cd_files = ["./user-data", "./meta-data"]
cd_label = "CIDATA"
qemuargs = [["-m", "16384M"], ["-smp", "8"]]
communicator = "ssh"
host_port_min = 2222
host_port_max = 2299
shutdown_command = "sudo shutdown -P now"
shutdown_timeout = "10s"
ssh_private_key_file = "./packer_key"
ssh_clear_authorized_keys = true
ssh_username = "root"
ssh_timeout = "20s"
}
build {
sources = ["source.qemu.example"]
provisioner "shell" {
inline = [
"apt-get update",
"apt-get install python3",
"apt-get autoclean",
"apt-get clean"
]
}
}
有了这个你应该能够重现构建