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
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
yno
True
yFalse
TRUE
yFALSE
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 tabulacionesfoldmethod
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,