我有一个 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 版本的主机定义一个变量。
如何更改此任务以对我当前的主机使用一个软件包列表,并为我的新主机使用另一个软件包列表?
使用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)
为了使您的剧本更干净,您可以在角色中执行此操作,例如,您可以拥有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)
这种方法的优点是除了每个操作系统只有一组任务之外,您还可以标记完整的任务。
| 归档时间: |
|
| 查看次数: |
15374 次 |
| 最近记录: |