YAML el reemplazo de JSON

Este es uno de los capítulos del tutorial Automatización con Ansible. Una introducción.. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.

Para comenzar con este segundo capítulo del tutorial sobre Ansible, te remito a la propia definión, YAML Ain’t Markup Language (YAML), que puedes traducir como, YAML no es un lenguaje de marcado, es un lenguaje de serialización. Inicialmente, este acrónimo, hacia referencia a Yet Another Markup Language, sin embargo, los que lo mantienen. decidieron, cambiarlo a lo que has visto anteriormente, para precisamente, enfatizar sobre esa capacidad de serialización que tiene.

Este lenguaje ha crecido significativamente en los últimos años, ampliamente extendido en archivos de configuración. Sin embargo, no solo tienes que pensar en YAML para archivos de configuración, sino que precisamente, por esa capacidad que tiene para la serialización, es un perfecto sustituto para otro formato, del que en particular, yo estoy enamorado, JSON.

La ventaja de YAML frente a otros formatos como pueden ser XML o JSON es que es mas legible y además es mas sencillo de escribir. Por supuesto, existen librerías, en casi, cualquier lenguaje de programación que te puedas imaginar para tratar con este formato.

Aunque realmente este capítulo podría quedar fuera, puesto que es algo generalista, lo cierto es que tiene suficiente importancia en Ansible, para que entre a formar parte del tutorial. Por esta razón, es posible que te haya dirigido a este capítulo del tutorial, desde otro artículo o desde un otro capítulo de otro tutorial. De cualquier forma, intentaré ser lo mas generalista posible y abstraerme totalmente del objeto de este tutorial, y centrarme en YAML.

Así, en este capítulo del tutorial te hablaré sobre el lenguaje de marcado YAML y sobre sus posibilidades. Intentaré hacerlo desde un punto general, para poder utilizarlo posteriormente en otros tutoriales, pero seguro Ansible estará rondando los ejemplos.

YAML el reemplazo de JSON

YAML el reemplazo de JSON

Me gusta ser cuadriculado para prácticamente todo. Por esta razón, me gusta ver todo desde el punto de vista mas práctico posible. Así, voy a repasar las características de este lenguaje empezando desde lo más básico.

El lenguaje

Cadenas de texto

Las cadenas de texto o strings las puedes utilizar con comillas simples o dobles. Aunque en algunos casos también las puedes encontrar sin comillas. En este último caso tienes que tener en cuenta que al parsear el texto se eliminarán espacios del inicio y el final, siempre que no esté entrecomillado. Por supuesto, en caso de que el texto contenga comillas tendrás que ponerlo entrecomillado, y en el caso de que utilices comillas simples, y el texto contenga comillas simple, tendrás que escaparla con otra.

Por otro lado, las comillas dobles, habitualmente se utiliza para expresar cadenas de texto arbitrarias, y se utiliza \ para escapar caracteres.

Cuando una cadena de texto contiene saltos de línea, es posible utilizar texto sin comillas utilizando para ello el símbolo |, por ejemplo,

definicion: |
             esto es un texto
             con saltos de línea

También es posible escribir textos largos, pero donde cada salto de línea será reemplazado durante el parseado como un espacio. Por ejemplo,

definicion: >
              esto es un texto largo
              que luego se tratará como una única línea.

Números

Los números se expresan tal cual, sin comillas ni nada. Algunos ejemplos de diferentes valores numéricos,

  • Entero 125
  • Octal 014
  • Hexadecimal Ox1af
  • Real 3.141592
  • Exponencial 2.718e+10
  • Infinito .inf

Nulo

Un valor nulo lo puedes indicar utilizando null o ~

Booleano

En YAML los booleanos se expresan como true y false. Aunque también se puede expresar de otras formas equivalentes,

  • yes y no
  • True y False
  • TRUE y FALSE

Cualquiera de las opciones indicadas anteriormente es equivalente.

Fechas

En YAML para indicar fechas se sigue la normativa ISO-8601. Por ejemplo,

2020-04-10T08:23:00

Aunque también puedes utilizar el formato corto,

2020-04-10

Listas

Una lista es exactamente lo que te imaginas, un conjunto de elementos. Cada elemento de este conjunto lo representas por un guión seguido de un espacio, es decir, -. Por ejemplo, una lista de marcas de coche sería algo como,

- Seat
- Citroen
- Renault

También es posible definir listas o secuencias de la siguiente forma,

[Seat, Citroen, Renault]

Diccionarios

Un diccionario es un conjunto de elementos clave-valor. Para indicar cada elemento separas la clave del valor mediante dos puntos y un espacio, es decir, :. Así, continuando con el ejemplo anterior, puedes dotar de características a la lista anterior,

- Seat:
    nombre: Seat
    origen: España
    gama: media
- Citroen:
    nombre: Citroen
    origen: Francia
    gama: media
- Renault:
    nombre: Renault
    origen: Francia
    gama: media

