在Ansible中为不同的主机复制不同的文件以供相同角色使用

55次阅读
没有评论

问题描述

在使用Ansible时遇到了一个问题:他有一个名为”apache2″的角色,该角色用于安装apache2及其所有依赖项。现在,他有两台主机,分别是M1和M2。M1和M2都需要安装apache2,但每个主机都需要将自己的文件复制到web根目录。因此,M1.yml文件如下所示:

---
- hosts: M1
  roles:
    - role: apache2

M2.yml文件如下所示:

---
- hosts: M2
  roles:
    - role: apache2

显然,他不能只将文件放在角色的files目录中,因为这些文件对于每个主机都是不同的。他知道的解决方案选项有:
1. 为每个playbook创建一个post_tasks部分,以复制所需的文件并配置服务器。
2. 创建一个名为copy_files的角色,将文件作为变量传递给角色。

他不喜欢方案#1,因为他可能有许多类似的角色(例如apache2、nginx、ftp等),每个角色都需要安装和复制文件。他希望将”安装apache2″和”将apache2文件复制到主机”的任务都放在文件中的相邻位置。他不喜欢方案#2,因为他认为只是将一个任务包装成一个角色似乎过于繁重。他想知道是否还有其他他没有考虑到的选项,以及在可用选项中,哪种被认为是最佳实践。

解决方案

在Ansible中,有一个使用include_role指令的另一种方法。因此,不再需要像这样指定角色:

---
- hosts: M2
  roles:
    - role: apache2

而是可以变为:

---
- hosts: M2
  tasks:
    - include_role: 
        name: apache2

然后,可以在apache2任务之后直接添加配置apache2的任务:

---
- hosts: M2
  tasks:
    - include_role: 
        name: apache2
    - copy:
        # 其他配置

这样,用户可以将”安装apache2″和”配置apache2″的任务都放在文件中的相邻位置。这种方法避免了在每个playbook中都重复指定角色,同时使任务更加清晰和易读。

在这种方法中,可以创建一个单独的apache2角色,用于安装apache2及其依赖项。然后,对于每个主机,可以在apache2任务之后添加其他任务,以完成文件复制和其他配置。这种方法更加轻量,并且将安装和配置的任务组织得更清晰。

这种方法是在Ansible中常见的一种做法,可以被认为是最佳实践之一。它可以有效地将任务模块化,使得playbook更加易于维护和扩展。同时,也符合用户的需求,让”安装apache2″和”配置apache2″的任务放在一起,提高了可读性。

示例

以下是使用include_role指令的一个示例,以在不同的主机上安装apache2并进行配置:

---
- hosts: M1
  tasks:
    - include_role:
        name: apache2
    - copy:
        # 复制M1所需的文件

- hosts: M2
  tasks:
    - include_role:
        name: apache2
    - copy:
        # 复制M2所需的文件
    - other_config_task:
        # 其他配置任务

总结

在使用Ansible时,为不同的主机复制不同的文件以供相同角色使用,可以使用include_role指令。这种方法可以有效地将安装和配置的任务组织起来,使playbook更加清晰易读,符合最佳实践。同时,它也避免了在每个playbook中重复指定角色,减少了冗余。

正文完