我试图写一个小插件查找返回时间戳+ 1天。
这主要是练习,但它似乎离我已经打了一个问题蝙蝠。
看来每个字符用时在Ansible输出(通过调试模块)以逗号分隔。
查找插件本身是:
from datetime import datetime, timedelta
from ansible.plugins.lookup import LookupBase
# Small plugin to return time + 1 day
class LookupModule(LookupBase):
def run(self, terms, variables, **kwargs):
dt = datetime.now() + timedelta(days=1)
return dt.strftime("%Y%m%dT%H%M%S")
摆在./lookup_plugins/tomorrow.py。
该剧正在运行的是:
---
- hosts: localhost
vars:
test: "{{ lookup('tomorrow') }}"
tasks:
- debug:
var: test
目前的结果是:
PLAY [localhost] **************************************************************
TASK [Gathering Facts] ********************************************************
ok: [localhost]
TASK [debug] ****************************************************************************
ok: [localhost] => {
"test": "2,0,1,9,0,2,0,6,T,1,5,1,6,3,7"
}
如果我修改了Python文件,只是打印输出,我得到正确没有逗号的字符串。
刚一说明,我意识到我在功能上可以做:
"{{ lookup('pipe','date -d \"1 day\" +%Y%m%dT%H%M%S') }}"
然而,在这一点上,我很好奇,想了解发生了什么。
然而,在这一点上,我很好奇,想了解发生了什么。
这是因为你正在返回一个字符串,它是一个字符长list
的Python中的str
,因此当LookupBase
(或任何人)试图遍历run()
的输出,它变成["h","e","l","l","o"]
的交易类型。
我没有检查them all,但我查了其中的4-5,以及所有那些我发现return a list
我认为这是一个文档错误,只有这样,任何人都可以猜测run
旨在返回多东西是从它是pydoc提到的plural "strings"。随意提交bug in ansible,让他们知道你的经验
这是由设计。查找插件是历史上通常用来管导致成环。所以Ansible希望看到一个列表。
你可以用你的返回值放入一个列表,如:
return [dt.strftime("%Y%m%dT%H%M%S")]
这样一来,你会得到结果,您期望与lookup('tomorrow')
。
还要注意的是lookup
可以有利于query
的即将弃用。见here。