我想知道是否可以使用 Ansiblewhen
在循环中改变的条件下测试 2 个值。
disksizefromjson
是我从 json 文件中提取的变量(当我删除when
条件时,这个值被正确改变)。
item['Size']
是我使用 powershell 命令从上一个任务中提取的变量。
---
- name: get disk info on windows vm
ansible.windows.win_powershell:
script: |
Get-ciminstance win32_volume -Filter DriveType=3 | where-object{$_.Label -notlike "*Reserved*" -and $_.SystemVolume -ne $true} | Select-Object Name, Label, FileSystem, BlockSize, @{'Name'='Size'; 'Expression'={[math]::Ceiling($_.Capacity / 1GB)}}, @{'Name'='Freespace'; 'Expression'={[math]::Ceiling($_.Freespace / 1GB)}}, @{'Name'='Free'; 'Expression'={[math]::Ceiling(($_.Freespace * 100)/$_.Capacity)}} | Sort-Object Name
register: diskNewVm
- name: test disk size
set_fact:
disksizefromjson: "{{ diskinfosfromjson | from_json | selectattr('Name', 'equalto', item['Name']) | map(attribute='Size') | first | default(10) }}"
when: item['Size'] > disksizefromjson
loop: "{{ diskNewVm.output }}"
这会导致以下错误:
The conditional check 'item['Size'] > disksizefromjson' failed. The error was: error while evaluating conditional (item['Size'] > disksizefromjson): 'disksizefromjson' is undefined
当我删除该when
条件时,disksizefromjson
定义就很好了......
那么,when 条件中可能有 2 个变量吗?
当然,你可以在那里使用任意数量的变量。但 Ansible 给出的错误绝对是可以预料到的,因为在循环的第一次迭代中,
disksizefromjson
变量(顺便说一句,Ansible 是基于 Python 的,因此建议使用蛇形命名法)尚不存在。如果您知道您的案例的安全默认值,您可以简单地使用
default
过滤器定义它(请注意,我使用了修剪的多行 YAML 字符串,没有换行符保留,以便更好地阅读长链 Jinja2 过滤器):说到这,你似乎试图这样做是因为你
| default(10)
在变量定义本身中使用了。你的模板还有另一个问题:default
过滤器和其他任何过滤器一样,不能完全像 try-catch 构造那样工作,它引用的是前一个值。所以,在你的情况下,只有当first
你的项目map(attribute='Size')
未定义时它才会起作用。你认为这样的事可能吗?
我测试过了但是每个循环都被跳过了......