gather - ansible_user ansible_password
Fuerza de recopilaciĆ³n de datos en todos los hosts (4)
En general, la forma de obtener información para todos los hosts, incluso cuando no desea ejecutar tareas en todos los hosts, es hacer algo como esto:
- hosts: all
tasks: [ ]
Pero como mencionó, el parámetro --limit limitará a qué hosts se aplicaría esto.
No creo que haya una manera de simplemente decirle a Ansible que ignore el parámetro --limit en cualquier jugada. Sin embargo, puede haber otra forma de hacer lo que quiera por completo dentro de Ansible.
No lo he usado personalmente, pero a partir de Ansible 1.8 está disponible el almacenamiento en caché . En pocas palabras, con el almacenamiento en caché de datos habilitado, Ansible utilizará un servidor redis para almacenar en caché todos los datos sobre los hosts con los que se encuentra y podrá consultarlos en los siguientes libros de jugadas:
Con el almacenamiento en caché de datos habilitado, es posible que la máquina en un grupo haga referencia a variables sobre las máquinas en el otro grupo, a pesar del hecho de que no se han comunicado en la ejecución actual de / usr / bin / ansible-playbook.
Estoy sentado frente a un proyecto de Ansible bastante complejo que estamos usando para configurar nuestros entornos de desarrollo local (múltiples máquinas virtuales) y hay un rol que utiliza los hechos recopilados por Ansible para configurar el /etc/hosts
en cada VM Desafortunadamente, cuando desea ejecutar el libro de jugadas solo para un host (usando el parámetro -limit) los hechos de los otros hosts (obviamente) faltan.
¿Hay una manera de obligar a Ansible a recopilar datos sobre todos los hosts, incluso si limita el libro de jugadas a un host específico?
Intentamos agregar un juego al libro de jugadas para recopilar datos de todos los hosts, pero por supuesto eso también se limita al host dado por el parámetro -limit. Si hubiera una manera de forzar esta jugada para que se ejecute en todos los hosts antes de las otras jugadas, sería perfecto.
Busqué un poco en Google y encontré la solución con el almacenamiento en caché de hecho con redis, pero como nuestro libro de jugadas se usa localmente, quería evitar la necesidad de software adicional. Lo sé, no es un gran problema, pero estaba buscando una solución "Limpia", Ansible-only y me preguntaba si existiría.
Esto todavía parece ser un problema sin una solución limpia aquí en 2016, pero las versiones más recientes de Ansible ofrecen un backend de almacenamiento en caché de datos "jsonfile", que parece ser un compromiso decente para la instalación local de Redis solo para satisfacer esta necesidad. Ahora acabo de activar una ansible all -m setup
antes de ejecutar un libro de jugadas con la opción --limit
. ¡Lo suficientemente bueno para el jazz!
http://docs.ansible.com/ansible/playbooks_variables.html#fact-caching
La versión 2 de Ansible introdujo una forma limpia y oficial de hacer esto utilizando datos delegados (consulte: http://docs.ansible.com/ansible/latest/playbooks_delegation.html#delegated-facts ).
---
# This play will still work as intended if called with --limit
- name: Hostfile generation
hosts: all
become: true
pre_tasks:
- name: Gather facts from ALL hosts (regardless of limit or tags)
setup:
delegate_to: "{{ item }}"
delegate_facts: True
when: hostvars[item][''ansible_default_ipv4''] is not defined
with_items: "{{ groups[''all''] }}"
tasks:
- template:
src: "templates/hosts.j2"
dest: "/etc/hosts"
Puedes modificar tu libro de jugadas para:
...
- hosts: "{{ limit_hosts|default(''default_group'') }}"
tasks:
...
...
Y cuando lo ejecute, si some_var
no está definido (estado normal), se ejecutará en el grupo de inventario default_group
, PERO si lo ejecuta como:
ansible-playbook --extra-vars "limit_hosts=myHost" myplaybook.yml
Entonces solo se ejecutará en su myHost
, pero aún podría tener otras secciones con diferentes hosts: ..
declaraciones, para recopilación de datos, o cualquier otra cosa en realidad.