如何访问全局函数中的值?
How to access value in a function as a global?
注意:更新了我原来的问题
我在脚本中有此代码部分,需要访问脚本中模块外的 co_create
值。
from ansible.plugins.callback import CallbackBase
class CallbackModule(CallbackBase):
CALLBACK_VERSION = 2.0
def __init__(self):
super(CallbackModule, self).__init__()
def v2_playbook_on_play_start(self, play):
self.play = play
extra_vars = ""
vm = play.get_variable_manager()
co_create = vm.extra_vars["co_create"]
您在代码段的最后一行格式化 print(co_create)
的方式,它显示为 CallbackModule
的 class 定义的最后一行。当 class 构造函数到达这一点时,它正确地抱怨变量未定义,因为在您的示例中既没有 class 级别的变量 co_create
也没有对任何全局变量的引用名为 co_create
的变量在模块级别可用。您有两个选择:(1.)在定义 class 之前,在对等上下文中定义一个模块级变量到 class' 定义,称为 'co_create' ,如:
co_create = None
class CallbackModule(CallbackBase):
...
if __name__ == '__main__':
play = ...
obj = CallbackModule()
obj.v2_playbook_on_play_start(play)
print(co_create) # no longer None
这将成为您想要的全局变量,不需要对您的任何其他代码进行代码更改。 (2.) 类似于您在实例方法中定义的 v2_playbook_on_play_start
访问 co_create
在打印之前使用 class 级别的全局关键字。选项 (1.) 是首选。你应该尽量避免使用 global 关键字,除非你不得不这样做,因为它需要模块其余部分的一致性,因此需要更多的全局关键字和更多的错误机会。
我得到了答案:我最初想用 ansible 模块实现的是不可能的:将从模块检索的变量获取到脚本的主块中,因为 'play' 被直接调用来自 ansible 运行,所以我无法在主块中指定它。
所以我确实做到了将 return 值从主块推送到模块,然后模块改为执行任务。
既然skullgoblet1089给了我一个很好的方向,我会标记他的答案。
注意:更新了我原来的问题
我在脚本中有此代码部分,需要访问脚本中模块外的 co_create
值。
from ansible.plugins.callback import CallbackBase
class CallbackModule(CallbackBase):
CALLBACK_VERSION = 2.0
def __init__(self):
super(CallbackModule, self).__init__()
def v2_playbook_on_play_start(self, play):
self.play = play
extra_vars = ""
vm = play.get_variable_manager()
co_create = vm.extra_vars["co_create"]
您在代码段的最后一行格式化 print(co_create)
的方式,它显示为 CallbackModule
的 class 定义的最后一行。当 class 构造函数到达这一点时,它正确地抱怨变量未定义,因为在您的示例中既没有 class 级别的变量 co_create
也没有对任何全局变量的引用名为 co_create
的变量在模块级别可用。您有两个选择:(1.)在定义 class 之前,在对等上下文中定义一个模块级变量到 class' 定义,称为 'co_create' ,如:
co_create = None
class CallbackModule(CallbackBase):
...
if __name__ == '__main__':
play = ...
obj = CallbackModule()
obj.v2_playbook_on_play_start(play)
print(co_create) # no longer None
这将成为您想要的全局变量,不需要对您的任何其他代码进行代码更改。 (2.) 类似于您在实例方法中定义的 v2_playbook_on_play_start
访问 co_create
在打印之前使用 class 级别的全局关键字。选项 (1.) 是首选。你应该尽量避免使用 global 关键字,除非你不得不这样做,因为它需要模块其余部分的一致性,因此需要更多的全局关键字和更多的错误机会。
我得到了答案:我最初想用 ansible 模块实现的是不可能的:将从模块检索的变量获取到脚本的主块中,因为 'play' 被直接调用来自 ansible 运行,所以我无法在主块中指定它。 所以我确实做到了将 return 值从主块推送到模块,然后模块改为执行任务。 既然skullgoblet1089给了我一个很好的方向,我会标记他的答案。