Как найти и заменить json переменными оболочки, используя jq? - PullRequest
0 голосов
/ 20 апреля 2019

Я прочитал свойства с jq из объекта json и сохранил их в переменных.

Теперь я хочу прочитать эти переменные и, по сути, найти и заменить слово внутри строки глобальной переменной оболочки.

Я установил свои json ID из моего файла JSON

# Set Json ID's
TARGET_ID=$(jq '.DefaultCacheBehavior.TargetOriginId' distconfig.json)
DOMAIN_NAME=$(jq '.Origins.Items[0].DomainName' distconfig.json)
ORIGIN_ID=$(jq '.Origins.Items[0].Id' distconfig.json)

echo "$TARGET_ID"
echo "$DOMAIN_NAME"
echo "$ORIGIN_ID"

Возвращает

"S3-Website-stag4.example.io.s3-website.us-east-2.amazonaws.com"
"stag4.example.io.s3-website.us-east-2.amazonaws.com"
"S3-Website-stag4.example.io.s3-website.us-east-2.amazonaws.com"

У меня есть переменная идентификатора местоположения, и я хотел бы написать ее, чтобы найти и заменить все ссылки stag4 в этих 3 идентификаторах.

Затем я хотел бы записать эти 3 идентификатора в исходный объект json или создать его временную версию.

Пример, если: $DOMAIN_NAME является "stag4.example.io.s3-website.us-east-2.amazonaws.com"

Я бы хотел, чтобы он по существу был установлен на:

$LOCATION_NAME="stag6"
DOMAIN_LOCATION="example.io"
"$DOMAIN_NAME=S3-Website-\$LOCATION_NAME\.example.io.s3-website.us-east-2.amazonaws.com"
"$TARGET_ID=\$LOCATION_NAME\.example.io.s3-website.us-east-2.amazonaws.com"
"$ORIGIN_ID=S3-Website-\$LOCATION_NAME\.example.io.s3-website.us-east-2.amazonaws.com"

Затем запишите эти 3 в временный или новый файл json, чтобы я мог запустить команду облачной информации:

aws cloudfront create-distribution --distribution-config file://disttemp.json

Теперь я собрал правильные переменные из исходного файла json следующим образом:

$LOCATION_NAME="stag6"
DOMAIN_LOCATION="example.io"
echo "Build New IDs"
TARGET_ID_BUILT="S3-Website-$LOCATION_NAME.$DOMAIN_LOCATION.s3-website.us-east-2.amazonaws.com"
DOMAIN_NAME_BUILT="$LOCATION_NAME.$DOMAIN_LOCATION.s3-website.us-east-2.amazonaws.com"
ORIGIN_ID_BUILT="S3-Website-$LOCATION_NAME.$DOMAIN_LOCATION.s3-website.us-east-2.amazonaws.com"

echo "$TARGET_ID_BUILT"
echo "$DOMAIN_NAME_BUILT"
echo "$ORIGIN_ID_BUILT"

Как мне записать эти переменные в файл json с помощью jq?

РЕДАКТИРОВАТЬ: образец distconfig.json запрошен - домен / creds поменялся на пример

{
  "CallerReference": "my-test-distribution-2",
  "Comment": "", 
  "CacheBehaviors": {
      "Quantity": 0
  }, 
  "IsIPV6Enabled": true, 
  "Logging": {
      "Bucket": "", 
      "Prefix": "", 
      "Enabled": false, 
      "IncludeCookies": false
  }, 
  "WebACLId": "", 
  "Origins": {
      "Items": [
          {
              "OriginPath": "", 
              "CustomOriginConfig": {
                  "OriginSslProtocols": {
                      "Items": [
                          "TLSv1", 
                          "TLSv1.1", 
                          "TLSv1.2"
                      ], 
                      "Quantity": 3
                  }, 
                  "OriginProtocolPolicy": "http-only", 
                  "OriginReadTimeout": 30, 
                  "HTTPPort": 80, 
                  "HTTPSPort": 443, 
                  "OriginKeepaliveTimeout": 5
              }, 
              "CustomHeaders": {
                  "Quantity": 0
              }, 
              "Id": "S3-Website-stag4.example.io.s3-website.us-east-2.amazonaws.com", 
              "DomainName": "stag4.example.io.s3-website.us-east-2.amazonaws.com"
          }
      ], 
      "Quantity": 1
  },
}
"DefaultRootObject": "", 
  "PriceClass": "PriceClass_All", 
  "Enabled": true, 
  "DefaultCacheBehavior": {
      "TrustedSigners": {
          "Enabled": false, 
          "Quantity": 0
      }, 
      "LambdaFunctionAssociations": {
          "Quantity": 0
      }, 
      "TargetOriginId": "S3-Website-stag4.example.io.s3-website.us-east-2.amazonaws.com", 
      "ViewerProtocolPolicy": "redirect-to-https", 
      "ForwardedValues": {
          "Headers": {
              "Quantity": 0
          }, 
          "Cookies": {
              "Forward": "none"
          }, 
          "QueryStringCacheKeys": {
              "Quantity": 0
          }, 
          "QueryString": false
      }, 
      "MaxTTL": 31536000, 
      "SmoothStreaming": false, 
      "DefaultTTL": 86400, 
      "AllowedMethods": {
          "Items": [
              "HEAD", 
              "GET"
          ], 
          "CachedMethods": {
              "Items": [
                  "HEAD", 
                  "GET"
              ], 
              "Quantity": 2
          }, 
          "Quantity": 2
      }, 
      "MinTTL": 0, 
      "Compress": true
  }, 
  "ViewerCertificate": {
      "SSLSupportMethod": "sni-only", 
      "ACMCertificateArn": "xxxx", 
      "MinimumProtocolVersion": "TLSv1.1_2016", 
      "Certificate": "xxxx", 
      "CertificateSource": "acm"
  }, 
  "CustomErrorResponses": {
      "Quantity": 0
  }, 
  "HttpVersion": "http2", 
  "Restrictions": {
      "GeoRestriction": {
          "RestrictionType": "none", 
          "Quantity": 0
      }
  }, 
  "Aliases": {
      "Quantity": 0
  }
}

1 Ответ

0 голосов
/ 14 мая 2019

Вы должны использовать sed, чтобы выполнить подстановку, а затем ввести значение обратно в JSON.

echo $TARGET_ID | sed 's/stag4/stag5/g'

Выходы S3-Website-stag5.example.io.s3-website.us-east-2.amazonaws.com

Затем мы поместим значение обратно в исходный JSON, это технически выведет новый JSON и не отредактирует файл, однако, вы можете легко решить эту проблему с помощью временного сохранения в файл tmp.

Мы будем использовать флаг --arg для ссылки на нашу переменную bash и установить новое значение для нашего поля

cat distconfig.json | jq --arg TARGET_ID $TARGET_ID '.DefaultCacheBehavior.TargetOriginId = $TARGET_ID' > tmp.json && mv tmp.json distconfig.json

...