Tengo este fragmento de código que verifica si la variable "propietario" coincide con la siguiente expresión regular y acepta que no está definida, es decir, el libro de jugadas puede funcionar sin que se pase esa variable.
varexample is undefined or varexample is match('^[a-zA-Z]+$')Lo que me gustaría hacer es que esta variable acepte valores vacíos o nulos. Lo que probé es algo como esto.
varexample is null or varexample is match('^[a-zA-Z]+$')Pero tengo este error:
The conditional check 'varexample is null or varexample is match('[a-zA-Z]+')' failed. The error was: template error while templating string: no test named 'null'. String: {% if varexample is null or varexample is match('[a-zA-Z]+') %} True {% else %} False {% endif %}¿Alguien puede darme una pista o alguna ayuda?
P: "la variable acepta valores nulos "
R: Es un error. Ansible no debería coincidir con nulo en '^[a-zA-Z]+$'
- set_fact: varexample: - debug: var: varexample - debug: msg: "undefined: {{ varexample is undefined }}" - debug: msg: "match: {{ varexample is match('^[a-zA-Z]+$') }}"da
varexample: null msg: 'undefined: False' msg: 'match: True'Como resultado de este error, su condición debería funcionar como se esperaba
varexample is undefined or varexample is match('^[a-zA-Z]+$')Para estar del lado de guardar, en el caso de que se solucione el error, también puede probar None , por ejemplo
- debug: msg: "Test passed. varexample: {{ item.varexample }}" when: item.varexample is undefined or item.varexample == None or item.varexample is match('^[a-zA-Z]+$') loop: - varexample: ABC - varexample: 123 - varexample:da
ok: [localhost] => (item={'varexample': 'ABC'}) => msg: 'Test passed. varexample: ABC' skipping: [localhost] => (item={'varexample': 123}) ok: [localhost] => (item={'varexample': None}) => msg: 'Test passed. varexample: 'Detalles
- debug: msg: | Undefined: {{ item.varexample is undefined }} Is None: {{ item.varexample == None }} Match a-zA-Z: {{ item.varexample is match('^[a-zA-Z]+$') }} loop: - varexample: ABC - varexample: 123 - varexample: ok: [localhost] => (item={'varexample': 'ABC'}) => msg: |- Undefined: False Is None: False Match a-zA-Z: True ok: [localhost] => (item={'varexample': 123}) => msg: |- Undefined: False Is None: False Match a-zA-Z: False ok: [localhost] => (item={'varexample': None}) => msg: |- Undefined: False Is None: True Match a-zA-Z: TrueSimplemente use un default que su match consideraría verdadero.
Por ejemplo; con un varexample | default('a') is match('^[a-zA-Z]+$') , debería poder lograr lo que está buscando.
Dadas las tareas:
- debug: msg: "for {{ item }} the result is {{ item | default('a') is match('[a-zA-Z]+') }}" loop: "{{ cases }}" vars: cases: - ~ - 123 - abc - - debug: msg: "for an undefined variable the result is {{ item | default('a') is match('[a-zA-Z]+') }}"Esto produce:
TASK [debug] **************************************************************************** ok: [localhost] => (item=None) => msg: for the result is True ok: [localhost] => (item=123) => msg: for 123 the result is False ok: [localhost] => (item=abc) => msg: for abc the result is True ok: [localhost] => (item=None) => msg: for the result is True TASK [debug] **************************************************************************** ok: [localhost] => msg: for an undefined variable the result is TrueCreo que la respuesta más cercana a exactamente lo que pediste es algo como:
varexample is defined and varexample is match('^[a-zA-Z]+$')También puede usar "no está definido", o simplemente proporcionar un valor predeterminado como se menciona en la otra respuesta es otra buena manera de hacerlo.
varexample|default('') is match('^[a-zA-Z]+$')