我正在编写一个自定义的ansible回调:
class CallbackModule(CallbackBase):
CALLBACK_VERSION = 2.0
CALLBACK_TYPE = 'aggregate'
CALLBACK_NAME = 'my_callback'
def v2_runner_on_ok(self, result):
print("v2_runner_on_ok")
import pdb; pdb.set_trace()
result._host.groups[0].get_vars()
当我检查result._host.groups[0].get_vars()
的内容时,它返回{}
,这不是我期望的。我已验证主机正在接收group_vars(通过在我的剧本中放置一个debug
任务并打印出预期的var)。所以我的问题是,为什么回调不接收主机的group_vars?
同样奇怪的是,host_vars也没有转换为我的回调插件。看来,滴入我插件的唯一变量是清单文件中定义的变量,还有一些魔术变量。
答案 0 :(得分:3)
您正在访问ansible.inventory
类下的变量,因此只能获得清单中定义的变量。
如果要访问其他变量,则需要通过剧本的变量管理器:
def v2_playbook_on_play_start(self, play):
variable_manager = play.get_variable_manager()
hostvars = variable_manager.get_vars()['hostvars']
答案 1 :(得分:1)
优秀的@techraf帮助我弄清楚了这一点。我需要捕获Play的变量管理器:
class CallbackModule(CallbackBase):
CALLBACK_VERSION = 2.0
CALLBACK_TYPE = 'aggregate'
CALLBACK_NAME = 'is'
def v2_playbook_on_play_start(self, play):
self.vm = play.get_variable_manager()
def v2_runner_on_ok(self, result):
host_vars = self.vm.get_vars()['hostvars'][result._host.name]
var_that_i_want = host_vars['var_that_i_want']