So after I sent that, i did some more playing around, and I think I have 
what I need for now.  I'm setting multiple facts in 1 fact as follows:

  - name: Set user_show fact
    set_fact:
      users:
      - "{{ user_show.results[0].json.result.result.uid[0] }}"
      - "{{ 
(user_show.results[0].json.result.result.krbpasswordexpiration[0]['__datetime__']
 
| to_datetime('%Y%m%d%H%M%SZ')).strftime('%s') }}"
      - "{{ (ansible_date_time.epoch|int - 
((user_show.results[0].json.result.result.krbpasswordexpiration[0]['__datetime__']
 
| to_datetime('%Y%m%d%H%M%SZ')).strftime('%s'))|int) / (60*60*24) }}"

  - name: Print users fact
    debug:
      msg: "{{ users[0] }} : {{ users[1] }} : age={{ users[2] }}"

When the playbook runs, I get:

TASK [Print users fact] 
***********************************************************************************************************
ok: [auth1.secure-ose.faa.gov] => {
    "msg": "harry.devine : 1645410190 : age=-75.3984606481"
}

I think from here I should be able to loop through that list, and start 
making a new fact list for anyone who's password age is >= 180.

Thanks,
Harry

On Tuesday, December 7, 2021 at 12:05:54 PM UTC-5 [email protected] wrote:

