Ansible - 将环境中的JSON字符串传递给shell模块

时间:2016-12-14 14:22:24

标签: json ansible

我正在尝试在环境中传递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]

如图所示,双引号转换为单引号!!!

我试图逃避双引号但没有运气。

知道为什么会这样,或者有任何解决方法吗?

2 个答案:

答案 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(test1test2是我设置的值):

SPRING_APPLICATION_JSON='"'"' {"test-host.1":"test1","test-host.2":"test2"}'"'"'

没有空间:

SPRING_APPLICATION_JSON='"'"'{'"'"'"'"'"'"'"'"'test-host.2'"'"'"'"'"'"'"'"': '"'"'"'"'"'"'"'"'test2'"'"'"'"'"'"'"'"', '"'"'"'"'"'"'"'"'test-host.1'"'"'"'"'"'"'"'"': '"'"'"'"'"'"'"'"'test1'"'"'"'"'"'"'"'"'}'"'"'

订单也是相反的。似乎没有空格它会解释JSON,空格为字符串。

我真的不知道为什么会这样......