Python Ansible:从自定义模块中访问主机/组变量

Python Ansible:从自定义模块中访问主机/组变量,python,ansible,ansible-playbook,Python,Ansible,Ansible Playbook,是否有一种方法可以从内部访问主机/组变量?我希望避免将所有必需的变量作为模块参数传递 我的模块是用Python编写的,我使用样板文件。我检查了几乎所有可用的变量,但它们没有存储在任何地方: def main(): pprint(dir()) pprint(globals()) pprint(locals()) for name in vars().keys(): print(name) 现在我唯一的希望是它们可以通过未记录的模块utils以某种方

是否有一种方法可以从内部访问主机/组变量?我希望避免将所有必需的变量作为模块参数传递

我的模块是用Python编写的,我使用样板文件。我检查了几乎所有可用的变量,但它们没有存储在任何地方:

def main():
    pprint(dir())
    pprint(globals())
    pprint(locals())
    for name in vars().keys():
        print(name)
现在我唯一的希望是它们可以通过未记录的模块utils以某种方式访问

我想这是不可能的,因为模块在目标机器上运行,并且可能facts/host/group变量没有随模块一起传输


编辑:找到了“现在”,但看起来不太有希望。

我认为你在这里的想法非常中肯:

我想这是不可能的,因为模块在目标机器上运行,并且可能facts/host/group变量没有随模块一起传输

然而,话虽如此,如果你真的需要这样做,那么可能会有一个稍微混乱的方式。从Ansible 1.8开始,您可以设置它,它使用redis在播放之间缓存事实。由于redis非常易于使用,并且具有良好的性能,因此您可以让您的模块向redis服务器查询您需要的任何事实。这并不是最干净的方法,但它可能会奏效

有没有一种方法可以从自定义服务器中访问主机/组变量 书面模块

不是内置的

你必须自己通过这样或那样的方式:

  • 模块args
  • 序列化到本地文件系统(使用
    pickle
    yaml.dump()
  • 你能想出的任何其他创新想法

不幸的是,您不能只发送整个主机/groupvar文件,因为您必须实现ansible的变量作用域/优先级解析算法,该算法尚未定义(这不是定义这些小东西的唯一方法:p)。

这非常有趣!现在它不是一个选项,因为它需要一个额外的redis主机,可以从本地和远程设备访问。这是一个有点太多的开销。但我们可能会在以后使用Ansible实现更多自动化时以这种方式实现它。事实缓存是我们以后可能想要的东西。我接受你的答案——虽然这不是最佳解决方案,但似乎是最好的解决方案。你只需在现有的ansible服务器上安装redis即可。redis非常轻量级,因此不需要额外的服务器。好吧,这里要复杂一点。在8个巨无霸中处理数千台主机,每个主机中有多个独立的VLAN。我们刚刚开始学习Ansible。现在,这将涉及太多的工作,但很明显,我们需要事实缓存在未来不远,然后这应该很容易实现。