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.
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 }}"
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.
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
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