Ansible 在每个库存主机的多个项目上循环注册变量
我有以下样本库存(为简洁起见进行了调整):Ansible 在每个库存主机的多个项目上循环注册变量,ansible,Ansible,我有以下样本库存(为简洁起见进行了调整): 全部: 主持人: foo1.example.com: 磁盘: -磁盘:/dev/sdaa -磁盘:/dev/sdab -磁盘:/dev/sdac -磁盘:/dev/sdad foo2.example.com: 磁盘: -磁盘:/dev/sdaa -磁盘:/dev/sdab -磁盘:/dev/sdac -磁盘:/dev/sdad 我有一个游戏,我在每个磁盘上循环,对每个磁盘执行shell命令,并注册输出。基本上,标准输出将是“真”或“假” -名称:“检
全部:
主持人:
foo1.example.com:
磁盘:
-磁盘:/dev/sdaa
-磁盘:/dev/sdab
-磁盘:/dev/sdac
-磁盘:/dev/sdad
foo2.example.com:
磁盘:
-磁盘:/dev/sdaa
-磁盘:/dev/sdab
-磁盘:/dev/sdac
-磁盘:/dev/sdad
我有一个游戏,我在每个磁盘上循环,对每个磁盘执行shell命令,并注册输出。基本上,标准输出将是“真”或“假”
-名称:“检查磁盘运行状况”
shell:/sbin/smartctl-H-j{{item.disk}}}{jq'.smart_status.passed'
注册:通过
有以下项目:
-“{{hostvars[inventory_hostname].disks}”
回路控制:
标签:“/sbin/smartctl-H-j{{item.disk}”
出于某种原因,我不知道如何在assert语句中循环这个。我知道几年前我做过类似的事情,但找不到我的笔记或任何例子
对于每个主机,我需要循环每个磁盘的输出并断言传递==true
当我执行以下调试播放时:
-调试:
变量:“{item}}”
有以下项目:
-通过
我得到以下输出(为简洁起见进行了修剪):
附带初步说明:
可以缩短为{{hostvars[inventory\u hostname].disks}
{{disks}
是一个列表,因此您不应该将其作为列表列表循环传递给您(即使{{disks}}
对您来说是透明平坦的…)with_items
-名称:“检查磁盘运行状况”
shell:/sbin/smartctl-H-j{{item.disk}}}{jq'.smart_status.passed'
注册:通过
带_项:“{disks}”
回路控制:
标签:“/sbin/smartctl-H-j{{item.disk}”
您正在变量passed
如和中所述,对循环中的寄存器进行了修改,以包括一个topresults
元素,该元素是循环中所有单个结果的列表
如果我理解得很清楚,您希望在这些结果中进行测试
所有元素的属性中都有的“true”
。你不需要为此循环,你可以在一次运行中检查它
下面的示例演示了我将要做的:从结果列表中提取所有stdout
属性,使用bool
过滤器映射每个元素以转换为实际布尔值,并使用all
测试确保所有值都True
-name:断言所有通过smartctl测试的磁盘
断言:
这就是:(passed.results | map(attribute='stdout')| map('bool')| list)的全部内容
消息:一个或多个磁盘未通过测试
ok: [foo1.example.com] => (item=passed) => {
"ansible_loop_var": "item",
"item": "passed",
"passed": {
"changed": true,
"msg": "All items completed",
"results": [
{
"ansible_loop_var": "item",
"changed": true,
"cmd": "/sbin/smartctl -H -j /dev/sdaa | jq '.smart_status.passed'",
"stdout": "true",
"stdout_lines": [
"true"
]
},
{
"ansible_loop_var": "item",
"changed": true,
"cmd": "/sbin/smartctl -H -j /dev/sdab | jq '.smart_status.passed'",
"stdout": "true",
"stdout_lines": [
"true"
]
},
{
"ansible_loop_var": "item",
"changed": true,
"cmd": "/sbin/smartctl -H -j /dev/sdac | jq '.smart_status.passed'",
"stdout": "true",
"stdout_lines": [
"true"
]
},
{
"ansible_loop_var": "item",
"changed": true,
"cmd": "/sbin/smartctl -H -j /dev/sdad | jq '.smart_status.passed'",
"stdout": "true",
"stdout_lines": [
"true"
]
}
]
}
}