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.