Ansible-如果未定义变量,则使用默认值

Ansible-如果未定义变量,则使用默认值,ansible,ansible-2.x,Ansible,Ansible 2.x,我正在自定义linux用户在我的角色中的创建。我需要让我角色的用户自定义主目录,组名,名称,密码 我想知道是否有更灵活的方法来处理默认值 我知道下面的代码是可能的: - name: Create default user: name: "default_name" when: my_variable is not defined - name: Create custom user: name: "{{my_variable}}" when: my_varia

我正在自定义linux
用户
在我的角色中的创建。我需要让我角色的用户自定义
主目录
组名
名称
密码

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

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

- 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\u变量时,代码应设置
name=“default\u name”

我可以在
defaults/main.yml
上设置所有变量,并创建如下用户:

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

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

您可以使用Jinja的
默认值

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

如果您想在项目上循环一个重头戏,请在组_vars/all或其他有意义的地方定义该列表:

all_items:
  - first
  - second
  - third
  - fourth
然后,您的任务可以如下所示:

  - name: List items or default list
    debug:
      var: item
    with_items: "{{ varlist | default(all_items) }}"
将varlist作为JSON数组传入:

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

不完全相关,但您也可以检查
未定义
(例如
my_变量:
)变量。(注意:仅适用于ansible版本>1.9,请参见:)


如果使用“查找”设置默认的“从环境读取”,则还将“默认”的第二个参数设置为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') }}"

如果有人在寻找一个处理嵌套变量的选项,这里有几个这样的选项

简而言之,您需要为每一级别的嵌套变量使用“默认”过滤器。对于变量“a.nested.var”,它将如下所示:

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

或者您可以为每个级别的变量设置空dict的默认值,可能使用“combine”过滤器。或者使用“json_查询”过滤器。但是,如果您只有一个嵌套级别,那么我选择的选项对我来说似乎更简单。

这个问题已经很老了,但是关于:

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

对我来说,它看起来不那么麻烦…

如果要为布尔事实指定默认值,请确保在default()中不使用引号

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

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

如果默认变量依赖于另一个变量。例如
default('/home/'{{anothervar}}})
,有没有一种方法可以连接这些值?只需删除
default\u值周围的“
,如果变量像
{dict.key | default(5)}
那样嵌套,它就会使用名为default\u值的变量。如果未定义
dict
,它将失败。仅供参考,现在将抛出一个错误:
[警告]:当语句不应包括jinja2模板分隔符,如{{}或{%}。
@jordanstwart I也有相同的大小写-使用嵌套变量。我在下面贴了一个可能的解决方案。相关:这很好,非常有用。
- hosts: 'localhost'
  tasks:
    - debug:
        msg: "{{ ( a | default({})).get('nested', {}).get('var','bar') }}"
- name: create bool default
  set_fact:
    name: "{{ my_bool | default(true) }}"
- name: Create user
  user:
    name: "{{ my_variable | default('default_value') }}"