我正在编写一本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字符串。在这种情况下,由于引号被剥离,任务会引发异常。如何确保在我的多行字符串变量中保留引号,同时仍允许我在其中使用变量替换?
答案 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。谁知道你的下一个任务是什么......