创建AWS AMI时Ansible如何动态匹配OS版本加载对应变量文件
Ansible动态匹配OS版本加载变量文件实现方案
现有问题
使用Packer构建AWS AMI时,原有变量加载逻辑硬编码了系统版本号,配置如下:
- name: read variables for ubuntu 20.04 include_vars: "vars_os_ubuntu-20.yml" when: ansible_distribution == "Ubuntu" and ansible_distribution_version == "20.04"
该配置仅适配Ubuntu 20.04版本,后续新增Ubuntu 22.04、24.04等版本支持时,需要重复新增对应判断规则,维护成本高。
实现方案
Ansible执行时会自动采集目标主机的系统事实(facts),直接基于内置事实变量拼接变量文件路径即可实现动态匹配,不需要手动维护版本判断条件。
基础实现(匹配现有文件命名规则)
当前变量文件命名规则为vars_os_<系统名>-<主版本号>.yml(比如vars_os_ubuntu-20.yml对应Ubuntu 20.04),直接用下面的配置替换原有硬编码逻辑即可:
- name: 动态加载对应系统版本的变量文件 include_vars: "vars_os_{{ ansible_distribution | lower }}-{{ ansible_distribution_major_version }}.yml"
关键变量说明:
ansible_distribution | lower:自动获取系统发行版名称并转为小写,比如Ubuntu输出ubuntu、CentOS输出centos,匹配文件名的系统名前缀ansible_distribution_major_version:自动获取系统主版本号,比如Ubuntu 20.04输出20、22.04输出22、24.04输出24,正好匹配现有文件名的版本后缀- 后续新增系统版本支持时,只需要按照命名规则新增对应变量文件即可,不需要修改任务逻辑。
容错增强版(适配缺文件场景)
如果存在某个新版本暂时没有对应专属变量文件的情况,可以加默认配置兜底,避免任务直接报错中断:
- name: 加载系统变量文件,优先匹配版本专属文件,缺省使用默认配置 include_vars: "{{ item }}" loop: - "vars_os_{{ ansible_distribution | lower }}-{{ ansible_distribution_major_version }}.yml" - "vars_os_{{ ansible_distribution | lower }}_default.yml" failed_when: false
执行逻辑为优先尝试加载对应版本的专属变量文件,加载失败时自动加载同发行版的默认变量文件。
完整版本号匹配场景
如果后续变量文件需要绑定完整小版本号(比如命名为vars_os_ubuntu-20.04.yml),只需要把拼接的版本变量替换为ansible_distribution_version即可:
- name: 按完整系统版本号加载变量文件 include_vars: "vars_os_{{ ansible_distribution | lower }}-{{ ansible_distribution_version }}.yml"
调试提示:正式使用前可以执行
ansible <目标主机组> -m setup -a "filter=ansible_distribution*"查看Ansible实际采集到的系统版本变量取值,确认和文件命名规则匹配,避免出现文件找不到的报错。
内容的提问来源于stack exchange,提问作者Tushar Aws
相关产品推荐
相关产品推荐

