gitlab-ci.yml bash 更新 AWS route53 无效 yaml 的脚本

gitlab-ci.yml bash script to update AWS route53 invalid yaml

我正在尝试在 GitLab 中创建一个作业,以便在部署时更新应用程序的 DNS。我有一个适用于 gitlab-runner 的 bash oneliner。但是我无法在 gitlab-ci.yml 文件中验证它。这是在 gitlab runner 上运行的原始脚本。

TARGET_ZONEID="Z2T1234"; TARGET_FQDN="appName.domain.com."; echo '{ "Comment": "DDNS update", "Changes":[ { "Action": "UPSERT", "ResourceRecordSet": { "ResourceRecords": [ { "Value": "web_server.domain.com" } ], "Name": "'"$TARGET_FQDN"'", "Type": "CNAME", "TTL": 60} } ] }'

我在Gitlab中是这样的-ci.yml

update_public_dns:
  script: 
  - TARGET_ZONEID="Z2T1234"; TARGET_FQDN="appName.domain.com."; echo '{ "Comment": "DDNS update", "Changes":[ { "Action": "UPSERT", "ResourceRecordSet": { "ResourceRecords": [ { "Value": "web_server.domain.com" } ], "Name": "'"$TARGET_FQDN"'", "Type": "CNAME", "TTL": 60} } ] }'

失败并出现以下错误:(<unknown>): did not find expected key while parsing a block mapping at line 3 column 5.

在互联网上搜索了几个小时后,我发现了一条建议,指出我应该转义所有引号。所以我尝试了这个:(注意我取出了一个变量来尝试简化脚本。)

update_public_dns:
  script: 
  - echo '{ \"Comment\": \"DDNS update\", \"Changes\": [ { \"Action\": \"UPSERT\", \"ResourceRecordSet\": { \"ResourceRecords\": [ { \"Value\": \"web_server.panosoft.com\" } ], \"Name\": \"appName.domain.com\", \"Type\": \"CNAME\", \"TTL\": 60} } ] }' | aws route53 change-resource-record-sets --hosted-zone-id "Z2TLDA3UA15TJ8" --change-batch file:///dev/stdin'

结果是这个错误:

(<unknown>): mapping values are not allowed in this context at line 3 column 54

我现在已经无计可施了。有什么建议吗?

仅供参考,我不想创建 bash 脚本然后从 gitlab 调用它,因为我打算使用项目变量来自定义 web_server 和 appName 设置。

在普通标量(不带引号)中,就像在您的第一个 YAML 示例中一样,您不能有像 :(冒号+space)这样的序列,因为它们表示键值对。

如果将其变成双引号标量,则必须使用反斜杠对双引号和任何现有的反斜杠进行转义。
如果你把它变成单引号标量,你必须通过加倍来转义任何单引号。

将字符串转换为标量的最简单方法是使其成为块样式文字标量:

update_public_dns:
  script: 
  - |-
    TARGET_ZONEID="Z2T1234"; TARGET_FQDN="appName.domain.com."; echo '{ "Comment": "DDNS update", "Changes":[ { "Action": "UPSERT", "ResourceRecordSet": { "ResourceRecords": [ { "Value": "web_server.domain.com" } ], "Name": "'"$TARGET_FQDN"'", "Type": "CNAME", "TTL": 60} } ] }'

在这样的标量中没有转义,并且 : 可以发生而不会引起问题。 | 后面的破折号表示需要去掉最后的换行符。