Ansible with_items druckt nicht den ganzen Artikel?


16

Ich sichere automatisch SSL-Schlüssel wie folgt:

- 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

Jetzt gibt es für jeden Artikel eine große Protokollnachricht mit dem gesamten Inhalt des Artikels:

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})

Dies ist unglaublich unlesbar, da ich nur den Pfad des Elements wissen möchte, das verarbeitet (und möglicherweise geändert) wird. Mit einer großen Anzahl von Schlüsseln ist dies sehr schnell außer Kontrolle geraten.

Wie kann ich dieses Spiel so ändern, dass item.pathfür jeden Artikel nur das ausgedruckt wird?

Ich habe es schon versucht no_log: True, aber das lässt die Ausgabe natürlich komplett aus.


Vielleicht könntest du einen [Jinja Filter] -Satz (docs.ansible.com/ansible/playbooks_filters.html) schreiben no_log: trueund den Wert von item.pathwith debug module
Henrik Pingel

Antworten:



5

Methode 1

Verwenden

secure_ssl_keys_result.files|map(attribute='path')|list

Es wird eine Liste von Pfaden zurückgegeben:

['/etc/ssl../', '/etc/ssl/.../']

Deine ganze Aufgabe würde werden:

- name: Secure ssl keys
  file: path={{ item }} user=root group=root mode=600
  with_items: secure_ssl_keys_result.files|map(attribute='path')|list

Beachten Sie, dass Sie nur ein einziges Attribut auswählen können, das Sie nicht verwenden können attribute=['path', 'mode']oder ähnliches.

Methode 2

Ich habe überlegt, mit extract mehrere Schlüssel abzurufen (da manchmal ein zweiter Schlüssel für eine whenBedingung erforderlich ist), habe es aber nicht geschafft, da ich die Liste der Wörter zuordnen und dann zuordnen müsste Die Liste der Tasten über dem spezifischen Dikt, die nicht möglich zu sein scheint, da map nur einen Funktionsnamen, aber keine Funktionsdefinition / verkettete Funktionen akzeptiert. Für einen Vorschlag wäre ich hier dankbar!

Eine großartige Idee aus den Kommentaren (Danke, 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 

Methode 3

Alternativ könnte ein benutzerdefinierter Filter wie dieser verwendet werden (das habe ich getan, bevor ich davon erfahren habe 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
In Bezug auf Ihre Methode 2 scheint es sinnvoll, "with_together" zu verwenden, auch wenn es nicht sehr effizient ist (leider können Kommentare keine Code-Tags verwenden, dies sieht also seltsam aus): - Name: Secure SSL-Schlüsseldatei: Pfad = {{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

Das kannst du nicht. Es ist entweder alles oder nichts (via no_log: True)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.