> > When I print out user_show…
>
> Can you please show your step where you print out `user_show` (presumably 
> a debug step), and all relevant parts of its output. "Relevant parts" would 
> include any `[` or `{` characters, i.e. anything showing the context of 
> "krbpasswordexpiration" in the registered data, as well as the step header 
> (host and asterisks). Thanks.
>
> On Tuesday, December 7, 2021 at 11:24:36 AM UTC-5 [email protected] wrote:
>
>> OK, so that works, but I'm still having issues with referencing.  So I'm 
>> using user_find from the IPA API using the uri module.  I get the user 
>> account info correctly as follows:
>>
>> user_find.json.result.result returns:
>>                 "result": [
>>                     {
>>                         "dn": 
>> "uid=harry.devine,cn=users,cn=accounts,dc=example,dc=com",
>>                         "gidnumber": [
>>                             "10000"
>>                         ],
>>                         "givenname": [
>>                             "Harry"
>>                         ],
>>                         "homedirectory": [
>>                             "/home/harry.devine"
>>                         ],
>>                         "krbcanonicalname": [
>>                             "[email protected]"
>>                         ],
>>                         "krbprincipalname": [
>>                             "[email protected]"
>>                         ],
>>                         "loginshell": [
>>                             "/bin/bash"
>>                         ],
>>                         "mail": [
>>                             "[email protected]"
>>                         ],
>>                         "nsaccountlock": false,
>>                         "sn": [
>>                             "Devine"
>>                         ],
>>                         "telephonenumber": [
>>                             "(xxx)yyy-zzzz"
>>                         ],
>>                         "uid": [
>>                             "harry.devine"
>>                         ],
>>                         "uidnumber": [
>>                             "1111"
>>                         ]
>>                     }
>>
>> I then set the fact to pull out the user ID:
>>
>>   - name: Set fact for users
>>     set_fact:
>>       uid: "{{ user_find.json.result.result|map(attribute='uid')|flatten 
>> }}"
>>
>> then use that fact into the url module using the IPA API user_show.  When 
>> I print out user_show, I get the following (I left out most of the user 
>> information as it's redundant):
>>
>>         "krbpasswordexpiration": [
>>             {
>>                 "__datetime__": "20220220212310Z"
>>             }
>>
>> So when I print out the password expiration, I can reference it 
>> using 
>> user_show.results[0].json.result.result.krbpasswordexpiration[0]['__datetime__'].
>>   
>> But when I try to set a fact with that information, I get an error that 
>> says that krbpasswordexpiration doesn't exist.  Here's that set_fact:
>>
>>   - name: Set fact for password expirations
>>     set_fact:
>>       pwdexpires: "{{ 
>> user_show.results[0].json.result.result|map(attribute='krbpasswordexpiration')
>>  
>> | flatten }}"
>>
>>
>> What I'm hoping to get to is:
>> 1) Find all users and set the uid fact
>> 2) Loop through those uid values and call user_show so I can retrieve 
>> each user's password expiration
>> 3) Determine if their password has expired more than 180 days
>> 4) Create a list of users to disable
>> 5) Loop through that list and disable each user
>> 6) Email each user to inform them of the disable
>>
>> So I have 1 and 2 working, but transitioning to 3 using both facts (uid 
>> and pwdexpires) is what's giving me trouble.  Any thoughts/ideas on how to 
>> accomplish the retrieval of the password expiration and have it in a fact?  
>> Or, maybe the better question is: can I have a fact with more than one 
>> value in it: 1 for uid and 1 for password expiration?  I already know the 
>> uid via the result of user_show, so I should be able to pull out both 
>> values, but how?
>>
>> Thanks, and sorry for the long-winded explanation.  Just trying to be as 
>> thorough and complete with you all.
>> Harry
>>
>> On Friday, December 3, 2021 at 7:27:21 PM UTC-5 [email protected] wrote:
>>
>>> On Sat, 4 Dec 2021 at 09:08, Todd Lewis <[email protected]> wrote:
>>>
>>>> I don't see where you're setting uid, the debug step, or its output. 
>>>> All I see is that
>>>>
>>>>    loop:
>>>>      - "{{ uid }}"
>>>>
>>>> is only producing one invocation of the task with the desired values 
>>>> all glommed into one string.
>>>> Please show your input code and resulting output. I suspect you're 
>>>> somehow producing a string rather than a list, but with nothing to look 
>>>> at, 
>>>> it's hard to know.
>>>>
>>>
>>> Hi Harry, as Todd mentioned it looks like you might be expecting uid 
>>> there (and user_find.json.result.result from your first example) to be a 
>>> list? (It's printing like one.)
>>>
>>> If so, i could be wrong but you probably don't need to reference the 
>>> variable inside a list like this:
>>>
>>> loop:
>>>   - "{{ uid }}"
>>>
>>> Just reference the variable directly like this (as it's already a list).
>>>
>>> loop: "{{ uid }}"
>>>
>>> Otherwise Ansible is looping through the list and rendering the first 
>>> entry as a string (but you want that to be the list).
>>>
>>> For example, here's a playbook crafted similarly to yours:
>>>
>>> ---
>>> - hosts: all
>>>   gather_facts: no
>>>   vars:
>>>     mylist:
>>>       - one
>>>       - two
>>>   tasks:
>>>     - debug:
>>>         msg: "{{ item }}"
>>>       loop:
>>>         - "{{ mylist }}"
>>>
>>> If I execute that, I get one result (printing out the list, like you 
>>> did):
>>>
>>> TASK [debug] 
>>> *************************************************************************************************************************************************
>>> ok: [localhost] => (item=['one', 'two']) => {
>>>     "msg": [
>>>         "one",
>>>         "two"
>>>     ]
>>> }
>>>
>>> However if the variable is referenced like this:
>>>
>>> ---
>>> - hosts: all
>>>   gather_facts: no
>>>   vars:
>>>     mylist:
>>>       - one
>>>       - two
>>>   tasks:
>>>     - debug:
>>>         msg: "{{ item }}"
>>>       loop: "{{ mylist }}"
>>>
>>> Then I get what I expected, two results one for each item in the list:
>>>
>>> TASK [debug] 
>>> *************************************************************************************************************************************************
>>> ok: [localhost] => (item=one) => {
>>>     "msg": "one"
>>> }
>>> ok: [localhost] => (item=two) => {
>>>     "msg": "two"
>>> }
>>>
>>> Hopefully that helps.
>>>
>>> Thanks,
>>> -c
>>>
>>>
>>> On Friday, December 3, 2021 at 4:32:01 PM UTC-5 [email protected] wrote:
>>>>
>>>>> That works, but when I try to then call the IPA user_show API, which 
>>>>> takes the UID as a parameter, the entire list generated is sent in.
>>>>>
>>>>>   - name: Run user_show from IDM API using previously stored session 
>>>>> cookie
>>>>>     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 }}"
>>>>>
>>>>> TASK [Run user_show from IDM API using previously stored session 
>>>>> cookie] 
>>>>> *************************************************************************
>>>>> ok: [localhost] => (item=[u'user1', u'user2', u'user3'])
>>>>>
>>>>>
>>>>>                 "invocation": {
>>>>>                     "module_args": {
>>>>>                         "attributes": null,
>>>>>                         "backup": null,
>>>>>                         "body": {
>>>>>                             "method": "user_show",
>>>>>                             "params": [
>>>>>                                 [
>>>>>                                     "[u'user1', u'user2', u'user3']"
>>>>> ],
>>>>>                                 {
>>>>>                                     "all": true,
>>>>>                                     "version": "2.237"
>>>>>                                 }
>>>>>                             ]
>>>>>                         },
>>>>>
>>>>> "message": "[u'user1', u'user2', u'user3']: user not found
>>>>>
>>>>> So, why does the debug print appear to print each UID out, but when I 
>>>>> try to reference them in the loop, they are sent over as 1 big string?
>>>>>
>>>>> Thanks,
>>>>> Harry
>>>>> On Friday, December 3, 2021 at 4:17:14 PM UTC-5 [email protected] 
>>>>> wrote:
>>>>>
>>>>>> I really want to love Ansible, but the fact that such a simple data 
>>>>>> manipulation completely eludes the newbie doesn't help. Worse, that I've 
>>>>>> done this (or equivalent) dozens of times and it still takes me as long 
>>>>>> as 
>>>>>> it does to come up with a working demo ... [sigh].
>>>>>>
>>>>>> Anyway, here's a working demo, assuming I got your initial data 
>>>>>> shaped right. Good luck.
>>>>>>
>>>>>> ---
>>>>>> - name: Demo for processing user_find IPA API results
>>>>>>   hosts: localhost
>>>>>>   vars:
>>>>>>     user_find:
>>>>>>       json:
>>>>>>         result:
>>>>>>           result:
>>>>>>             - dn: 
>>>>>> "uid=harry.devine,cn=users,cn=accounts,dc=example,dc=com"
>>>>>>               gidnumber: [ "11111" ]
>>>>>>               givenname: [ "Harry" ]
>>>>>>               homedirectory: [ "/home/harry.devine" ]
>>>>>>               krbcanonicalname: [ "[email protected]" ]
>>>>>>               krbprincipalname: [ "[email protected]" ]
>>>>>>               loginshell: [ "/bin/bash" ]
>>>>>>               mail: [ "[email protected]" ]
>>>>>>               nsaccountlock: false
>>>>>>               sn: [ "Devine" ]
>>>>>>               telephonenumber: [ "(800) 867-5309" ]
>>>>>>               uid: [ "harry.devine" ]
>>>>>>               uidnumber: [ "1111" ]
>>>>>>             - dn: 
>>>>>> "uid=marve.devine,cn=users,cn=accounts,dc=example,dc=com"
>>>>>>               gidnumber: [ "11111" ]
>>>>>>               givenname: [ "Marve" ]
>>>>>>               homedirectory: [ "/home/marve.devine" ]
>>>>>>               krbcanonicalname: [ "[email protected]" ]
>>>>>>               krbprincipalname: [ "[email protected]" ]
>>>>>>               loginshell: [ "/bin/bash" ]
>>>>>>               mail: [ "[email protected]" ]
>>>>>>               nsaccountlock: false
>>>>>>               sn: [ "Devine" ]
>>>>>>               telephonenumber: [ "(800) 867-5309" ]
>>>>>>               uid: [ "marve.devine" ]
>>>>>>               uidnumber: [ "1111" ]
>>>>>>
>>>>>>   tasks:
>>>>>>     - name: Look at user_find.json.result.result
>>>>>>       debug:
>>>>>>         msg: "{{ user_find.json.result.result | to_json }}"
>>>>>>
>>>>>>     - name: Stash the uids with set_fact
>>>>>>       set_fact:
>>>>>>         demo_uids: "{{ 
>>>>>> user_find.json.result.result|map(attribute='uid')|flatten }}"
>>>>>>
>>>>>>     - name: Look at our set fact
>>>>>>       debug:
>>>>>>         msg: "{{ demo_uids }}"
>>>>>>
>>>>>>     - name: Or just loop over directly; no need to do a set_fact
>>>>>>       debug:
>>>>>>         msg: "{{ item }}"
>>>>>>       loop: "{{ 
>>>>>> user_find.json.result.result|map(attribute='uid')|flatten }}"
>>>>>>
>>>>>>
>>>>>> On Friday, December 3, 2021 at 12:01:14 PM UTC-5 [email protected] 
>>>>>> wrote:
>>>>>>
>>>>>>> So I'm still trying to get this to work.  I'm thinking that the fact 
>>>>>>> is one large item, so I need to know how I can loop through those 
>>>>>>> items.  
>>>>>>> I'm trying to get the UID of each user.  What the user_find IPA API 
>>>>>>> call 
>>>>>>> returns is <variable>.json.result.result, and the users are added to 
>>>>>>> the 
>>>>>>> fact in the following form:
>>>>>>>
>>>>>>> - [ user1 ]\n
>>>>>>> - [ user2 ]\n
>>>>>>>
>>>>>>> I'm setting the user_find variable and fact as follows:
>>>>>>>
>>>>>>>   - name: Run user_find from IDM API using previously stored session 
>>>>>>> cookie
>>>>>>>     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 fact for users
>>>>>>>     set_fact:
>>>>>>>       uid: "{{ user_find.json.result.result|json_query('[*].uid') | 
>>>>>>> list | to_yaml }}"
>>>>>>>
>>>>>>> The user_find information is listed earlier in this thread.  So I'm 
>>>>>>> trying to got through that variable and pull out each UID.  Without the 
>>>>>>> to_yaml filter, those are shown as ["user1"], ["user2"], etc.  So how 
>>>>>>> do I 
>>>>>>> loop through these?  Can I set up the fact as an array of user IDs and 
>>>>>>> loop 
>>>>>>> through that?  If so, how?
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Harry
>>>>>>> On Tuesday, November 30, 2021 at 8:26:48 AM UTC-5 [email protected] 
>>>>>>> wrote:
>>>>>>>
>>>>>>>> I had done that previously and knew it was getting the right data, 
>>>>>>>> but I put the debug back in and the redacted output is below.  There 
>>>>>>>> are 
>>>>>>>> over 1600 users, so I am only showing the start of the data in a 
>>>>>>>> redacted 
>>>>>>>> form.  The debug print is printing "{{ user_find.json.result.result 
>>>>>>>> }}":
>>>>>>>>
>>>>>>>> TASK [Print users found] 
>>>>>>>> **********************************************************************************************************
>>>>>>>> ok: [auth1.secure-ose.faa.gov] => {
>>>>>>>>     "msg": [
>>>>>>>>         {
>>>>>>>>             "dn": 
>>>>>>>> "uid=harry.devine,cn=users,cn=accounts,dc=example,dc=com",
>>>>>>>>             "gidnumber": [
>>>>>>>>                 "11111"
>>>>>>>>             ],
>>>>>>>>             "givenname": [
>>>>>>>>                 "Harry"
>>>>>>>>             ],
>>>>>>>>             "homedirectory": [
>>>>>>>>                 "/home/harry.devine"
>>>>>>>>             ],
>>>>>>>>             "krbcanonicalname": [
>>>>>>>>                 "[email protected]"
>>>>>>>>             ],
>>>>>>>>             "krbprincipalname": [
>>>>>>>>                 "[email protected]"
>>>>>>>>             ],
>>>>>>>>             "loginshell": [
>>>>>>>>                 "/bin/bash"
>>>>>>>>             ],
>>>>>>>>             "mail": [
>>>>>>>>                 "[email protected]"
>>>>>>>>             ],
>>>>>>>>             "nsaccountlock": false,
>>>>>>>>             "sn": [
>>>>>>>>                 "Devine"
>>>>>>>>             ],
>>>>>>>>             "telephonenumber": [
>>>>>>>>                 "(800) 867-5309"
>>>>>>>>             ],
>>>>>>>>             "uid": [
>>>>>>>>                 "harry.devine"
>>>>>>>>             ],
>>>>>>>>             "uidnumber": [
>>>>>>>>                 "1111"
>>>>>>>>             ]
>>>>>>>>         },
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Harry
>>>>>>>>
>>>>>>>> On Monday, November 29, 2021 at 3:45:46 PM UTC-5 [email protected] 
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> Before the step that's failing, insert a debug step with the msg: 
>>>>>>>>> "{{ user_find.json.result.result }}" (really? "result.result"? 
>>>>>>>>> maybe...) so you (and we) can be certain what your items actually 
>>>>>>>>> look 
>>>>>>>>> like. Otherwise, we're just guessing.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Monday, November 29, 2021 at 3:05:37 PM UTC-5 [email protected] 
>>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>>> I am traversing our IPA server to get find all users, then I want 
>>>>>>>>>> to loop through all of them to get their password expiration date.  
>>>>>>>>>> I use 
>>>>>>>>>> the IPA API via the uri module and register the variable, but no 
>>>>>>>>>> matter 
>>>>>>>>>> what I try to access the uid of each found user, I get the following 
>>>>>>>>>> error:
>>>>>>>>>>
>>>>>>>>>> TASK [Run user_show from IDM API using previously stored session 
>>>>>>>>>> cookie] **********************************************************
>>>>>>>>>> fatal: [localhost]: FAILED! => {"msg": "template error while 
>>>>>>>>>> templating string: expected name or number. String: {\"method\": 
>>>>>>>>>> \"user_show\",\"params\": [[ \"{{ item[0].['uid'] }}\"],{\"all\": 
>>>>>>>>>> true,\"version\": \"{{ api_vers }}\"}]}"}
>>>>>>>>>>
>>>>>>>>>> Here's the section of my playbook that seems to be giving me 
>>>>>>>>>> issues:
>>>>>>>>>>
>>>>>>>>>>   - name: Run user_find from IDM API using previously stored 
>>>>>>>>>> session cookie
>>>>>>>>>>     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 }}\"}]}"
>>>>>>>>>>     register: user_find
>>>>>>>>>>
>>>>>>>>>>   - name: Run user_show from IDM API using previously stored 
>>>>>>>>>> session cookie
>>>>>>>>>>     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[0].['uid'] }}\"],{\"all\": true,\"version\": \"{{ api_vers 
>>>>>>>>>> }}\"}]}"
>>>>>>>>>>     register: user_show
>>>>>>>>>>     loop:
>>>>>>>>>>     - "{{ user_find.json.result.result }}"
>>>>>>>>>>
>>>>>>>>>> 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/9471f1af-012a-4f81-bdf0-00eac932b90an%40googlegroups.com
>>>>  
>>>> <https://groups.google.com/d/msgid/ansible-project/9471f1af-012a-4f81-bdf0-00eac932b90an%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/9f85949f-2522-4f20-ad11-43fd7fdd7274n%40googlegroups.com.

Reply via email to