注意:我正在使用 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
字典中添加 a。我也尝试过heavy_nvme
完全删除字典,或者将其设置为空白字典 - 既不给我我需要的结果。
我很确定会发生此错误,因为当您运行条件时include
,条件只是添加到包含文件中的每个任务中。这对我不起作用,因为那样我会丢失包含文件所需的大量变量。
heavy_nvme
如果dict 不存在,或者它的计数为 0,或者它有一个指定的键/变量集(例如) ,有没有办法让我完全停止这些任务的运行active: false
?