首页 > 解决方案 > 包含有条件的任务文件 - 任务仍在尝试运行?

问题描述

注意:我正在使用 Ansible 1.9.4,目前无法升级

我试图根据嵌套字典是否存在有条件地包含一个任务文件。

我有 4 台主机,其中 1 台有一种我正在调用的虚拟机,heavy_nvme而其他的则没有。我正在尝试同时在所有 4 台主机上运行此剧本。我正在使用group_vars为所有服务器设置所有变量,然后使用单个主机文件来覆盖具有不同要求的服务器的相关字典。

我的组变量如下所示:

virtual_machines:
  type:
    druid:
      os: amazon_linux_2
      count: 0
      memory: 16
      vcpus: 4
      disk: {}
    heavy_nvme:
      active: false

我的include命令如下所示:

- name: destroy virtual machines
  include: destroy-virtual-machines.yml types={{ virtual_machines.type }} name='heavy_nvme'
  when: '"heavy_nvme" in virtual_machines.type and virtual_machines.type.heavy_nvme.count > 0'

当我尝试运行它时,我收到与包含文件中的任务相关的失败:

fatal: [hostname.local] => unknown error parsing with_sequence arguments: u'start=1 end={{ num_machines }}'

这指的是以下行destroy-virtual-machines.yml

- name: destroy virt pools
  command: "virsh pool-destroy {{ vm_name_prefix }}-{{ item }}"
  with_sequence: start=1 end={{ num_machines }}
  ignore_errors: True

发生错误是因为变量是通过对每个虚拟机类型num_machines的变量执行计算而设置的事实。countdruid类型运行良好,因为count存在,但显然它不在heavy_nvme字典中。

我尝试了几种不同的方法,包括count: 0heavy_nvme字典中添加 a。我也尝试过heavy_nvme完全删除字典,或者将其设置为空白字典 - 既不给我我需要的结果。

我很确定会发生此错误,因为当您运行条件时include,条件只是添加到包含文件中的每个任务中。这对我不起作用,因为那样我会丢失包含文件所需的大量变量。

heavy_nvme如果dict 不存在,或者它的计数为 0,或者它有一个指定的键/变量集(例如) ,有没有办法让我完全停止这些任务的运行active: false

标签: ansibleansible-1.x

解决方案


推荐阅读