我正在尝试在环境中传递JSON字符串。
- name: Start {{service_name}}
shell: "<<starting springboot jar>> --server.port={{service_port}}\""
environment:
- SPRING_APPLICATION_JSON: '{"test-host.1":"{{test_host_1}}","test-host.2":"{{test_host_2}}"}'
test_host_1是172.31.00.00
test_host_2是172.31.00.00
但是在spring日志中,我会在打印
时获得JSON解析异常Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character (''' (code 39)): was expecting double-quote to start field name
at [Source: {'test-host.1': '172.31.00.00', 'test-host.2': '172.31.00.00'}; line: 1, column: 3]
如图所示,双引号转换为单引号!!!
我试图逃避双引号但没有运气。
知道为什么会这样,或者有任何解决方法吗?
答案 0 :(得分:7)
有一个关于Ansible模板引擎的事情
如果字符串看起来像一个对象(以[
或- SPRING_APPLICATION_JSON: "{{ {'test-host.1':test_host_1,'test-host.2':test_host_2} | to_json }}"
开头)Ansible将其转换为对象。请参阅code。
为防止出现这种情况,您可以使用STRING_TYPE_FILTERS之一:
startswith("{")
P.S。这就是为什么来自@ techraf的答案有空间特征的原因:Ansible错过SELECT
a.itemsid,
a.category,
a.condition,
a.description,
a.name,
a.seek,
a.picture,
a.conditionS,
a.categoryS,
a.studentid
FROM
items a
INNER JOIN items b ON a.name = b.seek
AND b.name = a.seek
AND a.itemsid < b.itemsid
WHERE
a.name = 'database'
AND b.name = 'java'
比较并且不会将字符串转换为对象。
答案 1 :(得分:3)
快速入侵:在变量定义中添加一个空格(在第一个单引号之后) - 单个空格不会影响实际变量值(空格将被忽略):
- name: Start {{service_name}}
shell: "<<starting springboot jar>> --server.port={{service_port}}\""
environment:
- SPRING_APPLICATION_JSON: ' {"test-host.1":"{{test_host_1}}","test-host.2":"{{test_host_2}}"}'
空间Ansible传递给shell(test1
,test2
是我设置的值):
SPRING_APPLICATION_JSON='"'"' {"test-host.1":"test1","test-host.2":"test2"}'"'"'
没有空间:
SPRING_APPLICATION_JSON='"'"'{'"'"'"'"'"'"'"'"'test-host.2'"'"'"'"'"'"'"'"': '"'"'"'"'"'"'"'"'test2'"'"'"'"'"'"'"'"', '"'"'"'"'"'"'"'"'test-host.1'"'"'"'"'"'"'"'"': '"'"'"'"'"'"'"'"'test1'"'"'"'"'"'"'"'"'}'"'"'
订单也是相反的。似乎没有空格它会解释JSON,空格为字符串。
我真的不知道为什么会这样......