我想知道是否可以使用 Ansible 在循环中更改的
when
条件下测试 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个变量?
那么,when条件下是否可以有2个变量?
当然,您可以在那里使用任意数量的变量。但是 Ansible 给出的错误绝对是预料之中的,因为在循环的第一次迭代期间,
disksizefromjson
变量(顺便说一下,Ansible 是基于 Python 的,因此建议使用蛇形命名法)尚不存在。
如果您知道适合您的情况的安全默认值,则可以简单地使用
default
过滤器定义它(请注意,我使用了修剪后的多行 YAML 字符串,没有保留换行符,以提高 Jinja2 过滤器长链的可读性):
- 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 | default(10)
loop: "{{ diskNewVm.output }}"
说到这里,您似乎试图这样做,因为您在变量定义本身内部使用了
| default(10)
。您的模板还有另一个问题: default
过滤器与其他过滤器一样,不能完全像 try-catch 构造一样工作,它引用以前的值。因此,就您而言,仅当您的 first
的 map(attribute='Size')
项未定义时才有效。