Indicar que el número de espacios entre : y el valor no tiene importancia, de hecho, es fácil encontrar los valores alineados, porque de esta forma es mas sencillo de leer. Por ejemplo,

- Seat:
    nombre: Seat
    origen: España
    gama:   media

Es importante que tengas en cuenta que es YAML, la sangría la tienes que hacer con espacios y nunca con tabulaciones. De hecho, lo mas habitual es realizar la sangría con dos espacios.

Al igual que te comenté en las listas, también es posible definir diccionarios en línea. Para el ejemplo anterior,

- Seat: {nombre: Seat, origen: España, gama: media}
- Citroen: {nombre: Citroen, origen: Francia, gama: media}
- Renault: {nombre: Renault, origen: Francia, gama: media}

Los comentarios

Como cualquier otro lenguaje que se precie, YAML también dispone de comentarios. Esta característica la tienes que utilizar tanto como sea posible, sobre todo para el caso de tus playbooks de Ansible. En el momento de implementar ese playbook, lo tendrás todo muy claro, pero dentro de unas semanas o meses, te pasará como a mi, que no me acuerdo de porque puse que y donde.

Los comentarios son tan sencillo de implementar como comenzar el texto con #. Por ejemplo,

# esto es un sencillo comentario

Tipado explícito

La especificación de YAML define algunas etiquetas para establecer el tipado de cualquier valor de forma explícita. Por ejemplo,

datos:
  # el siguiente valor se interpreta como texto, no como fecha
  start_date: !!str 2020-04-10

  # este valor se entiendo como un número real, 10.0 y no como un entero 10
  precio: !!float 10

  # el siguiente valor se interpreta como un valor binario en base 64
  picture: !!binary |
     iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAB0ElEQVR
     Ix83VPWuUQRAH8N9zdyRcFDk430CInVYWgoLC5Zr4ARTrmMrKxg+RL2
     BjYQoRbCxEbER8aUJIcwGLVFpoE1ATjYIvp4feY5E5WcI99yIGMjDs7
     O7s/nf+M7vLHpJpvA2dHnVRaQyAORwOnRt1UWUMgGpyoOr/oCTbEWET
     r0ObfymoTWbhW7hJP6nhMo7iDtYTEFiK1cfkrmAD9/F51NPPYgs55uM
     gFVwMrcTYfPhsxZqRc7APE2HXY5MLWEwS/hiHoj+J/eNUUTdU0jZwML
     QRYx+j/YX2MICzQ2ibSIB70T3CdVzDcuJ7ZifAEp4kFPSTvI/9HjdwF
     99jbBFPe4VQSsKvJVGkpZcNKORzMu9is5MJE7UejUU5eIUXGRtlVgbE
     dF7uCE7jxKAqWsYptKL/Es0cvwfnJU/ant3CcaylAM1IzGr0pzIuoZ5
     zL7jORrigcBW3eodN78FqYjdybuIAvuA2OgmlnSEV1xp20arJXD2h8U
     NipzksFeWzCOArfmIKmxlZzrMIn207Sy5aB9/6bVQuAPiE9RIrZR50t
     2nqxl/Qxpvw2wx9iOf4MdZzPVOpZMOe63/4uAplISnHhd340drJw9fe
     M5/+rssfaaJrzgf4b0UAAAAASUVORK5CYII=

YAML con Vim

Como no podía ser de otra forma, y aprovechando el tutorial sobre Vim, a continuación encontrarás una configuración, de las miles, que seguro puedes encontrar por internet, para facilitarte el trabajo con este formato.

Una de las razones para el tutorial de Vim, que ya comenté en la introducción del mismo, es que este editor, lo puedes encontrar en casi cualquier máquina a lo largo y ancho de internet, con lo que es ideal conocer como editar YAML con Vim.

Añade la siguiente línea a la configuración de Vim, al archivo ~/.vimrc,

autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab indentkeys-=0# indentkeys-=<:> foldmethod=indent nofoldenable

Esta configuración se aplica única y exclusivamente a archivos YAML. La explicación de la misma es la siguiente,

  • No se aplicará sangría a las líneas después de # o :
  • el tabulador, ts, se representa como dos espacios
  • la sangría sw, se presenta por dos espacios
  • de la misma forma un retorno de carro donde haya sangría sts también se expresará mediante dos espacios
  • expandtab indica que se utilizarán espacios en lugar de tabulaciones
  • foldmethod indica que se utilizará la sangría para los pliegues. Recuerda el capítulo del tutorial sobre pliegues en Vim.
  • nofoldenable expresa que el archivo se abrirá sin pliegues.

Por otro lado también puedes utilizar el complemento stephpy/vim-yaml con tan solo añadir la siguiente línea en la configuración de Vim,

Plug 'stephpy/vim-yaml', {'for': 'yaml'}

Una vez modificada la configuración, ejecuta el comando :PlugInstall.


Más información,

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *