Ansible: неверно JSON при использовании --extra-vars - PullRequest
0 голосов
/ 09 февраля 2020

Привет, сообщество,

Я боролся с проблемой ansible уже несколько дней. Все выполняется в конвейере Дженкинса.

Команда ansible выглядит следующим образом:

sh """
        ansible-playbook ${env.WORKSPACE}/cost-optimization/ansible/manage_dynamo_db.yml \
        --extra-vars '{"projectNameDeployConfig":${projectNameDeployConfig},"numberOfReplicas":${numberOfReplicas},"dynamodbtask":${dynamodbtask}}'
    """

А вот пьесы:

playbook.yml

---
- hosts: localhost
  vars:
      numberOfReplicas: "{{numberOfReplicas}}"
      dynamodbtask: "{{dynamodbtask}}"
      namespace: "{{projectNameDeployConfig}}"
      status: "{{status}}"

- tasks:
 - name: "Get replica number for the pods"
    command: aws dynamodb put-item --table-name pods_replicas
    register: getResult
    when: dynamodbtask == "get"

  - name: "Update replica number for specified pods"
    command: |
      aws dynamodb put-item 
      --table-name pods_replicas 
      --item '{"ProjectNameDeployConfig":{"S":{{namespace}}},"NumberReplicas":{"N":{{numberOfReplicas}}}}'
    register: updatePayload
    when: dynamodbtask == "put" and getResult is skipped

Однако всегда есть следующая ошибка:

fatal: [localhost]: FAILED! => {"changed": true, "cmd": ["aws", "dynamodb", "put-item", "--table-name",
"pods_replicas", "--item", "{\"ProjectNameDeployConfig\":{\"S\":LERN-PolicyCenterV10},\"NumberReplicas\":
{\"N\":0}}"], "delta": "0:00:01.702107", "end": "2020-02-09 16:58:26.055579", 
"msg": "non-zero return code", "rc": 255, "start": "2020-02-09 16:58:24.353472", "stderr": "\nError parsing parameter '--item': Invalid JSON: No JSON object could be decoded\nJSON received: {\"ProjectNameDeployConfig\":{\"S\":LERN-PolicyCenterV10},\"NumberReplicas\":{\"N\":0}}", "stderr_lines": ["", "Error parsing parameter '--item': Invalid JSON: No JSON object could be decoded", "JSON received: {\"ProjectNameDeployConfig\":{\"S\":LERN-PolicyCenterV10},\"NumberReplicas\":{\"N\":0}}"], "stdout": "", "stdout_lines": []}

1 Ответ

0 голосов
/ 10 февраля 2020

Есть два ответа на ваш вопрос: простой и правильный

Простой - если бы вы на самом деле скормили JSON в jq или python -m json.tool, вы бы получили заметил, что namespace без кавычек:

    "{\"ProjectNameDeployConfig\":{\"S\":    LERN-PolicyCenterV10      },\"NumberReplicas\": {\"N\":0}}"

, где я добавил огромное количество места, но в остальном не изменил кавычки

Правильный ответ: вы никогда не должны использовать jinja2 попытаться собрать структурированный текст, когда есть фильтры, которые делают это для вас.

То, что вы на самом деле хотите, это использовать фильтр to_json :

  - name: "Update replica number for specified pods"
    command: |
      aws dynamodb put-item 
      --table-name pods_replicas 
      --item {{ dynamodb_item | to_json | quote }}
    vars:
       dynamodb_item:
         "ProjectNameDeployConfig":
           "S": '{{ projectNameDeployConfig }}'
         "NumberReplicas":
           "N": 0
    register: updatePayload
    when: dynamodbtask == "put" and getResult is skipped

, хотя вы заметите, что я изменил имя вашей переменной, потому что namespace - это имя типа в jinja2, поэтому вы можете либо назвать его ns, либо я просто использовал значение интерполяции из вашего блока vars: в верхней части книги воспроизведения, поскольку не похоже, что оно изменилось с того времени

...