Search code examples
ansiblejson-query

How to use json_query against a output stored in a registered variable in Ansible?


I am writing an Ansible role to fetch current details of Audit settings from SQL Server through ansible.windoww.win_powershell module. In doing so, I am trying to use json_query in Ansible that has the following structure in the output but json_query is returning empty values. Please help.

This is the Ansible task:

 - name: Sample Test   debug: 
     msg: "{{list_of_audit_actions.output}}"

This variable list_of_audit_actions.output has this structure:

"msg": [
        {
            "HasErrors": false, 
            "ItemArray": [
                "Test-Audit_Specification_SCM", 
                "AUDIT_CHANGE_GROUP", 
                "SUCCESS AND FAILURE", 
                "APPLICATION LOG"
            ], 
            "RowError": "", 
            "RowState": {
                "String": "Detached", 
                "Type": "System.Data.DataRowState", 
                "Value": 1
            }, 
            "Table": {
                "CaseSensitive": false, 
                "ChildRelations": "", 
                "Columns": "name audit_action_name audited_result type_desc", 
                "Constraints": "", 
                "Container": null, 
                "ContainsListCollection": false, 
                "DataSet": null, 
                "DefaultView": "", 
                "DesignMode": false, 
                "DisplayExpression": "", 
                "ExtendedProperties": "System.Data.PropertyCollection", 
                "HasErrors": false, 
                "IsInitialized": true, 
                "Locale": "en-GB", 
                "MinimumCapacity": 50, 
                "Namespace": "", 
                "ParentRelations": "", 
                "Prefix": "", 
                "PrimaryKey": "", 
                "RemotingFormat": 0, 
                "Rows": "", 
                "Site": null, 
                "TableName": ""
            }, 
            "audit_action_name": "AUDIT_CHANGE_GROUP", 
            "audited_result": "SUCCESS AND FAILURE", 
            "name": "Test-Audit_Specification_SCM", 
            "type_desc": "APPLICATION LOG"
        }, 
        {
            "HasErrors": false, 
            "ItemArray": [
                "TestAuditSpec1", 
                "AUDIT_CHANGE_GROUP", 
                "SUCCESS AND FAILURE", 
                "APPLICATION LOG"
            ], 
            "RowError": "", 
            "RowState": {
                "String": "Detached", 
                "Type": "System.Data.DataRowState", 
                "Value": 1
            }, 
            "Table": {
                "CaseSensitive": false, 
                "ChildRelations": "", 
                "Columns": "name audit_action_name audited_result type_desc", 
                "Constraints": "", 
                "Container": null, 
                "ContainsListCollection": false, 
                "DataSet": null, 
                "DefaultView": "", 
                "DesignMode": false, 
                "DisplayExpression": "", 
                "ExtendedProperties": "System.Data.PropertyCollection", 
                "HasErrors": false, 
                "IsInitialized": true, 
                "Locale": "en-GB", 
                "MinimumCapacity": 50, 
                "Namespace": "", 
                "ParentRelations": "", 
                "Prefix": "", 
                "PrimaryKey": "", 
                "RemotingFormat": 0, 
                "Rows": "", 
                "Site": null, 
                "TableName": ""
            }, 
            "audit_action_name": "AUDIT_CHANGE_GROUP", 
            "audited_result": "SUCCESS AND FAILURE", 
            "name": "TestAuditSpec1", 
            "type_desc": "APPLICATION LOG"
        }, 
        {
            "HasErrors": false, 
            "ItemArray": [
                "TestAuditSpec1", 
                "FAILED_LOGIN_GROUP", 
                "SUCCESS AND FAILURE", 
                "APPLICATION LOG"
            ], 
            "RowError": "", 
            "RowState": {
                "String": "Detached", 
                "Type": "System.Data.DataRowState", 
                "Value": 1
            }, 
            "Table": {
                "CaseSensitive": false, 
                "ChildRelations": "", 
                "Columns": "name audit_action_name audited_result type_desc", 
                "Constraints": "", 
                "Container": null, 
                "ContainsListCollection": false, 
                "DataSet": null, 
                "DefaultView": "", 
                "DesignMode": false, 
                "DisplayExpression": "", 
                "ExtendedProperties": "System.Data.PropertyCollection", 
                "HasErrors": false, 
                "IsInitialized": true, 
                "Locale": "en-GB", 
                "MinimumCapacity": 50, 
                "Namespace": "", 
                "ParentRelations": "", 
                "Prefix": "", 
                "PrimaryKey": "", 
                "RemotingFormat": 0, 
                "Rows": "", 
                "Site": null, 
                "TableName": ""
            }, 
            "audit_action_name": "FAILED_LOGIN_GROUP", 
            "audited_result": "SUCCESS AND FAILURE", 
            "name": "TestAuditSpec1", 
            "type_desc": "APPLICATION LOG"
        }
    ]
}

How do I use json_query to filter all the values of audit_action_name in the above output?

I tried something like

- name: Sample Test
  debug: 
    msg: "{{list_of_audit_actions.output| community.general.json_query('audit_action_name')}}" 

But that does not yield anything but empty output


Solution

  • For building a query to use with the json_query filter, I like to use the jp command line tool to experiment with queries.


    The contents of list_of_audit_actions.output is a list, so a query for audit_action_name doesn't make sense -- it's not a dictionary and does not have an audit_action_name attribute.

    We want to extract the audti_action_name attribute from every item in the list, which we can do like this:

    - debug:
        var: list_of_audit_actions.output | json_query('[].audit_action_name')
    

    Which will produce as output:

    TASK [debug] ******************************************************************************************************************************************************************************************************
    ok: [localhost] => {
        "list_of_audit_actions.output | json_query('[].audit_action_name')": [
            "AUDIT_CHANGE_GROUP",
            "AUDIT_CHANGE_GROUP",
            "FAILED_LOGIN_GROUP"
        ]
    }