首页 文章

Ansible playbook根据操作系统版本安装不同的软件包

提问于
浏览
1

我有一个Ansible playbook(使用ansible 1.9.3)来设置和更新一堆服务器 . 其中一个步骤是安装包(使用'apt'插件) . 直到最近我的所有服务器都是统一的(相同版本的Ubuntu服务器) . 我正在推出一个更新的Ubuntu服务器,一些包名已经改变 .

这是我的任务文件的样子:

- name: install needed packages
  apt: name={{ item }} state=present update_cache=yes
  with_items: packages

(我在vars文件中有一个包列表) .

我可以在库存文件中为具有不同Ubuntu版本的主机定义一个变量 .

如何更改此任务以使用当前主机的一个软件包列表,以及我的新主机的另一个软件包列表?

2 回答

  • 1

    使用 when 子句 . 这是一个只能在ubuntu 12.04上运行的例子

    when: "'{{ ansible_distribution}}' == 'Ubuntu' and '{{ ansible_distribution_release }}' == 'precise'"
    

    您也可以使用:

    when: "'{{ ansible_distribution }}' == 'Ubuntu' and '{{ ansible_distribution_version }}': '12.04'"
    

    Edit: 更高版本的Ansible(例如2.7.1)将为此声明打印警告:

    [警告]:when语句不应包含jinja2模板分隔符,例如{{}}或{%%} . 找到:'{}'=='Ubuntu'和'{}'=='bionic'

    Ansible现在期望条件语句的另一种语法,如文档中所述 .

    对于Ansible 2.5你可以试试这个:

    when: "ansible_distribution|string == 'Ubuntu' and ansible_distribution_release|string == 'bionic'"
    

    甚至:

    when: 
      - ansible_distribution|string == 'Ubuntu'
      - ansible_distribution_release|string == 'bionic'
    

    latest version of the docs建议使用像这样访问ansible_facts:

    when:
      - ansible_facts['distribution'] == "CentOS"
      - ansible_facts['distribution_major_version'] == "6"
    
  • 2

    为了保持您的剧本更清洁,您可以在角色中执行此操作,例如,您可以拥有一个基于操作系统的一个 tasks/main.yml 它将包含与 when 使用的条件匹配的任务,例如,如果使用 ansible_os_family 的内容 main.yml 可能是这样的:

    ---
    - include_tasks: freebsd.yml
      when: ansible_os_family == "FreeBSD"
      tags:
        - unbound
    
    - include_tasks: debian.yml
      when: ansible_os_family == "Debian"
      tags:
        - unbound
    
    - include_tasks: redhat.yml
      when: ansible_os_family == "RedHat"
      tags:
        - unbound
    

    这种方法的优点是除了每个操作系统只有一组任务外,您还可以标记完整的任务 .

相关问题