Locals
Se utiliza este archivo para definir valores específicos que pueden basarse en una variable o construir otro.
Observe el bloque a continuación. Por ejemplo, la variable timestamp recibe un valor en tiempo de ejecución proveniente de una función. Extra tags fue definida basándose en variables.
Me gusta separar este archivo para no contaminar el archivo principal. Generalmente la interpolación para generar una nueva variable prefiero hacerla en este archivo y referenciar esas variables en el main.pkr.hcl de forma simple y más legible.
Piensa en locals como tu espacio de manipulación de variables.
El archivo a continuación es exactamente el que vamos a usar en nuestro proyecto.
locals {
timestamp = formatdate("DD-MMM-YYYY-hh-mm-ZZZ", timestamp())
extra_tags = {
Name = var.project_name
Environment = var.environment
}
}
Una variable se referencia como var.nombredeella y una variable local se referencia como local.nombredeella.
Aprovechando este momento es bueno hablar de funciones que ayudan bastante a manipular variables. Sigue la documentación y verás todo lo que tenemos listo para usar.
Si ya estás familiarizado con Terraform es lo mismo.
Lista de las que más uso:
-
env: Transformar una variable de entorno en un valor de entrada.
env("AWS_DEFAULT_REGION") -
vault: Busca un valor en algún cofre de Vault, siempre que esté logueado.
vault("/secret/data/hello", "foo") -
join: Une varias strings con un separador, óptimo para formar nombres.
join("_", [var.project_name, var.environment, var.region])
centos_dev_us-east-1 -
split: Separa un string a través de un delimitador y entrega una lista de strings. Es el inverso de join
-
lower, upper y title: Convierte todas las letras a minúsculas, mayúsculas o solamente la primera letra mayúscula en el caso de title.
lower("HELLO")
hello -
regex y regex_replace: Son dos funciones comodín que para quien sepa usar regex, sustituye muchas otras funciones
-
coalesce y coaleslist: De una lista de argumentos toma el primero no nulo.
-
concat: Combina dos listas en una lista
concat(["a", ""], ["b", "c"])
["a","","b","c",] -
contains: Dentro de una lista verifica si un ítem existe y retorna true o false.
contains(["a", "b", "c"], "a")
true -
index y element: Son el inverso una de otra. element() pasas la lista y el índice, te retorna el valor en la posición de la lista. index() pasas la lista y el valor, te retorna en qué posición de la lista está.
element(["a", "b", "c"], 1)
b
index(["a", "b", "c"], "b")
1 -
lookup: Recupera el valor de un único elemento de un map, dada su clave. Si la clave proporcionada no existe, el valor por defecto proporcionado será retornado.
lookup({a="ay", b="bee"}, "a", "DefaultValue")
ay
lookup({a="ay", b="bee"}, "c", "DefaultValue")
DefaultValue -
merge: Toma un número arbitrario de maps y retorna un único map que contiene un conjunto fusionado de elementos de todos los maps. Si más de un determinado map define la misma clave, aquel que esté más tarde en la secuencia de argumentos tendrá precedencia.
merge({"a"="b", "c"="d"}, {"e"="f", "c"="z"})
{"a" = "b" "c" = "z" "e" = "f"} -
jsondecode y yamldecode: Son funciones que poseen también el encode, pero generalmente nosotros tenemos el archivo y queremos decodificarlo.
-
file: Lee el contenido de un archivo pasado en el path relativo. fileexists() es otra función que retorna true o false.
file("${path.folder}/hello.txt")
Hello World -
timestamp: Retorna la fecha y hora. Generalmente usado con formatdate para personalizar la hora de acuerdo con lo que necesitas.
Existen muchas otras, vale la pena revisar.
Extra
path.cwd: el directorio desde donde Packer fue iniciado.
path.root: el directorio del archivo HCL de entrada o la carpeta de entrada.