如果导入的角色失败,请使用变量作为默认值



我有一个从数据库读取数据的可解析角色。在这种情况下,该数据可能不存在。我不能改变这个角色。目前我正在使用这个角色,比如:

- 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_factregister在同一级别,所以最新的赋值应该会获胜。但为了清晰和安全,我会重命名这个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 -%}"

请注意此处{{}}的使用。

最新更新