使用Ansible实现类似YAML锚点和别名的方法,在使用include文件时的等效方法

69次阅读
没有评论

问题描述

在使用Ansible的aci_rest模块时,每个任务都需要定义认证参数(hostnameusernamepasswordmethodvalidate_certs),如下所示:

aci_rest:
  hostname: "{{ inventory_hostname }}"
  username: "{{ apic_username }}"
  password: "{{ apic_password }}"
  method: post
  validate_certs: no
  path: /api/node/mo/uni/controller/nodeidentpol.json
  method: post
  # ...其他配置

YAML的锚点和别名语法在单个文件中可以正常工作,例如:

- aci_rest:
    <<: *aci_login
    path: /api/node/mo/uni/controller/nodeidentpol.json
    method: post
    # ...其他配置

但是,当变量和任务位于不同文件中,并使用以下功能之一时,就无法正常工作:

vars_files:
include_tasks:
include_vars:

在包含70多个任务的完整剧本中,每次都需要重复认证信息。您是否可以像YAML别名一样,找到一种不使用重复代码的方法?

解决方案

请注意以下操作可能因版本差异而有所不同,建议在操作前进行备份。

方案

在处理这个问题时,您可以使用Ansible的module_defaults剧本级选项来减少重复代码。这将允许您在一个地方定义默认值,然后在各个任务中使用这些默认值,从而避免在每个任务中重复定义认证参数。

以下是使用module_defaults选项的示例:

- hosts: localhost
  module_defaults:
    aci_rest:
      hostname: "{{ inventory_hostname }}"
      username: "{{ apic_username }}"
      password: "{{ apic_password }}"
      method: post
      validate_certs: no

  tasks:
    - aci_rest:
        path: /api/node/mo/uni/controller/nodeidentpol.json
        method: post
        # ...其他配置
    - aci_rest:
        path: /api/some/other/path.json
        method: get
        # ...其他配置

在上面的示例中,我们首先在module_defaults选项中定义了aci_rest的默认值,包括认证参数。然后,在每个任务中,我们只需要提供与认证参数无关的配置,因为认证参数已经在module_defaults中定义了。

通过这种方式,您可以避免在每个任务中重复定义认证参数,从而使您的剧本更加简洁和易于维护。

请注意,module_defaults选项在Ansible的某些版本中可能不可用,因此请确保您的Ansible版本支持此选项。如果您的版本不支持,您可能需要考虑其他方式来减少重复代码。

正文完