Ansible 模块或插件的生命周期

Ansible 主仓库中的模块和插件具有明确的生命周期,从首次引入到最终删除。模块和插件生命周期与 Ansible 发布周期 <release_cycle> 相关联。模块或插件可能会经历以下四个阶段

  1. 当模块或插件首次被接受到 Ansible 中时,我们认为它处于技术预览阶段,并在文档中将其标记为技术预览。

  2. 如果模块或插件成熟,则文档中的“预览”标记将被移除。将维护这些模块和插件的向后兼容性,但不保证,这意味着它们的參数应该保持稳定含义。

  3. 如果模块或插件的目标 API 发生了根本性的改变,或者有人创建了更好的功能实现,我们可能会将其标记为已弃用。已弃用的模块和插件仍然可用,但它们已接近生命周期结束。我们保留已弃用的模块和插件 4 个发布周期,并提供弃用警告以帮助用户更新使用它们的剧本和角色。

  4. 当模块或插件被弃用 4 个发布周期后,它将被移除,并在路由配置中替换为墓碑条目。已移除的模块和插件不再随 Ansible 一起提供。墓碑条目有助于用户找到替代模块和插件。

对于集合中的模块和插件,生命周期类似。自 ansible-base 2.10 起,不再可能将模块标记为“预览”或“稳定”。

在 Ansible 主仓库中弃用模块和插件

要在 ansible-core 中弃用一个模块,你必须

  1. 重命名文件,使其以 _ 开头,例如,将 old_cloud.py 重命名为 _old_cloud.py。这会使模块保持可用状态,并在模块索引页面上将其标记为已弃用。

  2. 在相关更改日志中提及弃用(通过创建一个具有 deprecated_features 部分的更改日志片段)。

  3. 在相关的 porting_guide_core_x.y.rst 中引用弃用。

  4. 向文档添加 deprecated:,并包含以下子值

removed_in:

一个 string,例如 "2.10";在该 Ansible 版本中,模块将被文档仅模块存根替换。通常为当前版本 +4。与 :removed_by_date: 相互排斥。

remove_by_date:

(在 ansible-base 2.10 中添加)。模块将被移除的 ISO 8601 格式日期。通常为模块被弃用日期的两年后。与 :removed_in: 相互排斥。

why:

可选字符串,用于详细说明移除的原因。

alternatives:

告知用户应该采取的替代措施,例如,Use M(whatmoduletouseinstead) instead.

在集合中弃用模块和插件

要在集合中弃用一个模块,你必须

  1. meta/runtime.yml 中的 plugin_routing 添加一个 deprecation 条目。例如,要弃用模块 old_cloud,请添加

    plugin_routing:
        modules:
            old_cloud:
                deprecation:
                    removal_version: 2.0.0
                    warning_text: Use foo.bar.new_cloud instead.
    

    对于其他插件类型,你需要将 modules: 替换为 <plugin_type>:,例如,对于查找插件,使用 lookup:。弃用操作插件时,需要添加两个条目:一个用于操作插件,一个用于包含文档的模块文件。

    除了 removal_version,你也可以使用 removal_date,并使用 ISO 8601 格式的日期,该日期之后,模块将在集合的新主要版本中被移除。

  2. 在相关更改日志中提及弃用。如果集合使用 antsibull-changelog,则创建一个具有 deprecated_features 部分的更改日志片段。

  3. 向模块或插件的文档添加 deprecated:,并包含以下子值

removed_in:

一个 string,例如 "2.10";在该 Ansible 版本中,模块将被文档仅模块存根替换。通常为当前版本 +4。与 :removed_by_date: 相互排斥。

remove_by_date:

(在 ansible-base 2.10 中添加)。模块将被移除的 ISO 8601 格式日期。通常为模块被弃用日期的两年后。与 :removed_in: 相互排斥。

why:

用于详细说明移除原因的字符串。

alternative:

告知用户应该采取的替代措施,例如,Use M(whatmoduletouseinstead) instead.。有关引用模块以外的其他实体的方法,请参阅 模块文档中的链接

更改 Ansible 主仓库中的模块或插件名称

你也可以重命名一个模块并为旧名称保留一个已弃用的别名,方法是使用以 _ 开头的符号链接。此示例允许使用 fileinfo 调用 stat 模块,使以下示例等效

ln -s stat.py _fileinfo.py
ansible -m stat -a "path=/tmp" localhost
ansible -m fileinfo -a "path=/tmp" localhost

重命名集合中的模块或插件,或将模块或插件重定向到另一个集合

要重命名集合中的模块或插件,或将模块或插件重定向到另一个集合,你需要向 meta/runtime.yml 中的 plugin_routing 添加一个 redirect 条目。例如,要将模块 old_cloud 重定向到 foo.bar.new_cloud,请添加

plugin_routing:
    modules:
        old_cloud:
            redirect: foo.bar.new_cloud

如果要弃用旧名称,请添加 deprecation: 条目(见上文)。

plugin_routing:
    modules:
        old_cloud:
            redirect: foo.bar.new_cloud
            deprecation:
                removal_version: 2.0.0
                warning_text: Use foo.bar.new_cloud instead.

你需要使用新模块/插件名称的完全限定集合名称(FQCN),即使它位于与重定向相同的集合中。通过使用来自另一个集合的 FQCN,你将模块/插件重定向到该集合。

如果你需要支持 Ansible 2.9,请注意 Ansible 2.9 不了解 meta/runtime.yml。使用 Ansible 2.9,你仍然可以通过使用符号链接来重命名一个集合中的插件和模块。请注意,ansible-base 2.10、ansible-core 2.11 及更高版本将优先于符号链接使用 meta/runtime.yml 条目。

在集合中对模块或插件进行“墓碑”操作

要从集合中移除已弃用的模块或插件,你需要对其进行“墓碑”操作

  1. 移除模块或插件文件,以及相关文件,如测试、文档引用和文档。

  2. meta/runtime.yml 中添加一个墓碑条目。例如,要标记模块 old_cloud 为已弃用,请添加以下内容:

    plugin_routing:
        modules:
            old_cloud:
                tombstone:
                    removal_version: 2.0.0
                    warning_text: Use foo.bar.new_cloud instead.
    

    除了 removal_version,您还可以使用 removal_date,并以 ISO 8601 格式的日期表示。此日期应为下一个主要版本的发布日期。