根据变量或组选择 Ansible 模块的解决方案

81次阅读
没有评论

问题描述

在 Ansible 中,有许多网络模块(例如:ios_user、asa_user、nxos_user)共享相同或相似的接口。目前,我的 Playbook 必须根据主机的组或变量条件性地执行任务。这导致了大量重复的代码,因为任务之间唯一的实际区别就是模块名称。

是否有一种方法可以基于组或变量值选择要运行的模块,而无需添加额外的任务、角色或 Playbook 呢?

例如,当前 Playbook 如下所示:

- hosts: ios
  tasks:
    ios_user:
      provider: "{{ cli }}"
      ...

- hosts: asa
  tasks:
    asa_user:
      provider: "{{ cli }}"
      ...

- hosts: nxos
  tasks:
    nxos_user:
      provider: "{{ cli }}"
      ...

我希望能够实现类似以下的功能:

- hosts: all
  tasks:
    {{ module_name }}:
      provider: "{{ cli }}"
      ...

解决方案

请注意以下操作可能涉及版本差异,请在实际操作前做好备份。

方案1:使用变量控制模块名称

你可以使用 Ansible 的变量来控制要运行的模块名称。这样你就可以根据不同的变量值来选择要执行的模块。以下是如何实现的步骤:

  1. 在组变量或主机变量中添加一个名为 module_name 的变量,并设置不同的模块名称作为其值。例如,你可以在 group_vars/hosts1group_vars/hosts2 中分别设置:
# group_vars/hosts1
module_name: ios_user

# group_vars/hosts2
module_name: asa_user
  1. 修改你的 Playbook,使用变量来指定要执行的模块。例如:
- hosts: all
  tasks:
    "{{ module_name }}":
      provider: "{{ cli }}"
      ...

这样,在不同的主机组中,module_name 变量会根据组变量的设置而自动选择不同的模块名称。

方案2:使用条件语句控制模块名称

你还可以使用 Ansible 的条件语句来根据组或变量的值选择要执行的模块。以下是一个示例步骤:

  1. 在你的 Playbook 中,使用条件语句根据组名或变量值来选择要执行的模块。例如:
- hosts: all
  tasks:
    - name: Execute module based on condition
      include_tasks: "{{ module_name }}_task.yml"
      when: "'ios' in group_names and module_name == 'ios_user'"
            or 'asa' in group_names and module_name == 'asa_user'
            or 'nxos' in group_names and module_name == 'nxos_user'
  1. 创建针对不同模块的任务文件,例如 ios_user_task.ymlasa_user_task.ymlnxos_user_task.yml 等。在这些文件中,定义不同模块的具体任务。例如:
# ios_user_task.yml
- ios_user:
    provider: "{{ cli }}"
    ...

通过使用条件语句和包含任务,你可以根据不同的条件选择要执行的任务文件,从而实现根据组或变量选择不同模块的目的。

请根据你的实际需求,选择适合你情况的方案进行实施。

总结

通过使用变量或条件语句,你可以在 Ansible 中实现根据组或变量选择不同模块的功能。这将帮助你减少代码的重复性,提高配置的灵活性和可维护性。

希望本文对你解决问题有所帮助!如有任何疑问,请随时向我们提问。

正文完