Ansible with_items가 전체 항목을 인쇄하지 않습니까?


16

다음과 같이 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했지만 이것은 물론 출력을 완전히 생략합니다.


어쩌면 [Jinja Filter] (docs.ansible.com/ansible/playbooks_filters.html) 세트를 작성 no_log: true하고 디버그 모듈item.path사용 하여 값을 반환 할 수 있습니다
Henrik Pingel

답변:



5

방법 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

1
방법 2에 관해서는, "with_together"를 사용하는 것이 가능할 것 같습니다. 불행히도 주석은 코드 태그를 사용할 수 없으므로 이상하게 보일 것입니다. :-이름 : 보안 SSL 키 파일 : 경로 = {{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
Uditha Desilva

1

당신은 할 수 없습니다. 그것은 전부이거나 아무것도 아닙니다 (를 통해 no_log: True)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.