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} } ] }'
在这样的标量中没有转义,并且 :
可以发生而不会引起问题。 |
后面的破折号表示需要去掉最后的换行符。
我正在尝试在 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} } ] }'
在这样的标量中没有转义,并且 :
可以发生而不会引起问题。 |
后面的破折号表示需要去掉最后的换行符。