Saltar al contenido

¿Ansible with_items no imprime el elemento completo?

Te sugerimos que pruebes esta resolución en un ambiente controlado antes de enviarlo a producción, saludos.

Solución:

Solución 1:

Ansible 2.2 tiene loop_control.label para esto.

- 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 "
  • Encontrado a través de: https://stackoverflow.com/a/42832731/799204
  • Documentación: http://docs.ansible.com/ansible/playbooks_loops.html#loop-control

Solución 2:

Método 1

Usar

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

Devolverá una lista de rutas:

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

Toda su 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 una sola attributeno es posible utilizar attribute=['path', 'mode'] o similar.

Método 2

Pensé en usar extracto para poder obtener múltiples keys (porque a veces es necesario tener un segundo key para when condición), pero no logré hacerlo, ya que necesitaría mapear la lista de dictados, luego mapear la lista de keys sobre el dict específico, lo que no parece posible, ya que el mapa solo acepta un nombre de función pero no una definición de función/funciones encadenadas. ¡Agradecería 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 enterarme de 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

Sección de Reseñas y Valoraciones

Tienes la posibilidad recomendar esta reseña si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *