(Relacionado con Callbacks o ganchos, y series de tareas reutilizables, en roles Ansible ):
¿Hay alguna manera mejor de agregar a una lista o agregar una clave a un diccionario en Ansible que (ab) usando una expresión de plantilla jina2?
Sé que puedes hacer algo como:
- name: this is a hack
shell: echo "{% originalvar.append('x') %}New value of originalvar is {{originalvar}}"
pero ¿realmente no hay ningún tipo de metatarea o ayuda para hacer esto?
Se siente frágil, parece no estar documentado y se basa en muchos supuestos sobre cómo funcionan las variables en Ansible.
Mi caso de uso son múltiples roles (extensiones de servidor de base de datos) que cada uno necesita para proporcionar alguna configuración a un rol base (el servidor de base de datos). No es tan simple como agregar una línea al archivo de configuración del servidor db; cada cambio se aplica a la misma línea , por ejemplo, las extensiones bdr
y pg_stat_statements
ambas deben aparecer en una línea de destino:
shared_preload_libaries = 'bdr, pg_stat_statements'
¿Es la forma Ansible de hacer esto para procesar el archivo de configuración varias veces (una vez por extensión) con una expresión regular que extrae el valor actual, lo analiza y luego lo reescribe? Si es así, ¿cómo haces que ese idempotente en múltiples carreras?
¿Qué sucede si la configuración es más difícil de analizar y no es tan simple como agregar otro valor separado por comas? Piensa en archivos de configuración XML.
Respuestas:
Puede fusionar dos listas en una variable con
+
. Digamos que tiene ungroup_vars
archivo con este contenido:Y se usa en una plantilla
pgsql.conf.j2
como:Luego puede agregar extensiones a los servidores de base de datos de prueba de esta manera:
Cuando el rol se ejecuta en cualquiera de los servidores de prueba, se agregarán las extensiones adicionales.
No estoy seguro de que esto también funcione para los diccionarios, y también tenga cuidado con los espacios y deje una coma colgante al final de la línea.
fuente
group_vars
, los roles no pueden ocuparse de los detalles de la configuración de las extensiones. Estoy agregando vars de roles que estoy buscando particularmente, por lo que un rol puede agregarse a una var expuesta por otro rol.with_items
oración.Desde Ansible v2.x puedes hacer esto:
todo lo anterior está documentado en: http://docs.ansible.com/ansible/playbooks_filters.html
fuente
u'(': u\"'\"}"
2.4.x
(FIJO)set_fact: my_dict_var: '{{my_dict_var|default({})|combine({item[0]: item[1]})}}'
. El error indefinido se produce cuando se utiliza algún filtrado o no se registran resultados.necesitas dividir el ciclo en 2
y addhost.yml
fuente
No estoy seguro de cuándo agregaron esto, pero al menos para los diccionarios / hashes (NO listas / matrices), puede configurar la variable hash_behaviour , así:
hash_behaviour = merge
en suansible.cfg
.Me tomó bastantes horas tropezar accidentalmente con esta configuración: S
fuente
Casi todas las respuestas aquí requieren cambios en las tareas, pero necesitaba fusionar dinámicamente los diccionarios en la definición de vars, no durante la ejecución.
Por ejemplo, quiero definir algunos vars compartidos
all
group_vars
y luego quiero extenderlos en otrogroup
ohost_vars
. Muy útil cuando se trabaja para roles.Si intenta usar los filtros
combine
ounion
sobrescribiendo la variable original en los archivos var, terminará en un bucle infinito durante la creación de plantillas, así que creé esta solución (no es la solución).Puede definir múltiples variables basadas en algún patrón de nombre y luego cargarlas automáticamente en función.
group_vars/all.yml
group_vars/group1.yml
fragmento de código de rol
do_some_stuff.yml
Es solo un fragmento, pero debes hacerte una idea de cómo funciona. nota: la búsqueda ('varnames', '') está disponible desde ansible 2.8
Supongo que también sería posible fusionar todas las variables
dictionary_of_bla.*
en un diccionario durante el tiempo de ejecución usando la misma búsqueda.La ventaja de este enfoque es que no necesita establecer listas exactas de nombres de variables, sino que solo el patrón y el usuario pueden configurarlo dinámicamente.
fuente
Ansible
es un sistema de automatización y, con respecto a la gestión de archivos de configuración, no es muy diferente deapt
. La razón por la que cada vez más software ofrece la función de leer fragmentos de configuración de unconf.d
directorio es permitir que dichos sistemas de automatización tengan diferentes paquetes / roles para agregar configuración al software. Creo que no es la filosofía deAnsible
hacer lo que tienes en mente, sino utilizar elconf.d
truco. Si el software que se está configurando no ofrece esta funcionalidad, puede estar en problemas.Como menciona los archivos de configuración XML, aprovecho la oportunidad para quejarme un poco. Hay una razón para la tradición de Unix de usar archivos de configuración de texto sin formato. Los archivos de configuración binarios no se prestan bien a la automatización del sistema, por lo que cualquier tipo de formato binario le dará problemas y probablemente requerirá que cree un programa para manejar la configuración. (Si alguien piensa que XML es un formato de texto sin formato, debe examinar sus cerebros).
Ahora, sobre tu
PostgreSQL
problema específico .PostgreSQL
apoya elconf.d
truco. Primero, comprobaría sishared_preload_libraries
se puede especificar varias veces. No encontré ninguna pista en la documentación que pueda, pero igual lo intentaría. Si no se puede especificar varias veces, explicaría mi problema a losPostgreSQL
chicos en caso de que tengan ideas; Esto es unPostgreSQL
problema y no unAnsible
problema. Si no hay una solución y realmente no podría fusionar los diferentes roles en uno, implementaría un sistema para compilar la configuración en el host administrado. En este caso, probablemente crear un script/usr/local/sbin/update_postgresql_config
que compile/etc/postgresql/postgresql.conf.jinja
en/etc/postgresql/9.x/main/postgresql.conf
. El script leería las bibliotecas de precarga compartidas/etc/postgresql/shared_preload_libraries.txt
, una biblioteca por línea, y se las proporcionaría a jinja.No es raro que los sistemas de automatización hagan esto. Un ejemplo es el
exim4
paquete Debian .fuente
conf.d
mecanismo de inclusión y, afortunadamente, utiliza archivos de texto sin formato. Sin embargo, hay algunas opciones de configuración en las que varias extensiones pueden tener opiniones al respecto, por ejemplo, "aumentar max_wal_senders en 10 de lo que era antes".