我正在编写一个可用于不同Linux OS系列的Ansible角色,并且每个OS系列的变量具有不同的默认值。
起初,我认为在角色中使用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
中的
但是,在我的情况下,使用该角色的剧本能够轻松覆盖默认值非常重要。
所以,我试图找出一种方法为每个OS系列的变量设置一个不同的默认值,如上所述,但我希望变量是角色默认值而不是角色包括变量。有没有办法做到这一点?
答案 0 :(得分: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"
答案 1 :(得分:0)
在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) }}"