Saltar al contenido principal
Página traducida

Esta página se tradujo del inglés con ayuda de IA. Si hay diferencias entre ambas, la versión en inglés es la referencia.

Usar variables

Consulte también:
[exec] [INSERT]

Las variables se pueden suministrar a los scripts de StackQL en forma de datos de configuración. Los datos de configuración de StackQL pueden estar en formato json o jsonnet.

Jsonnet ofrece funcionalidades adicionales como lógica condicional, importaciones y herencia, además de estructuras de bucle.

Los datos se pueden proporcionar mediante archivos json o jsonnet referenciados con el parámetro --iqldata del comando stackql exec, o se pueden incluir en un script iql con los decoradores <<< y >>>, como se muestra aquí:

<<<jsonnet
//
// jsonnet data
//
>>>
/* stackql statements ... */

Ejemplo de configuración con Jsonnet​

El siguiente ejemplo muestra el uso de Jsonnet para suministrar datos de configuración a un script de StackQL. Los datos se suministran con el parámetro --iqldata del comando exec, como se muestra a continuación:

stackql exec -i myscript.iql \
--iqldata vars.jsonnet \
--keyfilepath stackql-demo.json

Datos de Jsonnet​

Con jsonnet puede reutilizar variables y usar arrays dentro de estructuras de bucle en su código de StackQL. El siguiente jsonnet sería el contenido del archivo vars.jsonnet al que hace referencia el parámetro --iqldata.

// variables
local project = 'stackql-demo';
local region = 'australia-southeast1';
local name = 'myapp';
local nw_name = name + '-vpc';
local nw_self_link = 'https://compute.googleapis.com/compute/v1/projects/' + project + '/global/networks/' + nw_name + '/';

{
// global config
global: {
project: project,
},

// firewall rules
firewalls: [
{
allowed: [{IPProtocol: 'tcp'}, {IPProtocol: 'udp'}, {IPProtocol: 'icmp'}],
direction: 'INGRESS',
name: name + '-allow-internal-fw',
network: nw_self_link,
sourceRanges: ['10.240.0.0/24', '10.200.0.0/16']
},
{
allowed: [{IPProtocol: 'tcp', ports: ['22']}, {IPProtocol: 'tcp', ports: ['6443']},{IPProtocol: 'icmp'}],
direction: 'INGRESS',
name: name + '-allow-external-fw',
network: nw_self_link,
sourceRanges: ['0.0.0.0/0']
}
],
}

Hacer referencia a datos de Jsonnet en una instrucción de StackQL​

El siguiente fragmento de código muestra cómo hacer referencia a valores de jsonnet desde un comando de StackQL.

--
-- create firewall rules
--
{{range .firewalls}}
INSERT /*+ AWAIT */ INTO google.compute.firewalls
(
project,
data__name,
data__network,
data__direction,
data__sourceRanges,
data__allowed
)
SELECT
'{{ .global.project }}',
'{{.name}}',
'{{.network}}',
'{{.direction}}',
'{{.sourceRanges}}',
'{{.allowed}}';
{{end}}

Obtener variables externas con Jsonnet​

Los siguientes fragmentos de código muestran cómo incorporar variables externas a un archivo de configuración de Jsonnet que se usa para renderizar una consulta de StackQL.

Consulta de StackQL (env-var-input.iql)​

INSERT /*+ AWAIT */ INTO google.compute.networks
(
project,
data__name,
data__autoCreateSubnetworks,
data__routingConfig
)
SELECT
'{{ .global.project }}',
'{{ .network.name }}',
{{ .network.autoCreateSubnetworks }},
'{{ .network.routingConfig }}';

Archivo de datos de Jsonnet (vars.jsonnet)​

// variables
local name = 'env-var-input-demo';
local project = std.extVar("project");

{
// global config
global: {
project: project,
},
// network
network: {
autoCreateSubnetworks: false,
name: name + '-vpc',
routingConfig: {routingMode: 'REGIONAL'}
},
}

Ejecución en la línea de comandos​

/path/to/stackql exec -i $(pwd)/env-var-input.iql --var project=stackql-demo --iqldata $(pwd)/vars.jsonnet

Ejemplo de configuración con JSON​

También se puede usar json simple para suministrar datos de configuración a un script de StackQL, como se muestra a continuación:

stackql exec -i myscript.iql \
--iqldata vars.json \
--keyfilepath stackql-demo.json

Datos JSON​

Los siguientes datos json serían el contenido del archivo vars.json al que hace referencia el parámetro --iqldata.

{
"project": "stackql-demo",
"firewalls": [
{
"allowed": [{"IPProtocol": "tcp"}, {"IPProtocol": "udp"}, {"IPProtocol": "icmp"}],
"direction": "INGRESS",
"name": "myapp-allow-internal-fw",
"network": "https://compute.googleapis.com/compute/v1/projects/stackql-demo/global/networks/myapp-vpc/",
"sourceRanges": ["10.240.0.0/24", "10.200.0.0/16"]
},
{
"allowed": [{"IPProtocol": "tcp", "ports": ["22"]}, {"IPProtocol": "tcp", "ports": ["6443"]},{"IPProtocol": "icmp"}],
"direction": "INGRESS",
"name": "myapp-allow-external-fw",
"network": "https://compute.googleapis.com/compute/v1/projects/stackql-demo/global/networks/myapp-vpc/",
"sourceRanges": ["0.0.0.0/0"]
}
],
}

Hacer referencia a datos JSON en una instrucción de StackQL​

Los datos anteriores se referenciarían en una instrucción INSERT de StackQL como se muestra aquí:

INSERT /*+ AWAIT */ INTO google.compute.firewalls
(
project,
data__name,
data__network,
data__direction,
data__sourceRanges,
data__allowed
)
SELECT
'{{ project }}',
'{{ firewalls[0].name }}',
'{{ firewalls[0].network }}',
'{{ firewalls[0].direction }}',
'{{ firewalls[0].sourceRanges }}',
'{{ firewalls[0].allowed }}';

INSERT /*+ AWAIT */ INTO compute.firewalls
(
project,
data__name,
data__network,
data__direction,
data__sourceRanges,
data__allowed
)
SELECT
'{{ project }}',
'{{ firewalls[1].name }}',
'{{ firewalls[1].network }}',
'{{ firewalls[1].direction }}',
'{{ firewalls[1].sourceRanges }}',
'{{ firewalls[1].allowed }}';

Opción dryrun para previsualizar un comando​

Puede usar la opción --dryrun para obtener un script de StackQL preprocesado a partir de su script de entrada y de su archivo de datos json o jsonnet, como se muestra a continuación:

./stackql exec -i myscript.iql \
--iqldata vars.json \
--keyfilepath stackql-demo.json \
--dryrun \
--output text