我在我的角色中自定义了linux users
创建。我需要让我的角色用户自定义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}}"
但是这些变量都在一个非常大的哈希中,并且该哈希中有一些哈希不能作为默认值。
答案 0 :(得分:140)
您可以使用Jinja的default
:
- name: Create user
user:
name: "{{ my_variable | default('default_value') }}"
答案 1 :(得分:3)
不完全相关,但您也可以检查undefined
和empty
(例如my_variable:
)变量。 (注意:仅适用于ansible版本> 1.9,请参阅:link)
- name: Create user
user:
name: "{{ ((my_variable == None) | ternary('default_value', my_variable)) \
if my_variable is defined else 'default_value' }}"
答案 2 :(得分:2)
如果您想要循环播放项目,请在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) }}"
答案 3 :(得分:1)
如果您使用查找来设置从环境中读取的默认值,则还将第二个默认参数设置为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') }}"
答案 4 :(得分:1)
如果有人在寻找处理嵌套变量的选项,那么此https://pastebin.com/raw/dnfHuGAK中有几个这样的选项。
简而言之,您需要对每个级别的嵌套var使用“默认”过滤器。对于变量“ a.nested.var”,它看起来像:
- hosts: 'localhost'
tasks:
- debug:
msg: "{{ ((a | default({})).nested | default({}) ).var | default('bar') }}"
或者您可以为每个级别的变量设置空字典的默认值,也许使用“组合”过滤器。或使用“ json_query”过滤器。但是,如果您只有一层嵌套,那么我选择的选项似乎更简单。
答案 5 :(得分:1)
如果您要为布尔事实分配默认值,请确保在default()中不使用引号。
- name: create bool default
set_fact:
name: "{{ my_bool | default(true) }}"
对于其他变量,使用已验证答案中给出的相同方法。
- name: Create user
user:
name: "{{ my_variable | default('default_value') }}"
答案 6 :(得分:0)
这个问题已经很老了,但是:
- hosts: 'localhost'
tasks:
- debug:
msg: "{{ ( a | default({})).get('nested', {}).get('var','bar') }}"
对我来说看起来不那么麻烦...
答案 7 :(得分:0)
我遇到类似的问题,也许有人可以指出我正确的方向:
这是一个汇总的事实,有时并非在所有主机中都定义:
{{ hostvars[inventory_hostname]['ansible_local']['myfact']['after']['total_reads'] }}
问题:
在这种情况下,设置过滤器默认值的最佳方法是什么?
我尝试过:
{{ hostvars[inventory_hostname]['ansible_local']['myfact']['after']['total_reads'] | default(\"null\") }}
{{ hostvars[inventory_hostname]['ansible_local']['myfact']['after']['total_reads'] | default('null') }}
但没有运气...