我有一个从数据库读取数据的可解析角色。在这种情况下,该数据可能不存在。我不能改变这个角色。目前我正在使用这个角色,比如:
- name: Import role and read values
import_role:
name: shared_role
register: value
当数据库中的数据存在并且角色没有失败时,这种方法效果很好。然而,当这些数据丢失时,会引发更多问题。因此,在出现错误的情况下,我希望忽略该错误并使用默认值。
- import_role:
name: shared_role
register: value
ignore_errors: true
- set_fact:
value: "{{ value | default({{ default_var }}) }}"
其中default_var是在group_var中定义的。现在这显然不起作用,我有点被卡住了。我如何使用一个变量作为默认值foo或在可能失败的角色中注册的另一个变量。。。如果这有道理的话。
default
默认情况下(很抱歉出现这种冗余,但我不知道如何更好地编写它(仅替换未定义变量的值。定义了定义为None
的变量。
幸运的是,还有第二个参数可以用来代替";"空";vars(即None
或空字符串(。请参阅此的文档
此外,当你已经在jinja2资料片中时,你不能使用jinja2的资料片。查看jinja2文档以了解更多信息。
因此,您应该使用以下表达式来实现您的要求(如果您对数据的描述都是正确的(:
- set_fact:
value: "{{ value | default(default_var, true) }}"
这里的变量优先级不应该有问题:set_fact
和register
在同一级别,所以最新的赋值应该会获胜。但为了清晰和安全,我会重命名这个var,这样你就可以确信你永远不会遇到麻烦:
- import_role:
name: shared_role
register: role_value
ignore_errors: true
- set_fact:
value: "{{ role_value | default(default_var, true) }}"
这是我的group_vars/all.yml
文件。我正在使用这里定义的food
来设置我的剧本。您可以在输出中看到值6
。
logs: /var/log/messages
foo: 6
这是我的游戏书
---
- name: assign a variable value in default state
hosts: localhost
tasks:
- name: set fact and then print
set_fact:
new_var: "{{ doodle | default( foo ) }}"
- name: debug
debug: msg="{{ new_var }}"
这是输出
PLAY [assign a variable value in default state] ********************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [set fact and then print] *************************************************
ok: [localhost]
TASK [debug] *******************************************************************
ok: [localhost] => {
> "msg": "6"
}
PLAY RECAP *********************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
这是一个简单的语法错误。不能在筛选器中使用{{}}
正确的语法是
- set_fact:
value: "{{ value | default(default_var) }}"
编辑:
如果您的值是"None"
,并且您想替换它,则可以使用以下内容:
- set_fact:
value: "{%- if not value is defined or value == 'None' -%}{{ default_var }}{%- else -%}{{ value }}{%- endif -%}"
请注意此处{{}}
的使用。