Normally I would change

krblastpwdchange[0].__datetime__

to

krblastpwdchange[0].__datetime__ | default('0')

but your expression is part of json_query(). Perhaps there's an equivalent of Jinja's default() in json_query(); I just don't know.

Without standing up an IPA instance and experimenting, I don't see a way to derive what your user_show data looks like. (I did that a year or two ago to answer a similar question, but I'm a bit swamped at the moment.) Perhaps if you could give us the first couple of records from your registered user_show data — the first one that's throwing the error and another one or two that has what you expect, anonymized as appropriate of course — that would give us enough information about your data's structure to suggest some expressions to try.

Including the playbook helps a whole lot; alas, without sample data or an IPA instance to play with it's not sufficient to give you a definitive answer. Well, at least I can't.

I know this sort of problem can be extremely frustrating, and you've been patient in asking. We really do want to help, honestly. But the IPA thing is one level of niche, and very few people are versed in json_query() so that adds yet another level of niche. But if you can provide the sample data I mentioned before I think we can make some progress.
--
Todd

On 2/26/24 9:43 AM, [email protected] wrote:
I'm including the playbook below.  I'm still unable to find a way to ignore any user that does not have the krblastpwdchange property set.  When I run the playbook, I still get the following error:

TASK [Find users who's password will expire in the next 10 days] ******************************************************************************************************************************************* fatal: [localhost]: FAILED! => {"msg": "Unexpected templating type error occurred on ({{ user_show.results | json_query('[*].json.result.result.{uid: uid[0], pwdchg: krblastpwdchange[0].__datetime__}') | selectattr('pwdchg', 'defined') | selectattr('pwdchg', '<', expire_date) | list }}): '<' not supported between instances of 'NoneType' and 'AnsibleUnsafeText'. '<' not supported between instances of 'NoneType' and 'AnsibleUnsafeText'"}

Playbook:

---
- name: Gather User Password Expiration information from IDM server
  hosts: localhost
  gather_facts: no

  pre_tasks:
    - setup:
        filter: 'ansible_date_time'

  vars_files:
    - /etc/ansible/vault.yml

  vars:
    idmfqdn: idmserver
    binduser: 'admin'
    bindpasswd: '{{ secure_ipa_pass }}'
    warning_days: 10

  tasks:

  - name: Set list of users to ignore
    ansible.builtin.set_fact:
      ignore_users:
        - "root"
        - "some.user"
        - "some.c-ctr.user"
        - "test.redhat"
        - "admin"

  - name: Login to IDM use returned cookie to access the API in later tasks
    ansible.builtin.uri:
      url: "https://{{idmfqdn}}/ipa/session/login_password";
      method: POST
      headers:
        Referer: "https://{{idmfqdn}}/ipa";
        Content-Type: "application/x-www-form-urlencoded"
        Accept: "text/plain"
      body_format: form-urlencoded
      body:
        user: "{{binduser}}"
        password: "{{bindpasswd}}"
      status_code: 200
      follow_redirects: all
    register: login

  - name: Get IDM API version using previously stored session cookie
    ansible.builtin.uri:
      url: "https://{{idmfqdn}}/ipa/session/json";
      method: POST
      headers:
        Cookie: "{{ login.set_cookie }}"
        Referer: "https://{{idmfqdn}}/ipa";
        Content-Type: "application/json"
        Accept: "application/json"
      body_format: json
      body: '{"method": "ping","params": [[],{}]}'
    register: api_vers_out

  - name: Set fact for api version
    ansible.builtin.set_fact:
      api_vers: "{{ api_vers_out.json.result.messages|json_query('[*].data.server_version')|join() }}"

  - name: Run user_find from IDM API using previously stored session cookie
    ansible.builtin.uri:
      url: "https://{{idmfqdn}}/ipa/session/json";
      method: POST
      headers:
        Cookie: "{{ login.set_cookie }}"
        Referer: "https://{{idmfqdn}}/ipa";
        Content-Type: "application/json"
        Accept: "application/json"
      body_format: json
      body: "{\"method\": \"user_find/1\",\"params\": [[],{\"version\": \"{{ api_vers }}\"}]}"
    no_log: true
    register: user_find

  - name: Set users fact
    ansible.builtin.set_fact:
      uid: "{{ user_find.json.result.result|map(attribute='uid')|flatten|difference(ignore_users) }}"

  - name: Run user_show from IDM API using previously stored session cookie
    ansible.builtin.uri:
      url: "https://{{idmfqdn}}/ipa/session/json";
      method: POST
      headers:
        Cookie: "{{ login.set_cookie }}"
        Referer: "https://{{idmfqdn}}/ipa";
        Content-Type: "application/json"
        Accept: "application/json"
      body_format: json
      body: "{\"method\": \"user_show\",\"params\": [[ \"{{ item }}\"],{\"all\": true,\"version\": \"{{ api_vers }}\"}]}"
    register: user_show
    loop: "{{ uid | json_query('[:1]') }}"


  - name: Set expire date
    ansible.builtin.set_fact:
      expire_date: '{{ lookup(''pipe'', ''date -u --date="today + {{ warning_days }} days" +%Y%m%d000000Z'') }}'

  - name: Show expire date
    ansible.builtin.debug:
      msg: "{{ expire_date }}"

  - name: Show user info
    debug:
      msg: "{{ user_show.results | json_query('[*].json.result.result.{uid: uid[0], pwdchg: krblastpwdchange[0].__datetime__}') }}"

  - name: Find users who's password will expire in the next {{ warning_days }} days
    ansible.builtin.set_fact:
      pwd_expire_soon: "{{ user_show.results | json_query('[*].json.result.result.{uid: uid[0], pwdchg: krblastpwdchange[0].__datetime__}') | selectattr('pwdchg', 'defined') | selectattr('pwdchg', '<', expire_date) | list }}"

  - name: Show accounts that are due to expire in the next {{ warning_days }} days
    ansible.builtin.debug:
      msg: "{{ pwd_expire_soon }}"

Thanks,
Harry
On Friday, February 23, 2024 at 2:54:06 PM UTC-5 [email protected] wrote:

    So it looks like the VERY 1st user in our system has never logged
    in, so the krblaspwdchange property has never gotten set.  Is
    there a way to ignore when that field doesn't exist or is null?

    Thanks,
    Harry

    On Friday, February 23, 2024 at 2:46:07 PM UTC-5 Todd Lewis wrote:

        The original problem is you're comparing 'NoneType' and 'str'.
        So, for at least one of your principals there's no
        krblastpwdchange. You need to work on the subset of data
        relevant to the comparison.


        On 2/23/24 2:09 PM, [email protected] wrote:
        I'm not including the entire playbook, but the URI module
        call where user_show gets registered, then the debug statements:

          - name: Run user_show from IDM API using previously stored
        session cookie
            ansible.builtin.uri:
              url: "https://{{idmfqdn}}/ipa/session/json";
        <https://%7B%7Bidmfqdn%7D%7D/ipa/session/json>
              method: POST
              headers:
                Cookie: "{{ login.set_cookie }}"
                Referer: "https://{{idmfqdn}}/ipa";
        <https://%7B%7Bidmfqdn%7D%7D/ipa>
                Content-Type: "application/json"
                Accept: "application/json"
              body_format: json
              body: "{\"method\": \"user_show\",\"params\": [[ \"{{
        item }}\"],{\"all\": true,\"version\": \"{{ api_vers }}\"}]}"
            register: user_show
            loop: "{{ uid | json_query('[:10]') }}"


          - name: Set expire date
            ansible.builtin.set_fact:
              expire_date: '{{ lookup(''pipe'', ''date -u
        --date="today + 10 days" +%Y%m%d000000Z'') }}'

          - name: Show expire date
            ansible.builtin.debug:
              msg: "{{ expire_date }}"

          - name: Show user info
            debug:
              msg: "{{ user_show.results |
        json_query('[*].json.result.result.{uid: uid[0], pwdchg:
        krblastpwdchange[0].__datetime__}') }}"

        Thanks,
        Harry
        On Friday, February 23, 2024 at 1:58:04 PM UTC-5 Todd Lewis
        wrote:

            Without showing us the expression you used in your
            debug's "msg:", this doesn't tell us anything.


            On 2/23/24 1:05 PM, [email protected] wrote:
            Looks OK to me:

            TASK [Show user info]
            
