Esa es la parte:
vars_files:
- vars/vars.default.yml
- vars/vars.yml
Si vars/vars.yml
no existe un archivo , aquí hay un error.
ERROR: file could not read: /.../vars/vars.yml
¿Cómo puedo cargar variables adicionales de este archivo solo si existe? (sin errores)
Según los desarrolladores de Ansible , la forma correcta de resolver esto es usar algo como:
Además, dicen :
fuente
include_vars
en la tarea dará una alta precedencia de variables en comparación con el roldefaults
ovars
Encontré este problema en una configuración en la que necesitaba crear múltiples entornos de implementación (en vivo, demo, sandbox) en el mismo servidor físico (no se permiten máquinas virtuales aquí), y luego un script para implementar repositorios svn arbitrarios
Esto requería un árbol de directorios de archivos variables.yml (opcional), que se fusionarían uno encima del otro y no arrojarían una excepción si faltaba alguna.
Comience habilitando la fusión de variables en ansible: tenga en cuenta que esto hace una fusión hash superficial (1 nivel de profundidad) y no una fusión profunda totalmente recursiva
ansible.cfg
Diseño de directorio ansible
roles / desplegar / tareas / incluye.yml
Esta es la lógica principal para un árbol de directorios de archivos variables opcionales.
group_vars / all.yml
Configurar variables predeterminadas para el proyecto y varios usuarios y entornos.
roles / deploy / vars / main.yml
valores predeterminados del proyecto
roles / deploy / vars / project_1.yml
valores predeterminados para proyecto_1
roles / deploy / vars / live / main.yml
valores predeterminados para el entorno en vivo, anula los valores predeterminados del proyecto
roles / deploy / vars / live / project_1.yml
anulaciones finales para project_1 en el entorno en vivo
playbooks / demo.yml
Configure libros de jugadas separados para cada entorno
ADVERTENCIA: Debido a que todos los entornos viven en un solo host, todos los libros de jugadas deben ejecutarse individualmente; de lo contrario, Ansible intentará ejecutar todos los scripts como el primer usuario de inicio de sesión ssh y solo usará las variables para el primer usuario. Si necesita ejecutar todos los scripts secuencialmente, use xargs para ejecutarlos cada uno como comandos separados.
fuente
Nota: Las pruebas de ruta (es archivo, existe, ...) funcionan solo con rutas absolutas o rutas relativas al directorio de trabajo actual cuando se ejecuta el comando ansible-playbook. Esta es la razón por la que usamos la búsqueda. la búsqueda acepta rutas relativas al directorio del libro de jugadas y devuelve la ruta absoluta cuando existe el archivo.
fuente
O de una manera más yaml:
Es decir, en lugar de escribir una matriz en una línea con corchetes, como:
Use la forma yaml de escribir valores de matriz en varias líneas, como:
Como se mencionó, esto busca un archivo vars llamado
{{ ansible_hostname }}.yml
, y si no existe usadefault.yml
fuente
{{ ansible_hostname }}.yml
, nombre de archivo en lugar de../path/to/file1
. ¿Cuál es el punto de? Se puede agregar un número ilimitado de nombres de archivos de entrada.Uniendo varias piezas juntas ... include_vars con una cláusula when que es verdadera cuando existe el archivo. es decir
fuente
Nueva respuesta basada en las últimas versiones de Ansible: básicamente, debe usarla
with_first_found
junto conskip: true
para omitir la tarea si no se encuentra ningún archivo.Esto hace que no tenga que tener un archivo vars alternativo en esa lista.
Ver relacionado: /programming//a/39544405/100134
fuente