问题描述
在使用Ansible的aci_rest
模块时,每个任务都需要定义认证参数(hostname
、username
、password
、method
、validate_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版本支持此选项。如果您的版本不支持,您可能需要考虑其他方式来减少重复代码。
正文完