简体   繁体   中英

Ansible: Invalid JSON when using --extra-vars

Hi community,

I have been struggling with an issue in ansible issue for days now. Everything is executed wihtin a Jenkins pipeline.

The ansible command looks like:

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

And the playbooks is:

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

However, there is always the following error:

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": []}

There are two answers to your question: the simple one and the correct one

The simple one is that had you actually fed the JSON into jq , or python -m json.tool , you would have observed that namespace is unquoted:

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

where I added a huge amount of space, but didn't otherwise alter the quotes

The correct answer is that you should never use jinja2 to try and assemble structured text when there are filters that do so for you.

What you actually want is to use the to_json filter :

  - 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

although you'll notice that I changed your variable name because namespace is the name of a type in jinja2, so you can either call it ns or I just used the interpolation value from your vars: block at the top of the playbook, as it doesn't appear that it changed from then

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM