Ansible with_items nie drukuje całego elementu?


16

Automatycznie zabezpieczam klucze SSL w następujący sposób:

- 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

Teraz dla każdego elementu pojawia się ogromny komunikat z całą zawartością elementu:

ok: [127.0.0.1] => (item = {u'uid ': 0, u'woth': False, u'mtime ': 1454939377.264, u'inode': 400377, u'isgid ': False, u' rozmiar ': 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})

Jest to niezwykle nieczytelne, ponieważ chcę tylko poznać ścieżkę przedmiotu, który jest przetwarzany (i może zmieniony). Dzięki dużej liczbie kluczy bardzo szybko wymyka się spod kontroli.

Jak mogę zmienić tę grę w taki sposób, że item.pathdla każdego przedmiotu drukowane są tylko te ?

Próbowałem już no_log: True, ale to całkowicie pomija wynik.


Może mógłbyś napisać zestaw [Filtr Jinja] (docs.ansible.com/ansible/playbooks_filters.html) no_log: truei zwrócić wartość item.pathz modułem debugowania
Henrik Pingel

Odpowiedzi:



5

Metoda 1

Posługiwać się

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

Zwróci listę ścieżek:

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

Twoim całym zadaniem byłoby:

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

Uważaj, że możesz wybrać tylko jeden atrybut, nie można go użyć attribute=['path', 'mode']ani go podobnego.

Metoda 2

Myślałem o użyciu wyciągu, aby móc pobrać wiele kluczy (ponieważ czasami konieczne jest posiadanie drugiego klucza dla whenwarunku), ale nie udało mi się tego zrobić, ponieważ musiałbym zmapować listę nagrań, a następnie zmapować lista kluczy nad danym dyktando, co nie wydaje się możliwe, ponieważ mapa akceptuje tylko nazwę funkcji, ale nie definicję funkcji / funkcje łańcuchowe. Byłbym wdzięczny za sugestię tutaj!

Świetny pomysł z komentarzy (Dzięki, 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 

Metoda 3

Alternatywnie można zastosować taki filtr niestandardowy (tak zrobiłem, zanim się dowiedziałem 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
Jeśli chodzi o metodę 2, wydaje się, że użycie „with_together” wydaje się opłacalne, nawet jeśli nie jest super-wydajne (niestety komentarze nie mogą używać znaczników kodu, więc będzie to wyglądać dziwnie): Tryb {{item [0]}} = 600 właściciel = {{item [1]}} with_together: - secure_ssl_keys_result.files | map (attribute = 'path') | list - secure_ssl_keys_result.files | map (attribute = 'uid' ) | lista
Uditha Desilva

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.