title: Modify JSON in Ansible
body: <p>I have a management system where we define maintenance data to control virtual environment, and one of the options is VM shutdown timeframe for different teams. 
  Now when new VM is created user should select from the available list of timeframes when his/her VM can be shut down without interruption to work shift. 
  I need to be able to sync this list of timeframes from my database to job template survey. I'm stuck in modifying the JSON survey. I've tried this post <a href="https://stackoverflow.com/questions/46025695/best-way-to-modify-json-in-ansible">best way to modify json in ansible</a> but getting an error:</p>
  
  <blockquote>
    <p>"exception": "  File
    \"/tmp/ansible_1qa8eR/ansible_module_json_modify.py\", line 38, in
    main\n    res = jsonpointer.resolve_pointer(data, pointer)\n  File
    \"/usr/lib/python2.7/site-packages/jsonpointer.py\", line 126, in
    resolve_pointer\n    return pointer.resolve(doc, default)\n  File
    \"/usr/lib/python2.7/site-packages/jsonpointer.py\", line 204, in
    resolve\n    doc = self.walk(doc, part)\n  File
    \"/usr/lib/python2.7/site-packages/jsonpointer.py\", line 279, in
    walk\n    raise JsonPointerException(\"member '%s' not found in %s\" %
    (part, doc))\n", "msg": "member 'spec' not found in {'stderr_lines':
    [], 'changed': True, 'end'</p>
  </blockquote>
  
  <p>Here is my JSON that I'm trying to modify:</p>
  
  <pre><code>{
    "spec": [
      {
        "question_description": "", 
        "min": 0, 
        "default": "Test text", 
        "max": 4096, 
        "required": true, 
        "choices": "", 
        "variable": "_t", 
        "question_name": "Note", 
        "type": "textarea"
      }, 
      {
        "required": true, 
        "min": null, 
        "default": "", 
        "max": null, 
        "question_description": "appliance id", 
        "choices": "Unconfigured\n600,qvmProcessor/applianceexemptions,all", 
        "new_question": true, 
        "variable": "appid", 
        "question_name": "Appliance ID", 
        "type": "multiplechoice"
      }, 
      {
        "required": true, 
        "min": null, 
        "default": "", 
        "max": null, 
        "question_description": "Select version", 
        "choices": "1.2.3\n1.2.4\n1.2.5", 
        "new_question": true, 
        "variable": "version", 
        "question_name": "App Version", 
        "type": "multiplechoice"
      }, 
      {
        "required": true, 
        "min": 0, 
        "default": "", 
        "max": 1024, 
        "question_description": "", 
        "choices": "", 
        "new_question": true, 
        "variable": "newVMIP", 
        "question_name": "IP for new VM", 
        "type": "text"
      }, 
      {
        "required": true, 
        "min": 0, 
        "default": "", 
        "max": 1024, 
        "question_description": "", 
        "choices": "", 
        "new_question": true, 
        "variable": "requesterEmail", 
        "question_name": "Requester's email", 
        "type": "text"
      }, 
      {
        "required": true, 
        "min": null, 
        "default": "", 
        "max": null, 
        "question_description": "Select the timeframe for automatic VM shutdown. ***NOTE*** EST Time is in 24 hour format", 
        "choices": "23:00-02:00\n02:00-04:00\n04:00-06:00\n00:00-02:00", 
        "new_question": true, 
        "variable": "powerOFF_TimeFrame", 
        "question_name": "Power OFF window", 
        "type": "multiplechoice"
      }, 
      {
        "required": true, 
        "min": 0, 
        "default": 5, 
        "max": 30, 
        "question_description": "The VM will be deleted after # of days specified (default=5).", 
        "choices": "", 
        "new_question": true, 
        "variable": "vmNumReservedDays", 
        "question_name": "Keep VM for # of days", 
        "type": "integer"
      }
    ], 
    "description": "", 
    "name": ""
  }
  </code></pre>
  
  <p>I have to update timeframes (the one before last) choices:</p>
  
  <blockquote>
    <p>"choices": "23:00-02:00\n02:00-04:00\n04:00-06:00\n00:00-02:00",</p>
  </blockquote>
  
  <p>Here is my code. I could read directly to variable but for now I'm just saving JSON to the file:</p>
  
  <pre><code>- name: Sync Power Schedules From Database to Survey Spec
    hosts: awxroot
    gather_facts: no
  
    vars:
      new_choices: {}
  
    tasks:
  
      - name: Set shared directory name
        set_fact: 
          sharedDataPath: /var/tmp/survey
  
      - name: Set shared file path name
        set_fact: 
          sharedDataPathFile: "{{sharedDataPath}}/s.json"
  
      - name: Create directory to share data
        file:
          path: "{{ sharedDataPath }}"
          state: directory
  
      - name: Load Survey Spec to file
        shell: 'tower-cli job_template survey 70 &gt; "{{ sharedDataPathFile }}"'
  
  
  
      - name: Make sure the survey spec file exists
        stat:
          path: "{{ sharedDataPathFile }}"
        register: isFileExists
  
      - name: Fail if file is not there
        fail:
          msg: "Cannot find survey spec exported file"
        when: isFileExists == False
  
      - name: Read exception file to a variable
        command: cat "{{ sharedDataPathFile }}"
        register: surveySpec
        when: isFileExists.stat.exists == True
  
  
      - name: Setting key
        set_fact:
          choices_key: "choices"
  
      - name: Setting new values
        set_fact:
          choices_value: "23:00-02:00\n02:00-04:00\n04:00-06:00\n00:00-04:00"
  
      - name: Create dictionary
        set_fact:
          new_choices: "{{ new_choices | combine({choices_key: choices_value}) }}"
  
  
      - json_modify:
          data: "{{ surveySpec }}"
          pointer: "/spec/6/choices"
          action: update
          update: "{{new_choices}}"
        register: result
  
      - debug:
          var: result.result
  </code></pre>