如何防止 Ruby 的 YAML 解析器尝试解析 {{var-name}}



我有一堆大厅管道文件,如下所示:

---
resources:
- name: example
type: git
source:
uri: git@github.internal.me.com:me/example.git
branch: {{tracking_branch}}
private_key: {{ssh_key}}
paths:
- code/src/do/teams/sampleapp
params:
depth: 1
- name: deploy-image
type: docker-image
source:
repository: {{docker_image_url}}

我想在 ruby 中解析它们以执行一系列转换(例如验证它们并在缺少时更新一些键)。

问题是,每当我尝试加载并且他们将它们转储回文件时,{{something}}变成:

branch:
? tracking_branch: 
: 
private_key:
? ssh_key: 
: 

为什么这样做,有什么方法可以将解析器配置为不这样做?只是保持这些变量不变?

为了避免与 YAML 的内部语法冲突,您需要引用您的值:

---
resources:
- name: example
type: git
source:
uri: git@github.internal.me.com:me/example.git
branch: '{{tracking_branch}}'
private_key: '{{ssh_key}}'
paths:
- code/src/do/teams/sampleapp
params:
depth: 1

出于类似的原因,这种事情一直出现在 Ansible 配置文件中。

{}字符在 Yaml 中用于流映射(即哈希)。如果不为映射条目提供值,则会得到nil.

因此,在branch: {{tracking_branch}}的情况下,由于有对大括号,因此您将获得一个具有键branch和值(在Ruby中)的哈希

{{"tracking_branch"=>nil}=>nil}

当它被转回 Yaml 时,你会得到一些尴尬和冗长:

branch:
? tracking_branch:
:

解决方案只是引用值:

branch: "{{tracking_branch}}"

完全忘记了大厅现在提供模板((var-name)),只是切换到它而不是在管道上{{var-name}},YAML 解析器现在很高兴!

最新更新