web-dev-qa-db-fra.com

Ansible avec_Items n'imprime pas l'article entier?

Je fixe automatiquement des 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 article, il y a un message de journal énorme avec l'ensemble du contenu de l'article:

ok: [127.0.0.1] => (item = {u'uid ': 0, u'woth': faux, u'mtime ': 1454939377.264, u'inode': 400377, u'isgid ': faux, u' Taille ': 3243, U'ROTH': FAUX, U'ISUID ': FAUX, U'ISREG': VRAI, U'GID ': 0, U'ISCHR': FALSE, U'WUSSR ': vrai, u'xoth ': Faux, u'rusr': vrai, u'nlink ': 1, u'issock': faux, u'rgp ': faux, u'path': u '/ etc/ssl/foo.key', u 'xusr': faux, u'atime ': 1454939377.264, U'ISDIR': FAUX, U'CTIME ': 1454939657.116, U'ISBLK': FALSE, U'XGRP ': FALSE, U'DEV': 65025, U ' WGRP ': FALSE, U'FISIFO': FAUX, U'MODE ': U'0600', U'IMNK ': FAUX})

Ceci est incroyablement illisible, car je veux seulement connaître le chemin de l'article en cours de traitement (et peut-être changé). Avec un grand nombre de clés, cela est hors de la main vraiment rapide.

Comment puis-je changer cette pièce de manière à ce que seul le item.path est en train d'être imprimé pour chaque article?

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

18
Zulakis

Ansible 2.2 a loop_control.label pour ça.

- 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 }}"
28
sourcejedi

Méthode 1

Utilisation

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

Il retournera 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

Méfiez-vous que vous ne pouvez sélectionner qu'un seul attribut, il n'est pas possible d'utiliser attribute=['path', 'mode'] ou similaire.

Méthode 2

J'ai pensé à utiliser extraire pour pouvoir récupérer plusieurs touches (car il est parfois nécessaire d'avoir une deuxième clé pour une condition when condition), mais n'a pas réussi à le faire, Comme je voudrais cartographier la liste des dictts, puis cartographier la liste des touches sur la dicte spécifique, ce qui ne semble pas possible, car la carte n'accepte que le nom de la fonction mais pas une définition de fonction/des fonctions chaînées. Je serais reconnaissant pour une suggestion ici!

Une bonne idée des commentaires (merci , ditha 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 que j'ai découvert sur 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
5
Zulakis