导入Python库时,Ansible自定义过滤器会失败



我正在尝试用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]

相关内容

  • 没有找到相关文章

最新更新