ansible 插件可以调用角色或剧本吗?

can an ansible plugin call a role or a playbook?

我有一个很重要的角色,我想打包成一个集合,我想创建一个插件来调用这个角色,而不是做“include_role”。所以,我正在寻找我的客户能够放置类似的东西:

- name: call my plugin
  my_plugin:
    param1: "mmm"
    param2: 42

这将在内部 运行 进行一些验证,但最终它会调用整个角色来执行(与仅调用模块相反)。

我找到的所有文档似乎都从插件中调用模块,但似乎没有任何内容能够调用角色(或剧本)。有办法实现吗?

如果你真的想走这条路,你可以查看include_role源代码。 (f.e。这里是 https://github.com/ansible/ansible/blob/2cbfd1e350cbe1ca195d33306b5a9628667ddda8/lib/ansible/playbook/role_include.py)。不过在我看来它不像普通的 pugin。

但是这里有一个更严重的问题:如果你创建这样的东西,它会完全掩盖用户的角色内容。角色不是 'python modules',角色的隔离性非常弱。通过向用户隐藏角色内容(和执行),您基本上可以创建自己的 ansible 版本,其中包含新鲜和未知的错误和怪癖列表。

如果你想控制代码的执行方式,策略插件可能是一个更合理的地方。您仍然允许用户看到通常的执行工作流程,但您将对事情的执行方式有很大的控制权。

但是编写策略插件非常难。我只知道一个第三方策略插件(mitogen)。