Ansible with_items no imprime todo el artículo?


16

Estoy asegurando automáticamente las claves SSL de esta manera:

- 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

Ahora, para cada elemento, hay un gran mensaje de registro con todo el contenido del elemento:

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

Esto es increíblemente ilegible, ya que solo quiero saber la ruta del elemento que se está procesando (y tal vez modificado). Con una gran cantidad de teclas, esto se sale de control realmente rápido.

¿Cómo puedo cambiar esta jugada de una manera que solo item.pathse imprima para cada elemento?

Ya lo he intentado no_log: True, pero esto omite por completo la salida, por supuesto.


Tal vez podría escribir un [Jinja Filter] (docs.ansible.com/ansible/playbooks_filters.html) establecido no_log: truey devolver el valor item.pathcon el módulo de depuración
Henrik Pingel

Respuestas:



5

Método 1

Utilizar

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

Devolverá una lista de rutas:

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

Toda tu tarea se convertiría en:

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

Tenga en cuenta que solo puede seleccionar un solo atributo, no es posible usarlo attribute=['path', 'mode']o algo similar.

Método 2

Pensé en usar el extracto para poder obtener varias claves (porque a veces es necesario tener una segunda clave para una whencondición), pero no pude hacerlo, ya que tendría que asignar la lista de dictados, luego asignar la lista de teclas sobre el dict específico, que no parece posible, ya que map solo acepta un nombre de función pero no una definición de función / funciones encadenadas. Estaría agradecido por una sugerencia aquí!

Una gran idea de los comentarios (¡Gracias, 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étodo 3

Alternativamente, se podría usar un filtro personalizado como este (eso es lo que hice antes de descubrirlo 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
Con respecto a su método 2, parecería viable usar "with_together", incluso si no es súper eficiente (desafortunadamente los comentarios no pueden usar etiquetas de código, por lo que esto se verá extraño): - nombre: archivo de claves SSL seguro: ruta = {{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' ) | lista
Uditha Desilva

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.