2017-04-04 57 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