Ansible with_items가 전체 항목을 인쇄하지 않습니까? u’ischr’: False, u’wusr ‘: True, u’xoth ‘:

다음과 같이 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)