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

Dan*_*ell 3 ansible

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

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

- name: install needed packages
  apt: name={{ packages }} state=present update_cache=yes
Run Code Online (Sandbox Code Playgroud)

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

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

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

jgr*_*tty 9

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

when: "'{{ ansible_distribution}}' == 'Ubuntu' and '{{ ansible_distribution_release }}' == 'precise'"
Run Code Online (Sandbox Code Playgroud)

您也可以使用:

when: "'{{ ansible_distribution }}' == 'Ubuntu' and '{{ ansible_distribution_version }}': '12.04'"
Run Code Online (Sandbox Code Playgroud)

编辑: Ansible 的更高版本(例如 2.7.1)会为此语句打印警告:

[警告]:when 语句不应包含 jinja2 模板分隔符,例如 {{ }} 或 {% %}。发现:'{{ansible_distribution}}' == 'Ubuntu' 和 '{{ ansible_distribution_release }}' == 'bionic'

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

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

when: "ansible_distribution|string == 'Ubuntu' and ansible_distribution_release|string == 'bionic'"
Run Code Online (Sandbox Code Playgroud)

甚至:

when: 
  - ansible_distribution|string == 'Ubuntu'
  - ansible_distribution_release|string == 'bionic'
Run Code Online (Sandbox Code Playgroud)

该文档的最新版本,建议使用访问这样的ansible_facts:

when:
  - ansible_facts['distribution'] == "CentOS"
  - ansible_facts['distribution_major_version'] == "6"
Run Code Online (Sandbox Code Playgroud)


nba*_*ari 7

为了使您的剧本更干净,您可以在角色中执行此操作,例如,您可以拥有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
Run Code Online (Sandbox Code Playgroud)

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