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

如和中所述,对循环中的寄存器进行了修改,以包括一个top
results
元素,该元素是循环中所有单个结果的列表

如果我理解得很清楚,您希望在这些
结果中进行测试
所有元素的
属性中都有
的“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"
                ]
            }
        ]
    }
}