更新Ansible与Packer后AWS AMI构建包安装失败问题
问题分析与解决方案
可能原因
- APT源初始化竞态:Ubuntu 20.04的AWS镜像会通过cloud-init在后台完成APT源配置、缓存更新等初始化操作。更新Packer并转为HCL格式后,可能遗漏了原有的实例就绪等待逻辑,导致Ansible在cloud-init未完成时就执行安装任务,此时APT源列表不完整,无法找到
build-essential、supervisor等包。添加输出操作相当于人为增加延迟,给cloud-init足够时间完成初始化,因此能临时推进流程。 - Ansible apt模块缓存逻辑变化:Ansible Core 2.13.x的apt模块对缓存的处理与旧版本存在差异,未强制刷新缓存就尝试安装,导致使用过期缓存找不到目标包。
- Packer HCL配置缺失等待机制:从JSON转HCL时,可能丢失了原配置中用于等待实例完全就绪的参数(如
pause_before_connecting),使得Ansible过早连接实例执行任务。
解决方案
1. 等待cloud-init完全结束
在所有APT相关任务前添加等待步骤,确保系统初始化完毕:
- name: Wait for cloud-init to finish initialization shell: | until [ -f /var/lib/cloud/instance/boot-finished ]; do sleep 10 done args: warn: false
2. 强制刷新APT缓存并添加重试机制
修改安装任务流程,先强制更新APT缓存,并给操作添加重试逻辑,应对网络或初始化延迟:
- name: Update APT package cache apt: update_cache: yes cache_valid_time: 3600 retries: 5 delay: 10 register: apt_update_result until: apt_update_result is succeeded - name: Install common system dependencies apt: name: - htop - nano - wget - perl - unzip - tcpdump - build-essential - python3-distutils - libwww-perl - supervisor - mysql-client state: present retries: 3 delay: 5
3. 调整Packer配置增加连接前等待
在Packer的amazon-ebs builder中添加连接前的等待时间,给实例足够时间完成初始化:
source "amazon-ebs" "autogenerated_1" { # 现有配置 filters = { name = "ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*" root-device-type = "ebs" virtualization-type = "hvm" } # 添加连接前等待配置 pause_before_connecting = "45s" }
4. 确保必要仓库已启用
supervisor等包位于Ubuntu的universe仓库,需确认该仓库已启用:
- name: Enable Ubuntu universe repository apt_repository: repo: "deb http://archive.ubuntu.com/ubuntu/ focal universe" state: present update_cache: yes
验证步骤
- 按顺序执行等待cloud-init、启用仓库、更新缓存、安装包的任务。
- 若仍出现错误,执行
cat /etc/apt/sources.list检查源配置是否正常,确认包含Ubuntu官方源。
内容的提问来源于stack exchange,提问作者user24463998
相关产品推荐
相关产品推荐