**************************************************************************************************************************************************************************************
            ok: [localhost] => {
                "msg": [
                    {
                        "pwdchg": "20210416141027Z",
                        "uid": "user1"
                    }
                ]
            }


            Thanks,
            Harry
            On Friday, February 23, 2024 at 12:13:07 PM UTC-5 Rowe,
            Walter P. (Fed) wrote:

                {{ user_show.results |
                json_query('[*].json.result.result.{uid: uid[0],
                pwdchg: krblastpwdchange[0].__datetime__}') }}

                I would display this info in a debug to see what the
                resulting data stream looks like. Maybe the
                selectattr('pwdchg') is in inaccurate reference to
                pwdchg?


                Walter
                --
                Walter Rowe, Division Chief
                Infrastructure Services Division
                Mobile: 202.355.4123 <tel:(202)%20355-4123>
                On Feb 23, 2024, at 12:09 PM, [email protected]
                <[email protected]> wrote:

                Just pull out those fields from the returned user
                information.  I use that in 2 or 3 other playbooks
                so I know that it works.

                Thanks,
                Harry

                On Friday, February 23, 2024 at 11:53:04 AM UTC-5
                Rowe, Walter P. (Fed) wrote:

                    pwd_expire_soon: "{{ user_show.results |
                    json_query('[*].json.result.result.{uid:
                    uid[0], pwdchg:
                    krblastpwdchange[0].__datetime__}') |
                    selectattr('pwdchg', 'lessthan', 'expire_date')
                    | list }}"

                    What are you expecting this red portion to do?
                    I don't think it is valid in json_query.

                    Walter
                    --
                    Walter Rowe, Division Chief
                    Infrastructure Services Division
                    Mobile: 202.355.4123 <tel:(202)%20355-4123>

                    On Feb 23, 2024, at 11:30 AM,
                    [email protected] <[email protected]> wrote:

                    I am trying to determine when user's
                    password's are going to expire in the next 10
                    days.  After I traverse my FreeIPA users and
                    store those users into a variable, I try to
                    set a fact like so:
                      - name: Find users who's password will
                    expire in the next 10 days
                        set_fact:
                    pwd_expire_soon: "{{ user_show.results |
                    json_query('[*].json.result.result.{uid:
                    uid[0], pwdchg:
                    krblastpwdchange[0].__datetime__}') |
                    selectattr('pwdchg', 'lessthan',
                    'expire_date') | list }}"

                    When I run my playbook, I get the following error:

                    fatal: [localhost]: FAILED! => {"msg":
                    "Unexpected templating type error occurred on
                    ({{ user_show.results |
                    json_query('[*].json.result.result.{uid:
                    uid[0], pwdchg:
                    krblastpwdchange[0].__datetime__}') |
                    selectattr('pwdchg', 'lessthan',
                    'expire_date') | list }}): '<' not supported
                    between instances of 'NoneType' and 'str'. '<'
                    not supported between instances of 'NoneType'
                    and 'str'"}

                    I can't seem to find what the issue is.  I
                    originally had '<' instead of 'lessthan' but
                    got the same error. Any ideas?

                    Thanks,
                    Harry

-- You received this message because you are
                    subscribed to the Google Groups "Ansible
                    Project" group.
                    To unsubscribe from this group and stop
                    receiving emails from it, send an email to
                    [email protected].
                    To view this discussion on the web visit
                    
https://groups.google.com/d/msgid/ansible-project/a1131cb0-bc23-46bb-afbf-ca9ad6f4ce34n%40googlegroups.com
                    
<https://groups.google.com/d/msgid/ansible-project/a1131cb0-bc23-46bb-afbf-ca9ad6f4ce34n%40googlegroups.com?utm_medium=email&utm_source=footer>.


-- You received this message because you are
                subscribed to the Google Groups "Ansible Project"
                group.
                To unsubscribe from this group and stop receiving
                emails from it, send an email to
                [email protected].
                To view this discussion on the web visit
                
https://groups.google.com/d/msgid/ansible-project/c0b4de3d-50e2-4fff-85b1-0437076137dcn%40googlegroups.com
                
<https://groups.google.com/d/msgid/ansible-project/c0b4de3d-50e2-4fff-85b1-0437076137dcn%40googlegroups.com?utm_medium=email&utm_source=footer>.

-- You received this message because you are subscribed to
            the Google Groups "Ansible Project" group.
            To unsubscribe from this group and stop receiving emails
            from it, send an email to [email protected].
            To view this discussion on the web visit
            
https://groups.google.com/d/msgid/ansible-project/f76c158f-1107-4d10-8977-12638128d056n%40googlegroups.com
            
<https://groups.google.com/d/msgid/ansible-project/f76c158f-1107-4d10-8977-12638128d056n%40googlegroups.com?utm_medium=email&utm_source=footer>.

-- Todd

-- You received this message because you are subscribed to the
        Google Groups "Ansible Project" group.
        To unsubscribe from this group and stop receiving emails from
        it, send an email to [email protected].
        To view this discussion on the web visit
        
https://groups.google.com/d/msgid/ansible-project/6c29210e-e854-414c-9007-13c37edb3265n%40googlegroups.com
        
<https://groups.google.com/d/msgid/ansible-project/6c29210e-e854-414c-9007-13c37edb3265n%40googlegroups.com?utm_medium=email&utm_source=footer>.

-- Todd

--
You received this message because you are subscribed to the Google Groups "Ansible Project" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/11a5adb1-a9ff-4e30-93ec-ab7b44488c04n%40googlegroups.com <https://groups.google.com/d/msgid/ansible-project/11a5adb1-a9ff-4e30-93ec-ab7b44488c04n%40googlegroups.com?utm_medium=email&utm_source=footer>.

--
Todd

--
You received this message because you are subscribed to the Google Groups "Ansible 
Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/9a3c8e3c-1c74-4c1f-a65a-984c324b1701%40gmail.com.

Reply via email to