How to preserve the formatting of DB command execution output in Ansible

39 views
Skip to first unread message

Know-Your-Tech

unread,
Dec 15, 2023, 11:24:01 PM12/15/23
to Ansible Project
Below is my manual command-line DB command execution output:

Note: I changed the connection string on purpose... Let me know if you need the correct connection string to check and test anything real time?

    # mongo --quiet --eval 'db=db.getSiblingDB("efendibey"); printjson(db.stats())' mongodb://42y2jn2Su31W9sS7hn:7x3uU0d9...@45.76.162.227:60076/?authSource=efendibey
    {
            "db" : "efendibey",
            "collections" : 15,
            "views" : 0,
            "objects" : 389,
            "avgObjSize" : 463.32647814910024,
            "dataSize" : 180234,
            "storageSize" : 479232,
            "indexes" : 15,
            "indexSize" : 405504,
            "totalSize" : 884736,
            "scaleFactor" : 1,
            "fsUsedSize" : 39113961472,
            "fsTotalSize" : 42256773120,
            "ok": 1
    }

I want this output as is to be sent back to the executor using ansible. Thus, above is the expected output I desire.

Below is my ansible playbook for the above command execution and print:

    - name: Execute DB command
      hosts: localhost
      gather_facts: false
   
   
      tasks:
   
        - name: Execute DB command
          raw: "{{ item }}"
          register: dboutput
          loop:
            - "mongo --quiet --eval 'db=db.getSiblingDB(\"efendibey\"); printjson(db.stats())' mongodb://42y2jn2Su31W9sS7hn:7x3uU0d9...@45.76.162.227:60076/?authSource=efendibey"
   
        - name: DEBUG DB output
          debug:
            msg: "here: {{ item.stdout }}"
          loop: "{{ dboutput.results }}"

However, the formatting it lost as visible from the output below:

    TASK [Execute DB command] **************************************************************************************************************************************************************************************
    changed: [localhost] => (item=mongo --quiet --eval 'db=db.getSiblingDB("efendibey"); printjson(db.stats())' mongodb://42y2jn2Su31W9sS7hn:7x3uU0d9...@45.76.162.227:60076/?authSource=efendibey)
   
    TASK [DEBUG DB output] *****************************************************************************************************************************************************************************************
    ok: [localhost] => (item={'rc': 0, 'stdout': '{\n\t"db" : "efendibey",\n\t"collections" : 15,\n\t"views" : 0,\n\t"objects" : 389,\n\t"avgObjSize" : 463.32647814910024,\n\t"dataSize" : 180234,\n\t"storageSize" : 479232,\n\t"indexes" : 15,\n\t"indexSize" : 405504,\n\t"totalSize" : 884736,\n\t"scaleFactor" : 1,\n\t"fsUsedSize" : 39113928704,\n\t"fsTotalSize" : 42256773120,\n\t"ok" : 1\n}\n', 'stdout_lines': ['{', '\t"db" : "efendibey",', '\t"collections" : 15,', '\t"views" : 0,', '\t"objects" : 389,', '\t"avgObjSize" : 463.32647814910024,', '\t"dataSize" : 180234,', '\t"storageSize" : 479232,', '\t"indexes" : 15,', '\t"indexSize" : 405504,', '\t"totalSize" : 884736,', '\t"scaleFactor" : 1,', '\t"fsUsedSize" : 39113928704,', '\t"fsTotalSize" : 42256773120,', '\t"ok" : 1', '}'], 'stderr': '', 'stderr_lines': [], 'changed': True, 'failed': False, 'item': 'mongo --quiet --eval \'db=db.getSiblingDB("efendibey"); printjson(db.stats())\' mongodb://42y2jn2Su31W9sS7hn:7x3uU0d9...@45.76.162.227:60076/?authSource=efendibey', 'ansible_loop_var': 'item'}) => {
        "msg": "here: {\n\t\"db\" : \"efendibey\",\n\t\"collections\" : 15,\n\t\"views\" : 0,\n\t\"objects\" : 389,\n\t\"avgObjSize\" : 463.32647814910024,\n\t\"dataSize\" : 180234,\n\t\"storageSize\" : 479232,\n\t\"indexes\" : 15,\n\t\"indexSize\" : 405504,\n\t\"totalSize\" : 884736,\n\t\"scaleFactor\" : 1,\n\t\"fsUsedSize\" : 39113928704,\n\t\"fsTotalSize\" : 42256773120,\n\t\"ok\" : 1\n}\n"
    }

I wish to eventually use `blockinfile` to dump and then read back the output of DB execution to a flat file.

I tried `regex_replace` filter but the new lines and other formatting remain disturbed and i cannot get the desired output.

    - name: Replace escaped characters with actual newline and tab
      set_fact:
        formatted_data: "{{ item.stdout | regex_replace('\\\\n', '\\n') | regex_replace('\\\\t', '\\t') }}"
      loop: "{{ dboutput.results }}"

Note: In case it is difficult to get the output as is... I would like the output to be decently formatted on newlines.

Can you please suggest how can I?
Reply all
Reply to author
Forward
0 new messages