首页 > 解决方案 > 有没有更好的方法来重组没有“include_tasks”的剧本并同时运行任务?

问题描述

我需要一种方法来加快我的剧本,也许是更好的逻辑重组。它现在按顺序运行。任务很简单——从 AWX 运行将备份 VM 列表的 playbook。

我在 AWX 额外变量中提供了一个虚拟机列表:

backupList:
  - vmName: VM1
    backupAge: 2d
  - vmName: VM2
    backupAge: 5d
  - vmName: VM3
    backupAge: 1d
backupDirectory: /vmfs/volumes/NFS_BACKUPS

第一个剧本很简单:

- name: Process VM backup here
  include_tasks: processBackup.yml
  vars:
    vm_name: "{{ item.vmName }}"
    backupAge: "{{ item.backupAge }}"
  with_items: "{{ backupList }}"

它通过使用“include_tasks”调用第二个剧本来读取额外的变量并循环,其中所有功能都被写入:克隆虚拟机,复制到 NFS 服务器并确保我们保留定义数量的备份副本。

基本上使用不同的 VM 名称和备份时间执行相同的一组任务。在这种配置中,它是按顺序执行的,需要很长时间,尤其是复制到备份服务器。

所以,我想知道是否有更好的方法来重构代码以同时为每个 VM 名称运行任务?

标签: ansible

解决方案


这是我最终得到的解决方案,它适用于我的示例。我在 AWX 清单中创建了一组名为“backup”的主机,其中包含我需要备份的那些 VM 的主机名的 IP。我从模板中移动了额外的变量并将它们放在组中的每个主机下,所以它看起来像这样(每个 IP 的值不同):

---
vmName: VM1
backupAge: 2d
backupDirectory: /vmfs/volumes/NFS_BACKUPS

现在,当 ansible 迭代抛出“备份”组中的主机列表时,它也可以访问自己的变量。另外,在模板中启用分叉后,我获得了 ansible 的自然线程功能。

我的第二个剧本没有改变,但第一个剧本(又名驱动程序)发生了一些变化——我不再需要“<code>with_items”了:

- name: Backup VMs to NFS server
  hosts: backup
  gather_facts: no

  tasks:

    - name: Process VM backup here
      include_tasks: processBackup.yml
      vars:
        vm_name: "{{ vmName }}"
        backupAge: "{{ backupAge }}"
      delegate_to: localhost

希望它会帮助某人:)


推荐阅读