注意:我正在使用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
变量是通过对每种虚拟机类型的count
变量执行计算而得出的事实集。 druid
类型运行良好,因为存在count
,但显然不在heavy_nvme
字典中。
我尝试了几种不同的方法,包括将count: 0
添加到heavy_nvme
字典中。我还尝试过完全删除heavy_nvme
字典,或将其设置为空白字典-都无法满足我的要求。
我很确定会发生此错误,因为当您运行条件include
时,该条件只是添加到了包含文件中的每个任务中。那对我来说是行不通的,因为那样的话,我将丢失包含文件中所需的大量变量。
如果heavy_nvme
字典不存在,计数为0或设置了指定的键/变量,是否可以完全阻止这些任务运行(例如active: false
)?