如果没有定义变量,则使用默认值

我在我的角色中定制 linux users创建。我需要让我的角色的用户自定义 home_directorygroup_namenamepassword

我想知道是否有更灵活的方法来处理默认值。

我知道下面的代码是可行的:

- name: Create default
user:
name: "default_name"
when: my_variable is not defined


- name: Create custom
user:
name: "{{my_variable}}"
when: my_variable is defined

但正如我提到的,有很多可选变量,这就创造了很多可能性。

上面有类似的代码吗?

user:
name: "default_name", "{{my_variable}}"

当没有定义 my_variable时,代码应该设置 name="default_name"

我可以在 defaults/main.yml上设置所有的变量,然后像这样创建用户:

- name: Create user
user:
name: "{{my_variable}}"

但是这些变量在一个非常大的散列中,而且散列中有一些不能作为默认值的散列。

229410 次浏览

你可以使用金贾的 default:

- name: Create user
user:
name: "\{\{ my_variable | default('default_value') }}"

如果你有一个单一的游戏,你想循环的项目,定义该列表在 group _ vars/all 或其他有意义的地方:

all_items:
- first
- second
- third
- fourth

然后你的任务可以是这样的:

  - name: List items or default list
debug:
var: item
with_items: "\{\{ varlist | default(all_items) }}"

以 JSON 数组的形式传入 varlist:

ansible-playbook <playbook_name> --extra-vars='{"varlist": [first,third]}'

在此之前,您可能还需要一个任务来检查 伐木工人中的每个项目是否也在 所有项目中:

  - name: Ensure passed variables are in all_items
fail:
msg: "\{\{ item }} not  in all_items list"
when: item not in all_items
with_items: "\{\{ varlist | default(all_items) }}"

不完全相关,但是您也可以同时检查 undefinedempty(例如 my_variable:)变量。(注意: 只适用于可变版本 > 1.9,参见: 链接)

- name: Create user
user:
name: "\{\{ ((my_variable == None) | ternary('default_value', my_variable)) \
if my_variable is defined else 'default_value' }}"

如果您使用查找来设置默认的从环境中读取,您还需要将默认的第二个参数设置为 true:

- set_facts:
ansible_ssh_user: "\{\{ lookup('env', 'SSH_USER') | default('foo', true) }}"

您还可以连接多个默认定义:

- set_facts:
ansible_ssh_user: "\{\{ some_var.split('-')[1] | default(lookup('env','USER'), true) | default('foo') }}"

如果有人正在寻找一个处理嵌套变量的选项,在这个 Github 的问题中有几个这样的选项。

简而言之,您需要对每个级别的嵌套变量使用“ default”过滤器。对于变量“ a.nested.var”,它看起来像:

- hosts: 'localhost'
tasks:
- debug:
msg: "\{\{ ((a | default({})).nested | default({}) ).var | default('bar') }}"

或者您可以为每个级别的 vars 设置空字典的默认值,也许可以使用“组合”过滤器。或者使用“ json _ query”过滤器。但是如果您只有一个嵌套级别,那么我选择的选项对我来说似乎更简单。

这个问题很古老,但是关于:

- hosts: 'localhost'
tasks:
- debug:
msg: "\{\{ ( a | default({})).get('nested', {}).get('var','bar') }}"

在我看来没那么麻烦了。

如果您为布尔事实赋予默认值,那么请确保 default ()中没有使用引号。

- name: create bool default
set_fact:
name: "\{\{ my_bool | default(true) }}"

对于其他变量,使用验证答案中给出的相同方法。

- name: Create user
user:
name: "\{\{ my_variable | default('default_value') }}"