【问题标题】:Ansible - passing JSON string in environment to shell moduleAnsible - 将环境中的 JSON 字符串传递给 shell 模块
【发布时间】:2016-12-14 14:22:23
【问题描述】:

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

正如所见,双引号被转换为单引号!!!

我尝试转义双引号,但没有成功。

知道为什么会发生这种情况,或者有什么解决方法吗?

【问题讨论】:

    标签: json ansible


    【解决方案1】:

    有一个关于 Ansible 模板引擎的东西。
    如果一个字符串看起来像一个对象(以{[ 开头),Ansible 会将其转换为对象。见code

    为防止这种情况,您可以使用STRING_TYPE_FILTERS 之一:

    - SPRING_APPLICATION_JSON: "{{ {'test-host.1':test_host_1,'test-host.2':test_host_2} | to_json }}"
    

    附:这就是为什么使用@techraf 的答案中的空格字符进行破解的原因:Ansible 错过了startswith("{") 比较并且不将字符串转换为对象。

    【讨论】:

      【解决方案2】:

      快速技巧:在变量定义中添加一个空格(在第一个单引号之后)——单个空格不会影响实际的变量值(空格将被忽略):

      - 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,空格作为字符串。

      我真的不明白为什么会这样......

      【讨论】:

      • 谢谢。天哪,我们在这个问题上已经敲了好几个小时了>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      • 2017-12-14
      • 1970-01-01
      • 2017-03-06
      • 2018-11-25
      • 1970-01-01
      • 2017-11-30
      相关资源
      最近更新 更多