Hashicorp Packer如何在实例首次运行时执行初始化操作?
HashiCorp Packer构建AWS Ubuntu镜像首次启动初始化的原生解决方案
有原生支持的方案,无需自行实现单次运行的逻辑判断,可按需选择以下两种方式:
- 方案1:通过Packer AWS构建器的user_data参数传入初始化逻辑
Packer官方提供的AWS EBS等构建器原生支持user_data、user_data_file配置项,你可以直接把初始化脚本通过该参数传入。Ubuntu官方镜像默认预装cloud-init组件,会在实例首次启动时自动执行传入的user_data内容,且默认仅执行一次,无需额外做去重判断。
配置示例:source "amazon-ebs" "ubuntu" { ami_name = "custom-ubuntu-{{timestamp}}" instance_type = "t2.micro" region = "us-east-1" source_ami_filter { filters = { name = "ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*" root-device-type = "ebs" virtualization-type = "hvm" } most_recent = true owners = ["099720109477"] } ssh_username = "ubuntu" # 直接传入初始化脚本 user_data = <<EOF
#!/bin/bash
apt update -y
apt install -y nginx
systemctl enable --now nginx
EOF
# 也可读取外部脚本文件:user_data_file = "./init.sh"
}
- *方案2:将初始化逻辑固化到镜像内部,依托cloud-init原生目录实现单次运行* 如果你不希望依赖实例启动时传入user_data,想要把初始化逻辑直接打包进AMI,可以在构建阶段通过shell provisioner把脚本写入cloud-init原生的`/var/lib/cloud/scripts/per-instance/`目录,该目录下的可执行文件会在每个实例首次启动时自动执行一次,不会重复运行。 配置示例: ```hcl provisioner "shell" { inline = [ "sudo mkdir -p /var/lib/cloud/scripts/per-instance/", "sudo tee /var/lib/cloud/scripts/per-instance/custom-init.sh <<'EOF'", "#!/bin/bash", "# 此处写你的初始化逻辑", "echo '首次初始化完成' > /tmp/init_mark", "EOF", "sudo chmod +x /var/lib/cloud/scripts/per-instance/custom-init.sh" ] }
内容的提问来源于stack exchange,提问作者4xy
相关产品推荐
相关产品推荐

