2017-04-04 35 views
3

我有点惊讶地发现他的一段代码失败,出现IOError异常,而不是默认忽略该值。当查找失败时如何回退到默认值?

#!/usr/bin/env ansible-playbook -i localhost, 
--- 
- hosts: localhost 
    tasks: 
    - debug: msg="{{ lookup('ini', 'foo section=DEFAULT file=missing-file.conf') | default(omit) }}" 

如何在不引发异常的情况下加载值?

请注意,查找模块支持默认值参数,但这对我来说是无用的,因为它只有在它可以打开文件时才起作用。

我需要一个默认值,即使它无法打开文件时也能正常工作。

回答

3

据我所知Jinja2不幸的是不支持任何try/catch机制。

让你无论是补丁的ini查找插件/文件问题Ansible团队,或使用这种丑陋的解决方法:

--- 
- hosts: localhost 
    gather_facts: no 
    tasks: 
    - debug: msg="{{ lookup('first_found', dict(files=['test-ini.conf'], skip=true)) | ternary(lookup('ini', 'foo section=DEFAULT file=test-ini.conf'), omit) }}" 

在这个例子中first_found查询返回的文件名,如果文件存在或空单,否则。如果文件存在,则ternary过滤器调用ini查找,否则返回omit占位符。

+0

丑陋会是轻描淡写,也许丑陋更合适! ;)在光明的一面,它似乎在工作。不过,我会避免它,因为它使代码非常难以阅读或审查他人。谢谢! – sorin