다음과 같이 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’ 크기 ‘: 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
했지만 이것은 물론 출력을 완전히 생략합니다.
답변
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 }}"
답변
방법 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
했지만 (조건에 두 번째 키가 필요할 때가 있기 때문에 ) dicts 목록을 매핑 한 다음 매핑해야하므로 관리하지 못했습니다. map은 함수 이름 만 허용하고 함수 정의 / 연쇄 함수는 허용하지 않으므로 특정 dict에 대한 키 목록은 불가능 해 보입니다. 여기에 제안 해 주셔서 감사합니다!
의견에서 좋은 아이디어 (감사합니다, Uditha Desilva !) :
- 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
답변
당신은 할 수 없습니다. 그것은 전부이거나 아무것도 아닙니다 (를 통해 no_log: True
)