# Debugging YAML: El misterio de los caracteres "prohibidos" en Kubernetes

¿Alguna vez tu pipeline de Azure DevOps falló en el paso de `KubernetesManifest` con un error críptico como `expected <block end>, but found '<scalar>'`?

Si usas **Replace Tokens** para inyectar secretos desde tu Library, el culpable no es tu código, sino un símbolo "rebelde".

El error que aparece es similar a lo siguiente:

```log
2026-03-24T15:49:43.6432543Z ##[section]Starting: Apply ConfigMap
2026-03-24T15:49:43.6457385Z ==============================================================================
2026-03-24T15:49:43.6457745Z Task         : Deploy to Kubernetes
2026-03-24T15:49:43.6458241Z Description  : Use Kubernetes manifest files to deploy to clusters or even bake the manifest files to be used for deployments using Helm charts
2026-03-24T15:49:43.6458631Z Version      : 1.268.0
2026-03-24T15:49:43.6458882Z Author       : Microsoft Corporation
2026-03-24T15:49:43.6459148Z Help         : https://aka.ms/azpipes-k8s-manifest-tsg
2026-03-24T15:49:43.6459451Z ==============================================================================
2026-03-24T15:49:46.4423474Z 			Kubectl Client Version: v1.35.2
2026-03-24T15:49:46.4424129Z 			Kubectl Server Version: v1.33.7
2026-03-24T15:49:46.4424737Z ==============================================================================
2026-03-24T15:49:46.4694986Z ##[error]can not read a block mapping entry; a multiline key may not be an implicit key at line 19, column 48:
     ... M_COMERCIAL_SHAREPOINT_TENANT_ID: "22cfcf07-cbdf-458d-adc0-6e57ece ... 
                                         ^
2026-03-24T15:49:46.4789324Z ##[section]Finishing: Apply ConfigMap
```

## El Problema: Caracteres con "superpoderes

En YAML, símbolos como **!, @, #, :, | o >** no son solo texto; son instrucciones técnicas.

- Ejemplo Real: Los IDs de SharePoint/Drive de Microsoft suelen empezar con b!.

- https://learn.microsoft.com/en-us/graph/api/drive-get?view=graph-rest-1.0&tabs=http#code-try-13?view=graph-rest-1.0&tabs=http

- El Caos: Al inyectar b!t18... directamente en el YAML, Kubernetes intenta interpretar el **!** como un tag de datos y, al no entenderlo, rompe el despliegue.

## La Herramienta de Diagnóstico: yamllint

Antes de lanzar el despliegue y esperar 5 minutos a que falle, añade un paso de validación en tu pipeline. yamllint es el juez estricto que necesitas:
    

```yaml
- script: |
    pip install yamllint
    # Validamos el archivo procesado por el Replace Tokens
    yamllint qa/configmap.yml
displayName: 'QA: Validar sintaxis YAML'
```

> Tip: Si es muy estricto con los espacios o largos de línea, usa un archivo .yamllint.conf para relajar las reglas y enfocarte solo en errores de sintaxis.

En el caso de que la librería encuentre algún error, te mostrara una salida similar a la siguiente:
```log
/home/vsts/work/1/s/qa/configmap.yml
  1:1       warning  missing document start "---"  (document-start)
  14:81     error    line too long (84 > 80 characters)  (line-length)
  17:81     error    line too long (87 > 80 characters)  (line-length)
  18:51     error    syntax error: expected <block end>, but found '<scalar>' (syntax)
  19:81     error    line too long (87 > 80 characters)  (line-length)
  20:81     error    line too long (111 > 80 characters)  (line-length)
  21:81     error    line too long (105 > 80 characters)  (line-length)
  22:81     error    line too long (113 > 80 characters)  (line-length)
  26:81     error    line too long (86 > 80 characters)  (line-length)
```
    

## La Solución Definitiva: El Bloque Literal (>-)

Si las comillas dobles o simples fallan, usa el "arma secreta" de YAML: el Folded Block Scalar (>-). Este operador le dice a Kubernetes: "Oye, todo lo que viene en la siguiente línea es texto puro. No intentes interpretarlo, no busques comandos, solo léelo como una cadena".

### Así debe lucir tu ConfigMap:

```yaml
data:
  # El >- limpia saltos de línea y protege el valor inyectado
  SHAREPOINT_DRIVE_ID: >-
    #{SHAREPOINT_DRIVE_ID}#
```

> Valida temprano: Usa yamllint en el pipeline para ahorrar tiempo de debugging.

> Usa >-: Es la forma más robusta de manejar IDs complejos y secretos con símbolos raros sin romper la estructura.
