Ansible模块可以通过将其包含在JSON输出中来生成自定义事实。在同一个Ansible运行期间下次调用时,是否可以从同一模块访问这些事实?我们的想法是使用它们来预取某个特定事物的状态。在Puppet中被称为“资源类型”的东西。
还是有其他一些预取Ansible模块的方法吗?
答案 0 :(得分:2)
不,除非你自己实施。模块只能访问已明确传递给模块的那些变量。这是因为模块是远程执行的,而客户端计算机上的运行程序中的所有事实都可用。
I had a similar problem myself before. Bruce P.建议使用fact caching,然后从模块中查询redis缓存。
在您的情况下,它可能更简单,因为如果在同一次运行期间第二次调用模块,您希望获得值。您只需将数据存储在临时文件中即可。
我有另一个想法来解决这个问题,但还没有机会测试它:可以创建一个与模块一起工作的动作插件。动作插件就像一个模块,但是在本地执行,因此可以访问所有事实。您可以在动作插件中执行模块并传递所有可用的事实。如果我没有弄错copy
就是一个很好的例子。有一个copy
module和一个copy
action plugin。然后插件calls the module。
最简单的方法就是将您的事实简单地传递给您的模块。
- your_module: your_fact={{ your_fact | default(False) }}
- your_module: your_fact={{ your_fact | default(False) }}
首次执行时your_fact
将不存在,因此您传递False
。 your_module
然后在第一次执行时创建your_fact
。因此,在第二次调用时,它将存在并在第二个任务中传递。