You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 06:53:32