有人可以解释一下如何使用 ansible 实现以下目标吗:
我目前正在使用 win_find 模块(它是一个 Windows 框)递归搜索文件:
- win_find:
paths:
- C:\Apps
patterns: [ 'specific.file' ]
recurse: yes
register: apps_found
这将产生以下列表:
"apps_found": {
"changed": false,
"examined": 785,
"failed": false,
"files": [
{
"attributes": "Archive",
"checksum": "67a43ebf47567ba43a29573a28479180392168d5",
"creationtime": 1560515765.3164558,
"extension": ".file",
"filename": "specific.file",
"isarchive": true,
"isdir": false,
"ishidden": false,
"islnk": false,
"isreadonly": false,
"isshared": false,
"lastaccesstime": 1560515765.2705016,
"lastwritetime": 1560515765.2944584,
"owner": "BUILTIN\\Administrators",
"path": "C:\\Apps\\App1\\specific.file",
"size": 247
},
{
"attributes": "Archive",
"checksum": "64dea9b49819fa4eee34dce52d2dc589a6f9667b",
"creationtime": 1560769272.8943222,
"extension": ".file",
"filename": "specific.file",
"isarchive": true,
"isdir": false,
"ishidden": false,
"islnk": false,
"isreadonly": false,
"isshared": false,
"lastaccesstime": 1560769272.847435,
"lastwritetime": 1560769272.8788242,
"owner": "BUILTIN\\Administrators",
"path": "C:\\Apps\\App2\\specific.file",
"size": 246
}
],
"matched": 2
}
我想要做的是:
对于找到的每个文件,“路径”键/值对,我需要解析子文件夹名称(在本例中为 App1,App2)并将其与特定.file 的内容一起显示。
这样,我的剧本最后就会产生一条这样的消息:
“找到应用程序 app1,其内容为:” “打印文件的内容。”
如何在 Ansible 中轻松完成此操作?非常感谢。
答案1
我没有 Windows 机器可以测试,因此我根据您当前的数据结构和我在 Linux 本地主机上进行的一些测试简要验证了下面的解决方案。
为了满足您的要求,我首先使用了json_query
筛选从结果中提取路径。这用作循环输入slurp
模块检索已注册变量中每个文件的 base64 表示形式。
最后,我使用了win_dirname
和win_basename
过滤器在最后的调试循环中提取您的应用程序名称。
以下是最终的示例剧本(未按照上述建议进行全面测试):
---
- name: Show found app files
hosts: whatever_group
tasks:
- name: Look for files on host
win_find:
paths:
- C:\Apps
patterns: [ 'specific.file' ]
recurse: yes
register: apps_found
- name: Get the content of found files from host
slurp:
src: "{{ item }}"
loop: "{{ apps_found | json_query('files[].path') }}"
register: slurped_files
- name: Display result
debug:
msg: "Found application {{ item.item | win_dirname | win_basename }} with contents: {{ item.content | b64decode }}"
loop: "{{ slurped_files.results }}"