如何在Ansible 1.9.3中基于Ubuntu版本安装不同软件包?
解决不同Ubuntu版本适配软件包的Ansible方案
嘿,这个需求我之前在维护老版本Ansible环境时刚好处理过,给你几个实用的方案,完美适配Ansible 1.9.3和不同Ubuntu版本的包名差异:
方案一:Inventory分组+自定义变量(手动指定版本组)
这种方式适合你已经明确知道每台主机的Ubuntu版本,提前在Inventory里分组标记:
1. 编辑Inventory文件
给不同版本的主机分组,并定义版本标识变量:
# inventory文件内容 [ubuntu_legacy] server1.example.com server2.example.com [ubuntu_modern] server3.example.com server4.example.com # 给每个组绑定版本标识变量 [ubuntu_legacy:vars] ubuntu_version_tag = "legacy" [ubuntu_modern:vars] ubuntu_version_tag = "modern"
2. 整理vars文件的包列表
在你的vars文件(比如vars/packages.yml)里,按版本拆分包列表:
# vars/packages.yml packages_legacy: - apache2 - php5 - mysql-server-5.5 packages_modern: - apache2 - php7.4 - mysql-server-8.0
3. 在Playbook中根据变量选择包列表
通过when条件判断,给不同版本组的主机安装对应包:
- name: Deploy packages based on Ubuntu version group hosts: all vars_files: - vars/packages.yml tasks: - name: Install legacy packages apt: name: "{{ packages_legacy }}" state: present when: ubuntu_version_tag == "legacy" - name: Install modern packages apt: name: "{{ packages_modern }}" state: present when: ubuntu_version_tag == "modern"
方案二:自动识别Ubuntu版本(无需手动分组)
如果不想手动维护分组,可以利用Ansible自带的事实变量自动获取主机的Ubuntu版本,更省心:
1. 保持vars文件的包列表结构
和方案一的vars/packages.yml一致,不用改。
2. 在Playbook中动态判断版本
利用ansible_distribution_version事实变量(Ansible 1.9.3已支持),结合版本比较逻辑来选择包:
- name: Install packages based on detected Ubuntu version hosts: all vars_files: - vars/packages.yml tasks: - name: Install packages for Ubuntu < 18.04 apt: name: "{{ packages_legacy }}" state: present when: ansible_distribution_version is version('18.04', '<') - name: Install packages for Ubuntu >= 18.04 apt: name: "{{ packages_modern }}" state: present when: ansible_distribution_version is version('18.04', '>=')
进阶:用set_fact简化Task
如果不想写两个独立的apt任务,可以先用set_fact动态定义目标包列表,再统一安装:
- name: Deploy packages with dynamic selection hosts: all vars_files: - vars/packages.yml tasks: - name: Set target package list based on Ubuntu version set_fact: target_packages: "{{ packages_legacy if ansible_distribution_version is version('18.04', '<') else packages_modern }}" - name: Install selected packages apt: name: "{{ target_packages }}" state: present
小提醒
Ansible 1.9.3确实是比较老的版本了,如果后续有机会,建议逐步升级到较新的稳定版,能获得更多功能和更好的兼容性。但上面的方案都是完全适配1.9.3版本的,放心用。
内容的提问来源于stack exchange,提问作者Daniel Purcell
相关产品推荐
相关产品推荐

