Ansible-如果未定义变量,则使用默认值
我正在自定义linuxAnsible-如果未定义变量,则使用默认值,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
用户
在我的角色中的创建。我需要让我角色的用户自定义主目录
,组名
,名称
,密码
我想知道是否有更灵活的方法来处理默认值
我知道下面的代码是可能的:
- 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') }}"