Ansible with_items n'imprime pas l'article entier?

16

Je sécurise automatiquement les clés SSL comme ceci:

- 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

Maintenant, pour chaque élément, il y a un énorme message de journal avec tout le contenu de l'élément:

ok: [127.0.0.1] => (item = {u'uid ': 0, u'woth': False, u'mtime ': 1454939377.264, u'inode': 400377, u'isgid ': False, u' taille ': 3243, u'roth': Faux, u'isuide ': Faux, u'isreg': Vrai, u'gid ': 0, u'ischr': Faux, u'wusr ': Vrai, 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})

C'est incroyablement illisible, car je veux seulement connaître le chemin de l'élément en cours de traitement (et peut-être modifié). Avec un grand nombre de touches, cela devient vraiment incontrôlable.

Comment puis-je changer ce jeu de manière à ce que seul le item.pathsoit imprimé pour chaque élément?

J'ai déjà essayé no_log: True, mais cela omet complètement la sortie bien sûr.

Zulakis
la source
Vous pourriez peut-être écrire un ensemble [Jinja Filter] (docs.ansible.com/ansible/playbooks_filters.html) no_log: trueet renvoyer la valeur de item.pathwith debug module
Henrik Pingel

Réponses:

5

Méthode 1

Utilisation

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

Il renverra une liste de chemins:

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

Toute votre tâche deviendrait:

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

Attention, vous ne pouvez sélectionner qu'un seul attribut, il n'est pas possible de l'utiliser attribute=['path', 'mode']ou similaire.

Méthode 2

J'ai pensé à utiliser extract pour pouvoir récupérer plusieurs clés (car il est parfois nécessaire d'avoir une deuxième clé pour une whencondition), mais je n'ai pas réussi à le faire, car j'aurais besoin de mapper la liste des dict, puis de mapper la liste des touches sur le dict spécifique, ce qui ne semble pas possible, car la carte accepte uniquement un nom de fonction mais pas une définition de fonction / fonctions chaînées. Je serais reconnaissant pour une suggestion ici!

Une bonne idée des commentaires (Merci, 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 

Méthode 3

Alternativement, un filtre personnalisé comme celui-ci pourrait être utilisé (c'est ce que j'ai fait avant de le découvrir 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
Zulakis
la source
1
En ce qui concerne votre méthode 2, il semblerait viable d'utiliser "with_together", même si ce n'est pas super-efficace (malheureusement, les commentaires ne peuvent pas utiliser de balises de code, cela semblera étrange): - 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
Uditha Desilva
1

Tu ne peux pas. C'est tout ou rien (via no_log: True)

udondan
la source