Estoy tratando de pasar una cadena JSON en el entorno.

- 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 es 172.31.00.00

Test_host_2 es ​​172.31.00.00

Pero en los registros de primavera, obtengo una excepción de análisis JSON donde se imprime

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]

Como se ve, las comillas dobles se convierten en comillas simples.

Intenté escapar de las comillas dobles pero sin suerte.

¿Alguna idea de por qué sucede, o alguna solución?

4
Nirav Radia 14 dic. 2016 a las 17:22

2 respuestas

La mejor respuesta

Hay algo sobre el motor de plantillas de Ansible.
Si una cadena parece un objeto (comienza con { o [) Ansible lo convierte en objeto. Consulte el código.

Para evitar esto, puede usar uno de STRING_TYPE_FILTERS :

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

PD esta es la razón por la que funciona el hack con el carácter de espacio de la respuesta de @ techraf: Ansible pierde la comparación startswith("{") y no convierte una cadena en un objeto.

12
Konstantin Suvorov 14 dic. 2016 a las 16:35

Truco rápido: agregue un espacio a la definición de la variable (después de la primera comilla simple); un solo espacio no influye en el valor real de la variable (el espacio se ignorará):

- 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}}"}'

Con el espacio que Ansible pasa al shell (test1, test2 son valores que configuré):

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

Sin el espacio:

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

El orden también se invierte. Parece que sin un espacio interpreta el JSON, con el espacio como una cadena.

Realmente no entiendo por qué sucede, así que ...

8
techraf 1 jun. 2018 a las 13:12