Stripping YAML dashes from output

I have a playbook where I am traversing our FreeIPA server and pulling out each user’s email address. I’m then putting that data into a text file using the template module:

  • name: Set User Email fact
    set_fact:
    user_list: “{{ user_find.json.result | json_query(‘result.mail’) | list | to_nice_yaml }}”

  • name: Prepare report
    template:
    src: /root/emails.txt.j2
    dest: /root/emails.txt
    delegate_to: localhost
    run_once: true

The j2 template:

User Emails:

Date generated: {{ now(false, ‘%m/%d/%Y %I:%M:%S’) }}
{{ user_list }}

This returns the following in the text file:

User Emails:

Date generated: 11/12/2020 09:40:26

How can I strip out the preceding dashes?

Thanks,
Harry

I have a playbook where I am traversing our FreeIPA server and pulling out each user's email address. I'm then putting
that data into a text file using the template module:

- name: Set User Email fact
set_fact:
user_list: "{{ user_find.json.result | json_query('result.mail') | list | to_nice_yaml }}"

- name: Prepare report
template:
src: /root/emails.txt.j2
dest: /root/emails.txt
delegate_to: localhost
run_once: true

The j2 template:

User Emails:

Date generated: {{ now(false, '%m/%d/%Y %I:%M:%S') }}
{{ user_list }}

This returns the following in the text file:

User Emails:

Date generated: 11/12/2020 09:40:26
- - user1@example.com
- - user2@example.com

How can I strip out the preceding dashes?

Please post a sample of the JSON in user_find.json.result.

Regards
         Racke

Here’s a subset of user_find.json.result:

TASK [Print user_find] *****************************************************************************************************************************************
ok: [localhost] => {
“msg”: {
“count”: 1826,
“result”: [
{
“dn”: “uid=harry.devine,cn=users,cn=example,dc=com”,
“gidnumber”: [
“99999”
],
“givenname”: [
“Harry”
],
“homedirectory”: [
“/home/harry.devine”
],
“krbcanonicalname”: [
harry.devine@EXAMPLE.COM
],
“krbprincipalname”: [
harry.devine@EXAMPLE.COM
],
“loginshell”: [
“/bin/bash”
],
“mail”: [
harry.devine@example.com
],
“nsaccountlock”: false,
“sn”: [
“Devine”
],
“telephonenumber”: [
“(609) 867-5309”
],
“uid”: [
“harry.devine”
],
“uidnumber”: [
“1000”
]
},
}
],
“summary”: “1826 users matched”,
“truncated”: false
}

Thanks,
Harry

that appears to be mutilated, can you post a longer piece so the
iteration structure is intact ?

There are over 1800 users. That’s alot of data for me to redact. How much longer of a sample would you like to see?

Harry

At least something that is valid json with at least two iterations
should be welcome.

Hope this works and helps:

