我正在自动保护 SSL 密钥,如下所示:
- name: Find ssl keys
find: paths="/etc/ssl/" patterns="*.key" recurse=yes
register: secure_ssl_keys_result
- name: Secure ssl keys
file: path={{ item.path }} user=root group=root mode=600
with_items: secure_ssl_keys_result.files
现在,对于每个项目,都有一条包含该项目全部内容的巨大的日志消息:
ok:[127.0.0.1] => (item={u'uid':0,u'woth':False,u'mtime':1454939377.264,u'inode':400377,u'isgid':False,u'size':3243,u'roth':False,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':False,u'path':u'/etc/ssl/foo.key',u'xusr':False,u'atime': 1454939377.264, u'isdir': False, u'ctime': 1454939657.116, u'isblk': False, u'xgrp': False, u'dev': 65025, u'wgrp': False, u'isfifo': False, u'mode': u'0600', u'islnk': False})
这非常难以理解,因为我只想知道正在处理(并且可能更改)的项目的路径。如果有大量的键,这很快就会失控。
我怎样才能改变这种方式,使得只item.path
打印出每个项目?
我已经尝试过了no_log: True
,但是这当然完全省略了输出。
答案1
Ansible 2.2 已实现loop_control.label
此功能。
- name: Secure ssl keys
file: path={{ item.path }} user=root group=root mode=600
with_items: secure_ssl_keys_result.files
loop_control:
label: "{{ item.path }}"
答案2
方法 1
使用
secure_ssl_keys_result.files|map(attribute='path')|list
它将返回路径列表:
['/etc/ssl../', '/etc/ssl/.../']
你的全部任务将会变成:
- name: Secure ssl keys
file: path={{ item }} user=root group=root mode=600
with_items: secure_ssl_keys_result.files|map(attribute='path')|list
请注意,您只能选择单个属性,不能使用attribute=['path', 'mode']
或类似的属性。
方法 2
我想到用提炼能够获取多个键(因为有时需要为某个when
条件添加第二个键),但没能做到,因为我需要映射字典列表,然后将键列表映射到特定字典上,这似乎不可能,因为 map 只接受函数名称,而不接受函数定义/链式函数。如果能在这里提出建议,我将不胜感激!
评论里有个好主意(谢谢,乌迪莎·德席尔瓦!):
- name: Secure ssl keys file: path={{ item.0 }} mode=600 owner={{ item.1 }}
with_together:
- secure_ssl_keys_result.files|map(attribute='path')|list
- secure_ssl_keys_result.files|map(attribute='uid')|list
方法 3
或者,可以使用这样的自定义过滤器(这是我在发现之前所做的map
):
from ansible import errors
import re
def cleandict(items, keepkeys):
try:
newitems = []
if not isinstance(items, list):
items = [items]
if not isinstance(keepkeys, list):
keepkeys = [keepkeys]
for dictionary in items:
newdictionary = {}
for keepkey in keepkeys:
newdictionary[keepkey] = dictionary.get(keepkey)
newitems.append(newdictionary)
return newitems
except Exception, e:
raise errors.AnsibleFilterError('split plugin error: %s' % str(e) )
#raise errors.AnsibleFilterError('split plugin error: %s, string=%s' % str(e),str(items) )
class FilterModule(object):
''' A filter to split a string into a list. '''
def filters(self):
return {
'cleandict' : cleandict
}
ansible.cfg
:
filter_plugins = ~/.ansible/plugins/filter_plugins/:/usr/share/ansible_plugins/filter_plugins
答案3
你不能。要么全有,要么全无(来自no_log: True
)