I totally understand where you're coming from.  You guys have always been 
great and extremely helpful, and I appreciate that.  I have adjusted the 
playbook to look at the first 5 users, and the anonymized output is below.

Thanks,
Harry

TASK [Show user info] 
**************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": [
        {
            "pwdchg": null,
            "uid": "user1"
        },
        {
            "pwdchg": "20240124144409Z",
            "uid": "user2"
        },
        {
            "pwdchg": "20231212115535Z",
            "uid": "user3"
        },
        {
            "pwdchg": null,
            "uid": "user4"
        },
        {
            "pwdchg": "20240115133407Z",
            "uid": "user5"
        }
    ]
}

On Monday, February 26, 2024 at 2:14:15 PM UTC-5 Todd Lewis wrote:

> 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"; 
> <https://%7B%7Bidmfqdn%7D%7D/ipa/session/login_password>
>       method: POST
>       headers:
>         Referer: "https://{{idmfqdn}}/ipa"; 
> <https://%7B%7Bidmfqdn%7D%7D/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"; 
> <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": "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"; 
> <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_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"; 
> <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('[: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 <(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 <(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/58fda1ea-1fe7-4608-a7e8-a8c2e1a5001fn%40googlegroups.com.

Reply via email to