我正在尝试用Ansible编写自定义Jinja2滤波器。
我能够编写一个琐碎的过滤器。但是,对于我想到的实际用例,我想做import boto3
。
运行pip list | grep boto3
时,我会看到它已安装。当我运行python -c 'import boto3'
时,成功运行。
但是,当我将import boto3
插入自定义过滤器的顶部时,Ansible无法加载它。
MWE
目录结构:
- filter_plugins/
- custom.py
- playbook.yaml
custom.py
:
import hashlib # I can import some things, not others
print("custom filter file loaded")
class FilterModule(object):
def _square(self,x):
return(int(x)*int(x))
def filters(self):
return {
'my_square': self._square
}
playbook.yaml
:
---
- hosts: localhost
connection: local
tasks:
- name: test custom filter
assert:
that:
- "( 2 | my_square ) == 4"
tags:
- test
当我用以下方式调用此问题时:
ansible-playbook playbook.yaml
剧本成功运行。我还可以看到Ansible
打印出的"自定义过滤文件">但是,当我将import boto3
附加到顶部时,剧本失败了。
- "加载自定义过滤器文件"是由Ansible打印出来的。
- 错误消息是:
致命:[127.0.0.1]:失败!=> {" msg":"条件检查'(2 | my_square(== 4'失败。错误是:模板string string时的模板错误:无滤波器'my_square'。字符串。字符串:{%if(2 | my_square(== 4%} true {%else%} false {%endif%}"}
问题:
- 这是因为我使用的是
connection: local
,还是由于Ansible使用非相互作用外壳的PATH
? - 如何调试自定义过滤器失败?我花了很多时间来弄清楚
import boto3
线导致故障。Ansible似乎在剧本运行开始(有时是其他时间(的定制过滤器文件,捕获错误,然后继续进行,直到我尝试使用过滤器。 - 这是python 2 vs python 3的东西吗?Python使用哪个?(我做了
pip install boto3
,但没有安装pip3
。(
q:" Is this a Python 2 vs Python 3 thing? Which does Python use?
"
A:是的。ansible-playbook playbook.yaml
很可能使用Python 2.以详细模式运行剧本
ansible-playbook -vvv playbook.yaml
并找到Python的版本。例如
python version = 2.7.15+ (default, Nov 27 2018, 23:36:35) [GCC 7.3.0]