147

我正在users我的角色中自定义 linux 创建。我需要让我角色的用户自定义home_directory, group_name, name, password.

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

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

- 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}}"

未定义name="default_name"时应设置代码。my_variable

我可以设置所有变量defaults/main.yml并像这样创建用户:

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

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

4

7 回答 7

255

您可以使用 Jinja 的default

- name: Create user
  user:
    name: "{{ my_variable | default('default_value') }}"
于 2016-01-30T22:06:43.657 回答
14

不完全相关,但您也可以检查两个undefinedAND empty(例如my_variable:)变量。(注意:仅适用于 ansible 版本 > 1.9,请参阅:链接

- name: Create user
  user:
    name: "{{ ((my_variable == None) | ternary('default_value', my_variable)) \
    if my_variable is defined else 'default_value' }}"
于 2017-08-14T09:15:41.640 回答
8

如果有人正在寻找一个处理嵌套变量的选项,那么这个github issue中有几个这样的选项。

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

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

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

于 2019-07-10T14:25:20.513 回答
7

如果您使用查找设置从环境读取的默认值,您还将默认的第二个参数设置为 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') }}"
于 2019-03-26T09:09:44.730 回答
5

如果您想要循环播放项目,请在 group_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]}'

在此之前,您可能还需要一个检查varlist中的每个项目是否也在all_items中的任务:

  - 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) }}"
于 2017-05-18T22:24:23.770 回答
4

如果您为布尔事实分配默认值,请确保在 default() 中不使用引号。

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

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

- name: Create user
  user:
    name: "{{ my_variable | default('default_value') }}"
于 2020-03-10T13:57:56.867 回答
3

这个问题很老了,但是怎么样:

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

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

于 2019-09-12T15:48:21.440 回答