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

时间:2017-10-05 15:39:31

标签: ruby 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

  - name: deploy-image
    type: docker-image
    source:
      repository: {{docker_image_url}}

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

问题是,每当我尝试加载它们并将它们转储回文件时,{{something}}的部分就变成了:

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

为什么这样做,是否有任何方法可以配置解析器不执行此操作?只要保留这些变量就可以了吗?

3 个答案:

答案 0 :(得分:1)

为避免与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配置文件中。

答案 1 :(得分:1)

{}字符在Yaml中用于flow mappings(即哈希)。如果您没有为映射条目提供值,则会获得nil

所以在branch: {{tracking_branch}}的情况下,由于有两个对括号,你得到一个带有键branch和值(在Ruby中)的哈希

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

如果将其转发给Yaml,你会得到一些有点啰嗦和冗长的信息:

branch:
  ? tracking_branch:
  :

解决方案只是引用值:

branch: "{{tracking_branch}}"

答案 2 :(得分:0)

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