我对下面的剧本的意图是仅在从disk_list中找到任何值时才运行shell命令。如上文所述,我需要帮助来确定状况。
---
- hosts: localhost
connection: local
gather_facts: false
tasks:
- set_fact:
disk_list:
- sda
- sdb
- sdc
- name: Get df -hT output to know XFS file system
shell: df -hT |grep xfs|awk '{print $1}'
register: df_result
- name: Run shell command on each XFS file system
shell: ls -l {{ item }} | awk '{print $1}'
with_items: "{{ df_result.stdout_lines }}"
when: "{{ disk_list.[] }} in {{ item }}"
顺便说一句,在我的系统中,“ df_result”变量如下所示:
TASK [debug] ***************************************************************************************************************************************
ok: [localhost] => {
"df_result": {
"changed": true,
"cmd": "df -hT |grep xfs|awk '{print $1}'",
"delta": "0:00:00.017588",
"end": "2019-03-01 23:55:21.318871",
"failed": false,
"rc": 0,
"start": "2019-03-01 23:55:21.301283",
"stderr": "",
"stderr_lines": [],
"stdout": "/dev/sda3\n/dev/sda1",
"stdout_lines": [
"/dev/sda3",
"/dev/sda1"
]
}
}
请帮助!
答案 0 :(得分:0)
剧本上的一些笔记。
对于localhost,连接:本地是隐式的。因此,不需要技术上对此进行指定。
set_fact是正确的,但是在这种情况下,我认为更适合在播放级别使用“ vars”而不是在任务中使用set_fact模块。这也使您可以使用“ vars_files”来更轻松地使用磁盘设备列表。
我建议尝试使您的任务名称保持“简单”,因为您有时可能希望使用--start-at-task选项。
with_items偏重于“循环”。
条件“何时”在任务级别工作。因此,如果满足条件,它将执行任务(针对其所有项目)。
这是您需要的工作版本,它也反映了提出的(5)条建议:
---
- hosts: localhost
gather_facts: false
vars:
disk_list:
- sda
- sdb
- sdc
tasks:
- name: cleans previous runs
shell: cat /dev/null > /tmp/df_result
- name: creates temporary file
shell: df -hT | grep ext4 | grep -i {{ item }} | awk '{print $1}' >> /tmp/df_result
loop: "{{ disk_list }}"
- name: creates variable
shell: cat /tmp/df_result
register: df_result
- name: shows info
shell: ls -l {{ item }} | awk '{print $1}'
loop: "{{ df_result.stdout_lines }}"
我基本上只是使用一个临时文件(/ tmp / df_result),而您需要的结果已由任务“创建临时文件”循环中使用的“ grep -i {{item}}”过滤。然后,“显示信息”中的循环仅遍历已经很干净的项目列表。
要在屏幕上查看结果,可以在运行剧本时使用“ -v”选项,或者如果要将结果保存到文件中,则可以在“ ./tmp/df_final”末尾添加“ >> / tmp / df_final” “显示信息”任务中的shell行。
我不小心踩到了这个帖子,它有点陈旧。我相信您已经在您的环境中解决了这个问题,也许您找到了更好的方法,希望您做到了。
此致