Используйте jq для замены многих значений значениями переменных - PullRequest
2 голосов
/ 04 февраля 2020

Используя jq, можно ли заменить значение каждого параметра в образце JSON значением переменной, являющейся начальным значением?

В моем сценарии Azure DevOps не выполняет подстановку переменных в файле JSON, поэтому мне нужно сделать это вручную. Так, например, скажем, $SUBSCRIPTION_ID установлен на abc-123, я хотел бы использовать jq для обновления файла JSON.

Я могу вытащить значения, используя .parameters[].value, но Кажется, я не могу найти способ установки каждого отдельного значения.

Основная проблема здесь заключается в том, что решение должно быть многократно используемым, и разные JSON файлы будут иметь разные parameters, поэтому я не Я не могу использовать --argjson.

Пример

Оригинал JSON

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/parametersTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "subscriptionId": {
            "value": "$SUBSCRIPTION_ID"
        },
        "topicName": {
            "value": "$TOPIC_NAME"
        }
    }
}

Переменные

SUBSCRIPTION_ID="abc-123"
TOPIC_NAME="SomeTopic"

Желаемый JSON

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/parametersTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "subscriptionId": {
            "value": "abc-123"
        },
        "topicName": {
            "value": "SomeTopic"
        }
    }
}

Ответы [ 3 ]

1 голос
/ 04 февраля 2020

Экспортируйте эти переменные, чтобы вы могли получить к ним доступ из jq.

export SUBSCRIPTION_ID TOPIC_NAME
jq '.parameters[].value|=(env[.[1:]]//.)' file

//. часть предназначена для того, чтобы оставить переменные отсутствующими в среде как есть, вы можете удалить ее, если не нужно

1 голос
/ 04 февраля 2020

Вот «управляемый данными» подход, основанный на содержании схемы и доступных переменных среды:

export SUBSCRIPTION_ID="abc-123"
export TOPIC_NAME="SomeTopic"

< schema.json jq '.parameters 
    |= map_values(if .value | (startswith("$") and env[.[1:]]) 
                  then .value |= env[.[1:]] else . end)'

Обратите внимание, что ни одно из имен шаблонов не появляется в программе jq.

Если ваша оболочка поддерживает это, вы могли бы избежать команд «export», предварительно указав команду jq с присвоением переменных по строкам:

SUBSCRIPTION_ID="abc-123" TOPIC_NAME="SomeTopic" jq -f program.jq schema.json

Caveat

Использование переменных среды передавать значения параметров не может быть такой хорошей идеей. Двумя альтернативами будет предоставление пар имя-значение в текстовом файле или в виде объекта JSON. Смотрите также Использование jq в качестве движка шаблонов

0 голосов
/ 04 февраля 2020

Использование --argjson; по сути, вы просто проигнорируете попытку параметризации JSON и просто замените значения безоговорочно.

jq --argjson x "$SUBSCRIPTION_ID" \
   --argjson y "$TOPIC_NAME" \
   '.parameters.subscriptionId.value = $x; .parameters.topicName.value = $y' \
   config.json
...