ansible:在一个循环中注册find模块返回值,并在另一个循环中提取.path属性
我正在尝试在用户的主目录中查找用户列表的所有“.vim*”文件,并在以后将其删除 我所做的:ansible:在一个循环中注册find模块返回值,并在另一个循环中提取.path属性,ansible,Ansible,我正在尝试在用户的主目录中查找用户列表的所有“.vim*”文件,并在以后将其删除 我所做的: vars: vim_users: - user1 - user2 tasks: - name: finding old vim configs in ~/ for all users find: file_type: any paths: ~/ patterns: '.vim*' hidden: yes register: user_vim_
vars:
vim_users:
- user1
- user2
tasks:
- name: finding old vim configs in ~/ for all users
find:
file_type: any
paths: ~/
patterns: '.vim*'
hidden: yes
register: user_vim_config_files
become: yes
become_user: "{{ item }}"
with_items: "{{ vim_users }}"
- debug:
msg: "{{ item.files.path }}"
with_items:
- "{{ user_vim_config_files.results}}"
但是获取调试模块失败:
TASK [debug] *******************************************************************************************************************************
fatal: [rpi]: FAILED! => {"failed": true, "msg": "the field 'args' has an invalid value, which appears to include a variable that is undefined.
The error was: 'list object' has no attribute 'path'\n\nThe error appears to have been in '/Users/drew/CloudStation/rpi-scripts/minibian_start/ansible/test.yml': line 51, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - debug:\n ^ here\n"}
to retry, use: --limit @/Users/drew/CloudStation/rpi-scripts/minibian_start/ansible/test.retry
虽然如果我删除“.path”(路径-这是我以后使用文件模块删除文件所需的路径),并执行相同的操作,但是:
...
- debug:
msg: "{{ item.files }}"
with_items:
- "{{ user_vim_config_files.results}}"
然后我得到这个:
TASK [debug] *******************************************************************************************************************************
ok: [rpi] => (item={u'files': [{u'uid': 1000, u'woth': False, u'mtime': 1506392506.3046005, u'inode': 9017, u'isgid': False, u'size': 951, u'roth': False, u'isuid': False, u'isreg': True, u'gid': 1000, u'ischr': False, u'wusr': True, u'xoth': False, u'rusr': True, u'nlink': 1, u'issock': False, u'rgrp': False, u'path': u'/home/drew/.viminfo', u'xusr': False, u'atime': 1506392506.3046005, u'isdir': False, u'ctime': 1506392506.3046005, u'wgrp': False, u'xgrp': False, u'dev': 45826, u'isblk': False, u'isfifo': False, u'mode': u'0600', u'islnk': False}, {u'uid': 0, u'woth': False, u'mtime': 1506872972.448914, u'inode': 118, u'isgid': False, u'size': 0, u'roth': True, u'isuid': False, u'isreg': True, u'gid': 0, u'ischr': False, u'wusr': True, u'xoth': False, u'rusr': True, u'nlink': 1, u'issock': False, u'rgrp': True, u'path': u'/home/drew/.vimrc', u'xusr': False, u'atime': 1506872972.448914, u'isdir': False, u'ctime': 1506872972.448914, u'wgrp': False, u'xgrp': False, u'dev': 45826, u'isblk': False, u'isfifo': False, u'mode': u'0644', u'islnk': False}, {u'uid': 0, u'woth': False, u'mtime': 1506872982.078843, u'inode': 140, u'isgid': False, u'size': 4096, u'roth': True, u'isuid': False, u'isreg': False, u'gid': 0, u'ischr': False, u'wusr': True, u'xoth': True, u'rusr': True, u'nlink': 2, u'issock': False, u'rgrp': True, u'path': u'/home/drew/.vim', u'xusr': True, u'atime': 1506872982.078843, u'isdir': True, u'ctime': 1506872982.078843, u'wgrp': False, u'xgrp': True, u'dev': 45826, u'isblk': False, u'isfifo': False, u'mode': u'0755', u'islnk': False}], '_ansible_parsed': True, u'changed': False, '_ansible_no_log': False, '_ansible_item_result': True, 'item': u'drew', u'examined': 9, u'msg': u'', u'invocation': {u'module_args': {u'paths': [u'~/'], u'file_type': u'any', u'age': None, u'contains': None, u'recurse': False, u'age_stamp': u'mtime', u'patterns': [u'.vim*'], u'get_checksum': False, u'use_regex': False, u'follow': False, u'hidden': True, u'size': None}}, u'matched': 3}) => {
"item": {
"changed": false,
"examined": 9,
"files": [
{
"atime": 1506392506.3046005,
"ctime": 1506392506.3046005,
"dev": 45826,
"gid": 1000,
"inode": 9017,
"isblk": false,
"ischr": false,
"isdir": false,
"isfifo": false,
"isgid": false,
"islnk": false,
"isreg": true,
"issock": false,
"isuid": false,
"mode": "0600",
"mtime": 1506392506.3046005,
"nlink": 1,
"path": "/home/user1/.viminfo",
"rgrp": false,
"roth": false,
"rusr": true,
"size": 951,
"uid": 1000,
"wgrp": false,
"woth": false,
"wusr": true,
"xgrp": false,
"xoth": false,
"xusr": false
},
{
"atime": 1506872972.448914,
"ctime": 1506872972.448914,
"dev": 45826,
"gid": 0,
"inode": 118,
"isblk": false,
"ischr": false,
"isdir": false,
"isfifo": false,
"isgid": false,
"islnk": false,
"isreg": true,
"issock": false,
"isuid": false,
"mode": "0644",
"mtime": 1506872972.448914,
"nlink": 1,
"path": "/home/user1/.vimrc",
"rgrp": true,
"roth": true,
"rusr": true,
"size": 0,
"uid": 0,
"wgrp": false,
"woth": false,
"wusr": true,
"xgrp": false,
"xoth": false,
"xusr": false
},
{
"atime": 1506872982.078843,
"ctime": 1506872982.078843,
"dev": 45826,
"gid": 0,
"inode": 140,
"isblk": false,
"ischr": false,
"isdir": true,
"isfifo": false,
"isgid": false,
"islnk": false,
"isreg": false,
"issock": false,
"isuid": false,
"mode": "0755",
"mtime": 1506872982.078843,
"nlink": 2,
"path": "/home/user1/.vim",
"rgrp": true,
"roth": true,
"rusr": true,
"size": 4096,
"uid": 0,
"wgrp": false,
"woth": false,
"wusr": true,
"xgrp": true,
"xoth": true,
"xusr": true
}
],
"invocation": {
"module_args": {
"age": null,
"age_stamp": "mtime",
"contains": null,
"file_type": "any",
"follow": false,
"get_checksum": false,
"hidden": true,
"paths": [
"~/"
],
"patterns": [
".vim*"
],
"recurse": false,
"size": null,
"use_regex": false
}
},
"item": "user1",
"matched": 3,
"msg": ""
},
"msg": [
{
"atime": 1506392506.3046005,
"ctime": 1506392506.3046005,
"dev": 45826,
"gid": 1000,
"inode": 9017,
"isblk": false,
"ischr": false,
"isdir": false,
"isfifo": false,
"isgid": false,
"islnk": false,
"isreg": true,
"issock": false,
"isuid": false,
"mode": "0600",
"mtime": 1506392506.3046005,
"nlink": 1,
"path": "/home/user1/.viminfo",
"rgrp": false,
"roth": false,
"rusr": true,
"size": 951,
"uid": 1000,
"wgrp": false,
"woth": false,
"wusr": true,
"xgrp": false,
"xoth": false,
"xusr": false
},
{
"atime": 1506872972.448914,
"ctime": 1506872972.448914,
"dev": 45826,
"gid": 0,
"inode": 118,
"isblk": false,
"ischr": false,
"isdir": false,
"isfifo": false,
"isgid": false,
"islnk": false,
"isreg": true,
"issock": false,
"isuid": false,
"mode": "0644",
"mtime": 1506872972.448914,
"nlink": 1,
"path": "/home/user1/.vimrc",
"rgrp": true,
"roth": true,
"rusr": true,
"size": 0,
"uid": 0,
"wgrp": false,
"woth": false,
"wusr": true,
"xgrp": false,
"xoth": false,
"xusr": false
},
{
"atime": 1506872982.078843,
"ctime": 1506872982.078843,
"dev": 45826,
"gid": 0,
"inode": 140,
"isblk": false,
"ischr": false,
"isdir": true,
"isfifo": false,
"isgid": false,
"islnk": false,
"isreg": false,
"issock": false,
"isuid": false,
"mode": "0755",
"mtime": 1506872982.078843,
"nlink": 2,
"path": "/home/user1/.vim",
"rgrp": true,
"roth": true,
"rusr": true,
"size": 4096,
"uid": 0,
"wgrp": false,
"woth": false,
"wusr": true,
"xgrp": true,
"xoth": true,
"xusr": true
}
]
}
ok: [rpi] => (item={u'files': [{u'uid': 0, u'woth': False, u'mtime': 1506876109.5467849, u'inode': 20, u'isgid': False, u'size': 0, u'roth': True, u'isuid': False, u'isreg': True, u'gid': 0, u'ischr': False, u'wusr': True, u'xoth': False, u'rusr': True, u'nlink': 1, u'issock': False, u'rgrp': True, u'path': u'/home/pi/.vimrc', u'xusr': False, u'atime': 1506876109.5467849, u'isdir': False, u'ctime': 1506876109.5467849, u'wgrp': False, u'xgrp': False, u'dev': 45826, u'isblk': False, u'isfifo': False, u'mode': u'0644', u'islnk': False}, {u'uid': 0, u'woth': False, u'mtime': 1506876112.2067666, u'inode': 145, u'isgid': False, u'size': 0, u'roth': True, u'isuid': False, u'isreg': True, u'gid': 0, u'ischr': False, u'wusr': True, u'xoth': False, u'rusr': True, u'nlink': 1, u'issock': False, u'rgrp': True, u'path': u'/home/pi/.vimrca', u'xusr': False, u'atime': 1506876112.2067666, u'isdir': False, u'ctime': 1506876112.2067666, u'wgrp': False, u'xgrp': False, u'dev': 45826, u'isblk': False, u'isfifo': False, u'mode': u'0644', u'islnk': False}, {u'uid': 0, u'woth': False, u'mtime': 1506876114.9767478, u'inode': 146, u'isgid': False, u'size': 0, u'roth': True, u'isuid': False, u'isreg': True, u'gid': 0, u'ischr': False, u'wusr': True, u'xoth': False, u'rusr': True, u'nlink': 1, u'issock': False, u'rgrp': True, u'path': u'/home/pi/.vim', u'xusr': False, u'atime': 1506876114.9767478, u'isdir': False, u'ctime': 1506876114.9767478, u'wgrp': False, u'xgrp': False, u'dev': 45826, u'isblk': False, u'isfifo': False, u'mode': u'0644', u'islnk': False}], '_ansible_parsed': True, u'changed': False, '_ansible_no_log': False, '_ansible_item_result': True, 'item': u'pi', u'examined': 8, u'msg': u'', u'invocation': {u'module_args': {u'paths': [u'~/'], u'file_type': u'any', u'age': None, u'contains': None, u'recurse': False, u'age_stamp': u'mtime', u'patterns': [u'.vim*'], u'get_checksum': False, u'use_regex': False, u'follow': False, u'hidden': True, u'size': None}}, u'matched': 3}) => {
"item": {
"changed": false,
"examined": 8,
"files": [
{
"atime": 1506876109.5467849,
"ctime": 1506876109.5467849,
"dev": 45826,
"gid": 0,
"inode": 20,
"isblk": false,
"ischr": false,
"isdir": false,
"isfifo": false,
"isgid": false,
"islnk": false,
"isreg": true,
"issock": false,
"isuid": false,
"mode": "0644",
"mtime": 1506876109.5467849,
"nlink": 1,
"path": "/home/user2/.vimrc",
"rgrp": true,
"roth": true,
"rusr": true,
"size": 0,
"uid": 0,
"wgrp": false,
"woth": false,
"wusr": true,
"xgrp": false,
"xoth": false,
"xusr": false
},
{
"atime": 1506876112.2067666,
"ctime": 1506876112.2067666,
"dev": 45826,
"gid": 0,
"inode": 145,
"isblk": false,
"ischr": false,
"isdir": false,
"isfifo": false,
"isgid": false,
"islnk": false,
"isreg": true,
"issock": false,
"isuid": false,
"mode": "0644",
"mtime": 1506876112.2067666,
"nlink": 1,
"path": "/home/user2/.vimrca",
"rgrp": true,
"roth": true,
"rusr": true,
"size": 0,
"uid": 0,
"wgrp": false,
"woth": false,
"wusr": true,
"xgrp": false,
"xoth": false,
"xusr": false
},
{
"atime": 1506876114.9767478,
"ctime": 1506876114.9767478,
"dev": 45826,
"gid": 0,
"inode": 146,
"isblk": false,
"ischr": false,
"isdir": false,
"isfifo": false,
"isgid": false,
"islnk": false,
"isreg": true,
"issock": false,
"isuid": false,
"mode": "0644",
"mtime": 1506876114.9767478,
"nlink": 1,
"path": "/home/user2/.vim",
"rgrp": true,
"roth": true,
"rusr": true,
"size": 0,
"uid": 0,
"wgrp": false,
"woth": false,
"wusr": true,
"xgrp": false,
"xoth": false,
"xusr": false
}
],
"invocation": {
"module_args": {
"age": null,
"age_stamp": "mtime",
"contains": null,
"file_type": "any",
"follow": false,
"get_checksum": false,
"hidden": true,
"paths": [
"~/"
],
"patterns": [
".vim*"
],
"recurse": false,
"size": null,
"use_regex": false
}
},
"item": "user2",
"matched": 3,
"msg": ""
},
"msg": [
{
"atime": 1506876109.5467849,
"ctime": 1506876109.5467849,
"dev": 45826,
"gid": 0,
"inode": 20,
"isblk": false,
"ischr": false,
"isdir": false,
"isfifo": false,
"isgid": false,
"islnk": false,
"isreg": true,
"issock": false,
"isuid": false,
"mode": "0644",
"mtime": 1506876109.5467849,
"nlink": 1,
"path": "/home/user2/.vimrc",
"rgrp": true,
"roth": true,
"rusr": true,
"size": 0,
"uid": 0,
"wgrp": false,
"woth": false,
"wusr": true,
"xgrp": false,
"xoth": false,
"xusr": false
},
{
"atime": 1506876112.2067666,
"ctime": 1506876112.2067666,
"dev": 45826,
"gid": 0,
"inode": 145,
"isblk": false,
"ischr": false,
"isdir": false,
"isfifo": false,
"isgid": false,
"islnk": false,
"isreg": true,
"issock": false,
"isuid": false,
"mode": "0644",
"mtime": 1506876112.2067666,
"nlink": 1,
"path": "/home/user2/.vimrca",
"rgrp": true,
"roth": true,
"rusr": true,
"size": 0,
"uid": 0,
"wgrp": false,
"woth": false,
"wusr": true,
"xgrp": false,
"xoth": false,
"xusr": false
},
{
"atime": 1506876114.9767478,
"ctime": 1506876114.9767478,
"dev": 45826,
"gid": 0,
"inode": 146,
"isblk": false,
"ischr": false,
"isdir": false,
"isfifo": false,
"isgid": false,
"islnk": false,
"isreg": true,
"issock": false,
"isuid": false,
"mode": "0644",
"mtime": 1506876114.9767478,
"nlink": 1,
"path": "/home/user2/.vim",
"rgrp": true,
"roth": true,
"rusr": true,
"size": 0,
"uid": 0,
"wgrp": false,
"woth": false,
"wusr": true,
"xgrp": false,
"xoth": false,
"xusr": false
}
]
}
因此据我所知,我可以访问{{item.files}并查看列表中所有用户的路径“:/home/user#/.vim”,但无法访问item.files.path属性。为什么?您建议如何提取这些信息?或者有更好的方法
更新
尝试:
- name: removing old vim configuration
file: path="{{ item.files | map(attribute='path') | list }}" state=absent
become: yes
with_items: "{{ user_vim_confg_files.results }}"
结果:文件仍然存在,未删除。
绿色输出(而不是预期的黄色变化)
我猜路径现在是一个路径列表。。。那么,在这种情况下,我如何组织某种嵌套循环呢?还是我错了
更新
尝试按建议展平:
- name: removing old vim configuration
file:
path: "{{ user_vim_config_files.results | sum(attribute='files', start=[]) | map(attribute='path') | list }}"
state: absent
become: yes
结果为绿色,而不是预期的黄色-未删除任何匹配的文件。这里有什么问题
[]无法访问项.files.path
属性。为什么?
因为它不存在<代码>文件是一个列表,因此项。文件[0]。路径
,项。文件[1]。路径
等确实存在,但在项。文件
中没有路径
键
您建议如何提取这些信息
例如:
{{ item.files | map(attribute='path') | list }}
或者有更好的方法
您可以将整个结果字典展平,一下子获得路径列表:
{{ user_vim_confg_files.results | sum(attribute='files', start=[]) | map(attribute='path') | list }}
在此处发布应用的解决方案:
vars:
vim_users:
- user1
- user2
tasks:
- name: finding old vim configs in ~/ for all users
find:
file_type: any
paths: ~/
patterns: '.vim*'
hidden: yes
register: user_vim_config_files
become: yes
become_user: "{{ item }}"
with_items: "{{ vim_users }}"
- name: removing old vim configuration
file:
path: "{{ item }}"
state: absent
become: yes
with_items:
- "{{ user_vim_config_files.results | sum(attribute='files', start=[]) | map(attribute='path') | list }}"
我知道这是一种丑陋的解决方案,但至少它是有效的。。。哈哈
说明:
"{{ user_vim_config_files.results | sum(attribute='files', start=[]) | map(attribute='path') | list }}"
返回从用户_vim_config_文件中提取的路径列表。结果
文件模块迭代每个路径并删除所有文件。Json\u查询功能强大且(可以)简单易用:
- name: Recursively find config.yml in /etc
find:
paths: /etc
patterns: 'config.yml'
recurse: yes
register: filelist
- name: use shell to print list of file paths
shell: "echo {{ item }}"
with_items: "{{ filelist.files|map(attribute='path')|list }}"
loop: "{{ user_vim_config_files.results | json_query('[*].files[*].path') }}"
如果您在原始问题中使用了
debug
模块,您会发现您的“更新”是非感官的<文件
模块的code>path参数不接受列表。这就是循环的作用。如果你能仔细阅读第一次更新,那么你会注意到这里的问题。。。我想你有答案了吧?我对阅读你的更新没有兴趣。你问了一个问题,我回答了,这是你的问题,你不能应用它。“它不工作”-打字技能可能不足以管理系统。我不关心你的兴趣。。。你的答案不适用。我想你不知道如何应用你自己的无意义的解决方案。在这种情况下,你的进一步评论是完全无用的。请不要麻烦了。。。干杯。逻辑和解释明目张胆地抄袭自(引用“获取路径列表”)。这个问题也与原始问题不同,原始问题要求在debug
任务中使用表达式。@techraf您的观点最终是主观的,因为在没有应用程序示例的情况下抛出解决方案的一部分不是完整的答案,也不是以其他不同技能水平的人可以轻松看到的形状显示的理解或应用。这个答案正好说明了如何应用这个方法,如下面的帖子所示。。。因此,这是一个完整回答的好例子在运行删除文件的操作之前,我会先运行一个列出要删除的文件的操作。。。。