如何强制YAML在使用变量替换的块内保留引号?

时间:2018-01-11 22:18:06

标签: ansible yaml

我正在编写一本Ansible剧本,并且遇到了一个奇怪的问题,我的变量最终会以意想不到的方式发生变化。我有一个变量,它实际上是一个JSON的多行字符串,我使用块标量(>)语法声明。如果我这么做,那就行得很好。但是,我还需要替换该字符串中的另一个变量。而且一旦我这样做,它最终会因某种原因有效地剥离字符串中的所有双引号。

以下是我的YAML的样本:

vars:
  - policy: >
      {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "AddPerm",
                "Effect": "Allow",
                "Principal": "*",
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::{{ domain_name }}/*"
            }
        ]
      }

虽然这确实正确地将我的domain_name变量的值替换为字符串,就像我说的那样 - 它也会删除在任务执行期间导致异常的所有引号。作为一个简单的测试,我添加了一个任务,将"{{ policy }}"的值保存到文本文件中,只是为了查看发生了什么。我最终看到的是:

{Version: 2012-10-17, Statement: [{Action: s3:GetObject, Principal: *, Resource: arn:aws:s3:::my.domain.com/*, Effect: Allow, Sid: AddPerm}]}

我实际上是在另一个测试中使用它作为参数,它需要一个有效的JSON字符串。在这种情况下,由于引号被剥离,任务会引发异常。如何确保在我的多行字符串变量中保留引号,同时仍允许我在其中使用变量替换?

1 个答案:

答案 0 :(得分:2)

-使用列表标记vars是一个明显的语法错误,如果您真的使用过,Ansible应该使用您发布的代码片段抛出一个。

删除了......

  

如何确保在我的多行字符串变量中保留引号,同时仍允许我在其中使用变量替换?

这是多行字符串变量,而是JSON中数据对象(字典类型)的定义。

对象内部没有任何"引号"无论是否存在变量替换。这是一种数据结构。

您最终看到",换句话说,如何在屏幕上呈现数据结构,完全取决于显示它的方法。

如果" 进行不同的测试,[]需要一个有效的JSON字符串"那么你必须定义一个字符串。要在YAML中这样做,你可以引用它:

vars:
  policy: >
    '{
      "Version": "2012-10-17",
      "Statement": [
          {
              "Sid": "AddPerm",
              "Effect": "Allow",
              "Principal": "*",
              "Action": "s3:GetObject",
              "Resource": "arn:aws:s3:::{{ domain_name }}/*"
          }
      ]
    }'

但您也可以保留JSON数据类型并使用filter for formatting data。谁知道你的下一个任务是什么......