从Ansible模块访问Ansible事实。 Ansible中的预取/刷新?

时间:2015-11-30 15:07:12

标签: module ansible ansible-facts

Ansible模块可以通过将其包含在JSON输出中来生成自定义事实。在同一个Ansible运行期间下次调用时,是否可以从同一模块访问这些事实?我们的想法是使用它们来预取某个特定事物的状态。在Puppet中被称为“资源类型”的东西。

还是有其他一些预取Ansible模块的方法吗?

1 个答案:

答案 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将不存在,因此您传递Falseyour_module然后在第一次执行时创建your_fact。因此,在第二次调用时,它将存在并在第二个任务中传递。