Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ansible 指定要在playbook中使用的特定回调_Ansible_Ansible Playbook - Fatal编程技术网

Ansible 指定要在playbook中使用的特定回调

Ansible 指定要在playbook中使用的特定回调,ansible,ansible-playbook,Ansible,Ansible Playbook,我已经为中国的不同行动创建了不同的剧本 我还为不同类型的剧本创建了不同的回调脚本(并用Ansible打包并安装) 剧本将从许多不同的脚本/cron作业中调用 现在,是否可以指定要为特定剧本调用的特定回调脚本?(可能使用命令行参数?) 现在发生的是,每个剧本都会调用所有回调脚本 SHOULD_TRIGGER = false class CallbackModule(object): def playbook_on_play_start(self, name): if n

我已经为中国的不同行动创建了不同的剧本

我还为不同类型的剧本创建了不同的回调脚本(并用Ansible打包并安装)

剧本将从许多不同的脚本/cron作业中调用

现在,是否可以指定要为特定剧本调用的特定
回调脚本
?(可能使用命令行参数?)

现在发生的是,每个剧本都会调用所有回调脚本

SHOULD_TRIGGER = false

class CallbackModule(object):

    def playbook_on_play_start(self, name):
        if name == "My Cool Play":
           SHOULD_TRIGGER = true

    def playbook_on_stats(self, stats):
        if SHOULD_TRIGGER == true:
           do something cool
我无法将
回调脚本相对于playbook的位置/文件夹放置,因为它已经打包在ansible包中。而且,所有的剧本也在同一个位置

如果需要的话,我可以修改一点ansible源代码来适应它。

如果使用回调脚本,您可以在这些插件中决定任何playbook是否应该触发某些操作

playbook\u on\u play\u start
方法中,您可以使用该播放的名称来决定是否应处理进一步的通知

playbook\u on\u stats
然后在playbook的末尾调用

SHOULD_TRIGGER = false

class CallbackModule(object):

    def playbook_on_play_start(self, name):
        if name == "My Cool Play":
           SHOULD_TRIGGER = true

    def playbook_on_stats(self, stats):
        if SHOULD_TRIGGER == true:
           do something cool

请注意,
playbook\u on\u play\u start
是为您的playbook中的每个play调用的,因此它可能会被调用多次。

在查看Ansible的代码后,我能够用以下方法解决它

在每个
callback\u插件中
,您可以指定
self.disabled=True
,并且根本不会调用回调

此外,在调用playbook时,还可以选择将额外参数解析为
key=value
对。它将作为
extra\u vars
字段作为playbook对象的一部分

所以我在我的
回调插件中做了类似的事情

def playbook_on_start(self):
    callback_plugins = self.playbook.extra_vars.get('callback_plugin', '') // self.playbook is populated in your callback plugin by Ansible.
    if callback_plugins not in ['email_reporter', 'all']:
        self.disabled = True
在给剧本打电话的时候,我可以这样做

ansible-playbook -e callback_plugin=email_reporter //Note -e is the argument prefix key for extra vars.

谢谢你的回答。。但我需要根据剧本指定回调。不是根据每个剧本。。。同一个剧本可以从2个不同的剧本中调用,回调应该为1调用,而不是为其他剧本调用…只是想确保您理解剧本是什么,因为剧本不能“被调用”。剧本是剧本中的一个条目,每个条目都包含主机、任务/角色和VAR键。大多数剧本只包含一个剧本,但你可以有多个剧本。上述解决方案唯一不起作用的情况是,当你在多个剧本中有同名剧本时。没错。。。我在每个剧本中有多个剧本。。。此外,我还在我的剧本中使用
include
语句。这意味着同一个剧本将被包括在许多剧本中。。。所以使用这种方法可能会给我带来问题。。。