4

我正在编写一个可在不同 Linux 操作系统系列上使用的 Ansible 角色,并且每个操作系统系列的变量具有不同的默认值。

起初,我认为在角色中使用 include vars 任务很容易设置,例如:

- name: Gather OS family variables
  include_vars: "{{ ansible_os_family|lower }}.yml"

my_role_variable: "Here is the default for Enterprise Linux"

myrole/vars/redhat.yml

my_role_variable: "Here is the default for Debian Linux"

myrole/vars/debian.yml

但是,在我的情况下,使用角色的剧本能够轻松覆盖默认值非常重要。

因此,我试图找出一种方法来为每个操作系统系列的变量设置不同的默认值,如上所述,但我希望变量是角色默认变量而不是角色包含变量。有没有办法做到这一点?

4

2 回答 2

2

使用三元运算符

- name: Gather OS family variables
  include_vars: "{{ (override_os_family is defined) | ternary(override_os_family,ansible_os_family) | lower }}.yml"

这样,如果override_os_family定义了变量,您的表达式将有它的值,如果没有,它将使用ansible_os_family.


例子:

---
- hosts: localhost
  connection: local
  tasks:   
    - debug: msg="{{ (override_os_family is defined) | ternary(override_os_family,ansible_os_family) | lower }}.yml"

- hosts: localhost
  connection: local
  vars:
    override_os_family: Lamarck
  tasks:   
    - debug: msg="{{ (override_os_family is defined) | ternary(override_os_family,ansible_os_family) | lower }}.yml"

结果(摘录):

...

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "darwin.yml"
}

...

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "lamarck.yml"
于 2016-12-16T22:19:02.867 回答
2

在你的 defaults/main.yml 文件中有如下内容怎么样

my_role_variable_default: "global default"
my_role_variable_redhat: "redhat specific default"
my_role_variable: "{{ lookup('vars', 'my_role_variable_'+ansible_os_family|lower, default=my_role_variable_default) }}"
于 2019-01-25T02:42:48.377 回答