TASK [Print user_find] *****************************************************************************************************************************************
ok: [localhost] => {
“msg”: {
“cache_control”: “no-cache, private”,
“changed”: false,
“connection”: “close”,
“content_security_policy”: “frame-ancestors ‘none’”,
“content_type”: “application/json; charset=utf-8”,
“cookies”: {},
“cookies_string”: “”,
“date”: “Fri, 13 Nov 2020 15:41:31 GMT”,
“elapsed”: 2,
“failed”: false,
“json”: {
“error”: null,
“id”: null,
“principal”: “admin@EXAMPLE.COM”,
“result”: {
“count”: 1822,
“result”: [
{
“dn”: “uid=user1,cn=users,cn=accounts,dc=example,dc=com”,
“gidnumber”: [
“10000”
],
“givenname”: [
“User1”
],
“homedirectory”: [
“/home/user1”
],
“krbcanonicalname”: [
user1@EXAMPLE.COM
],
“krbprincipalname”: [
user1@EXAMPLE.COM
],
“loginshell”: [
“/bin/bash”
],
“mail”: [
user1@example.com
],
“nsaccountlock”: false,
“sn”: [
“User”
],
“telephonenumber”: [
“(555) 555-5555”
],
“uid”: [
“user1”
],
“uidnumber”: [
“1111”
]
},
{
“dn”: “uid=user2,cn=users,cn=accounts,dc=example,dc=com”,
“gidnumber”: [
“10000”
],
“givenname”: [
“User2”
],
“homedirectory”: [
“/home/user2”
],
“krbcanonicalname”: [
user2@EXAMPLE.COM
],
“krbprincipalname”: [
user2@EXAMPLE.COM
],
“loginshell”: [
“/bin/bash”
],
“mail”: [
user2@example.com
],
“nsaccountlock”: false,
“sn”: [
“User”
],
“telephonenumber”: [
“(555)555-5556”
],
“uid”: [
“user2”
],
“uidnumber”: [
“2222”
]
},
}
],
“summary”: “1822 users matched”,
“truncated”: false
},
“version”: “4.6.8”
},
“msg”: “OK (unknown bytes)”,
“redirected”: false,
“server”: “Apache/2.4.6 (Red Hat Enterprise Linux) mod_auth_gssapi/1.5.1 mod_nss/1.0.14 NSS/3.28.4 mod_wsgi/3.4 Python/2.7.5”,
“status”: 200,
“transfer_encoding”: “chunked”,
“url”: “https://auth.example.com/ipa/session/json”,
“vary”: “Accept-Encoding”,
“x_frame_options”: “DENY”
}
}

Thanks,
Harry

Try adding a pipe expression to the query, and leave out the
'list|to_nice_yaml':

set_fact:
  user_list: "{{ user_find.json.result | json_query('result.mail') }}"

Dick

So now I’m getting this:

User Emails:

Date generated: 11/13/2020 11:23:32
[u’user1@example.com’, u’user2@example.com’]

Harry

This is a simple list, which is what you wanted.

So how do I get rid of the u? What I ultimately wanted was JUST the email addresses.

Harry

So how do I get rid of the u? What I ultimately wanted was JUST the email addresses.

Harry

Join the list members into a string: | join('\n')

Regards
         Racke

Perfect! Exactly what I needed. Ultimately I’d like to figure out how to add a semicolon after each entry, then separate them into batches of 500 emails each, but I can worry about that later. This works for now.

Thanks
Harry

Ultimately I’d like to figure out how to add a semicolon after each entry,

This should do that; join with a semicolon not a newline: | join('; ')

then separate them into batches of 500 emails each

Since you have the list already, you could use a for loop with an if test to insert a new-line to get the batches:

This should work assuming your full list of addresses is in list_of_addresses:

{% for email_item in list_of_addresses %}{{ email_item }}{% if loop.index is divisibleby 500 %}{{ ‘\n’ -}}{% else %};{% endif %}{% endfor %}
(note, all on one line)

All you need to do is replace the list_of_addresses with your YAML list of addresses and you should get your list broken into 500 element lines.

You can check your Jinja syntax by using this site: https://cryptic-cliffs-32040.herokuapp.com/

Ultimately I'd like to figure out how to add a semicolon after each entry,

This should do that; join with a semicolon not a newline: | join('; ')

then separate them into batches of 500 emails each

Since you have the list already, you could use a `for` loop with an `if` test to insert a new-line to get the batches:

This should work assuming your full list of addresses is in `list_of_addresses`:
{% for email_item in list_of_addresses %}{{ email_item }}{% if loop.index is divisibleby 500 %}{{ '\n' -}}{% else %};{%
endif %}{% endfor %}
(note, all on one line)

All you need to do is replace the `list_of_addresses` with your YAML list of addresses and you should get your list
broken into 500 element lines.

That is indeed a nice piece of Jinja.

Thanks, Dan!

Regards
        Racke

Worked exactly as I wanted/needed! Great tip! I thank everyone for their help on this!

Thanks,
Harry