我有一个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版本的主机定义一个变量。
如何更改此任务以使用当前主机的一个软件包列表以及我的新主机的另一个软件包列表?
答案 0 :(得分:2)
使用when
子句。这是一个只能在ubuntu 12.04上运行的例子
when: "'{{ ansible_distribution}}' == 'Ubuntu' and '{{ ansible_distribution_release }}' == 'precise'"
您也可以使用:
when: "'{{ ansible_distribution }}' == 'Ubuntu' and '{{ ansible_distribution_version }}': '12.04'"
修改强> 更高版本的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'"
甚至:
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"
答案 1 :(得分:2)
为了让您的剧本更清晰,您可以在角色中执行此操作,例如,您可以拥有一个基于操作系统的tasks/main.yml
,它将包含与{{1}使用的条件匹配的任务例如,如果使用when
ansible_os_family
的内容可能类似于:
main.yml
这种方法的优点是除了每个操作系统只有一组任务外,您还可以标记完整的任务。
答案 2 :(得分:0)
这可以更简单、更通用,允许对多个发行版或 os:es 重复使用相同的任务
简单地将每个发行版的包存储在字典中
变量文件:
packages: {
bionic: [ bionic-package1, bionic-package2],
focal: [focal-package1, focal-package2]
}
剧本:
- name: Install unique packages per distro
apt:
name: {{ packages[ansible_distribution_release] }}"
state: present
通过修改此示例以使用包“package”而不是“apt”模块更好,您甚至可以在同一任务中支持其他 Linux 发行版。