Ansible 模块可以通过将它们包含在其 JSON 输出中来生成自定义事实。下次在同一个 Ansible 运行期间调用它时,是否可以从同一个模块访问这些事实?这个想法是使用它们来预取某个,呃……一类事物的 is-state。在 Puppet 中称为“资源类型”的东西。
或者还有其他预取 Ansible 模块的方法吗?
Ansible 模块可以通过将它们包含在其 JSON 输出中来生成自定义事实。下次在同一个 Ansible 运行期间调用它时,是否可以从同一个模块访问这些事实?这个想法是使用它们来预取某个,呃……一类事物的 is-state。在 Puppet 中称为“资源类型”的东西。
或者还有其他预取 Ansible 模块的方法吗?
不,除非你自己实现它。模块只能访问那些已显式传递给模块的变量。这是因为该模块是远程执行的,而客户端机器上的运行程序中的所有事实都可用。
我自己之前也遇到过类似的问题。Bruce P. 建议使用事实缓存,然后从模块中查询 redis 缓存。
在您的情况下,它可能更简单,因为如果在同一运行期间第二次调用模块,您希望该值可用。您可以简单地将数据存储在临时文件中。
我有另一个想法来解决这个问题,但还没有机会测试它:可以创建一个与模块一起工作的动作插件。动作插件就像一个模块,但在本地执行,因此可以访问所有事实。您可以从动作插件中执行模块并传递所有可用的事实。如果我没记错的话copy
就是一个很好的例子。有一个copy
模块和一个copy
动作插件。然后插件调用模块。
最简单的事情就是简单地将您的事实传递给您的模块。
- your_module: your_fact={{ your_fact | default(False) }}
- your_module: your_fact={{ your_fact | default(False) }}
第一次执行时your_fact
不存在,所以你通过False
. your_module
然后your_fact
在第一次执行时创建。所以在第二次调用它会存在并在第二个任务中传递。