I thought there might be a slightly simpler way to achieve this using
community.general.counter.
This is rough but:
tasks:
- name: Append to our count list
ansible.builtin.set_fact:
storage_counter: '{{ storage_counter|default([]) + [ "Servername:"
+ item.servername + "," + item.size + "GB"] }}'
loop: '{{ storage_details_test_capacity }}'
- name: Debug data structure
ansible.builtin.debug:
msg: '{{ storage_counter | community.general.counter }}'
Results in:
TASK [Append to our count list]
******************************************************************************************************************************
ok: [localhost] => (item={'servername': 'server1', 'cap_unit': 'GB',
'size': '10'})
ok: [localhost] => (item={'servername': 'server1', 'cap_unit': 'GB',
'size': '11'})
ok: [localhost] => (item={'servername': 'server1', 'cap_unit': 'GB',
'size': '11'})
ok: [localhost] => (item={'cap_unit': 'GB', 'servername': 'server2',
'size': '12'})
ok: [localhost] => (item={'cap_unit': 'GB', 'servername': 'server2',
'size': '13'})
ok: [localhost] => (item={'cap_unit': 'GB', 'servername': '', 'size': '14'})
ok: [localhost] => (item={'cap_unit': 'GB', 'servername': '', 'size': '14'})
ok: [localhost] => (item={'cap_unit': 'GB', 'servername': '', 'size': '14'})
ok: [localhost] => (item={'cap_unit': 'GB', 'servername': '', 'size': '15'})
TASK [Debug data structure]
**********************************************************************************************************************************
ok: [localhost] => {
"msg": {
"Servername:,14GB": 3,
"Servername:,15GB": 1,
"Servername:server1,10GB": 1,
"Servername:server1,11GB": 2,
"Servername:server2,12GB": 1,
"Servername:server2,13GB": 1
}
}
Which with some additional refinement, might the same thing as Todd's
method but slightly less mind-bending? :D
On Mon, 18 Dec 2023 at 18:00, Todd Lewis <[email protected]> wrote:
> This is the best I've been able to come up with.
> It isn't pretty.
> Usually when I find myself making something this convoluted, I ask myself
> if I'm actually solving more problems than I'm creating.
> Anyway, here's some code. Enjoy.
>
> ---
> # javed01.yml
> - name: Data manipulation tests
> hosts: localhost
> gather_facts: false
> vars:
> storage_details_test_capacity:
> - servername: server1
> cap_unit: GB
> size: "10"
> - servername: server1
> cap_unit: GB
> size: "11"
> - servername: server1
> cap_unit: GB
> size: "11"
> - cap_unit: GB
> servername: server2
> size: "12"
> - cap_unit: GB
> servername: server2
> size: "13"
> - cap_unit: GB
> servername: ""
> size: "14"
> - cap_unit: GB
> servername: ""
> size: "14"
> - cap_unit: GB
> servername: ""
> size: "14"
> - cap_unit: GB
> servername: ""
> size: "15"
> tasks:
> - name: Resolve servernames
> ansible.builtin.set_fact:
> server_names: '{{ storage_details_test_capacity |
> map(attribute="servername") | sort | unique }}'
>
> - name: Combine size and cap_unit ("10" and "GB" become "scu: 10GB")
> ansible.builtin.set_fact:
> scu: |
> {{ storage_details_test_capacity
> | zip(storage_details_test_capacity
> | map(attribute="size")
> | zip( storage_details_test_capacity
> | map(attribute="cap_unit")
> )
> | map("join", "")
> | map("regex_replace", "^(.*)$", '{"scu": "\1"}')
> | map("from_json")
> )
> | map('combine')
> }}
>
> - name: Create table storage_device
> ansible.builtin.set_fact:
> storage_device: |
> {% set sd = [] %}
> {% for sn in server_names %}
> {% set capacity = [] %}
> {% for sc in scu | selectattr('servername', 'eq', sn)
> | map(attribute='scu') | sort | unique %}
> {% set no_of_vols = scu | selectattr('servername', 'eq', sn)
> | selectattr('scu', 'eq', sc) | length %}
> {% set size =(scu | selectattr('servername', 'eq', sn)
> | selectattr('scu', 'eq', sc) | first)['size'] %}
> {% set cap_unit =(scu | selectattr('servername', 'eq', sn)
> | selectattr('scu', 'eq', sc) | first)['cap_unit'] %}
> {% set _ = capacity.append({"no_of_vols": no_of_vols,
> "size": size,
> "cap_unit": cap_unit}) %}
> {% endfor %}
> {% set _ = sd.append({"servername": sn, "capacity": capacity}) %}
> {% endfor %}{{ sd }}
>
>
>
> On 12/18/23 8:37 AM, javed khan Siddque wrote:
>
> I have a input
> "storage_details_test_capacity": [
> {
> "servername": "server1",
> "cap_unit": "GB",
> "size": "10"
> },
> {
> "servername": "server1",
> "cap_unit": "GB",
> "size": "11"
> },
> {
> "servername": "server1",
> "cap_unit": "GB",
> "size": "11"
> },
> {
> "cap_unit": "GB",
> "servername": "server2",
> "size": "12"
> },
> {
> "cap_unit": "GB",
> "servername": "server2",
> "size": "13"
> },
> {
> "cap_unit": "GB",
> "servername": "",
> "size": "14"
> },
> {
> "cap_unit": "GB",
> "servername": "",
> "size": "14"
> },
> {
> "cap_unit": "GB",
> "servername": "",
> "size": "14"
> },
> {
> "cap_unit": "GB",
> "servername": "",
> "size": "15"
> }
> ]
> --------------------------------------------------------
>
>
>
>
>
> => I want generate ' storage_device' variable which give me below data
> [capacity of server with no_of_vols].
> ---------------------------------------------------------
> storage_device:
> - servername: server1
> capacity:
> - no_of_vols: 1 # how many 10 GB for server1
> size: 10
> cap_unit: GB
> - no_of_vols: 2
> size: 11
> cap_unit: GB
> - server: server2
> capacity:
> - no_of_vols: 1 # how many 12 GB for server2
> size: 12
> cap_unit: GB
> - no_of_vols: 1
> size: 13
> cap_unit: GB
> - servername: '' # how many 10 GB for '<blank>'
> capacity:
> - no_of_vols: 3
> size: 14
> cap_unit: GB
> - no_of_vols: 1
> size: 15
> cap_unit: GB
>
> On Monday, December 18, 2023 at 6:56:29 PM UTC+5:30 Will McDonald wrote:
>
>> It's not 100% clear to me from your sample data exactly what you're
>> trying to achieve.
>>
>> Reading between the lines though, for each server, you want to calculate
>> the number of volumes?
>>
>> What do you want to count as a 'volume'? Each block device? Partition?
>> PV? LV? Filesystem? Something else?
>>
>> And do you need to do this using a statically defined var, or is that
>> just illustrative? It's highly likely that you can pull the data you need
>> from setup/facts and calculate the values you need based on that.
>>
>>
>> On Mon, 18 Dec 2023 at 12:56, javed khan Siddque <[email protected]>
>> wrote:
>>
>>> i want to print Data Based On Size In Given Server and generate the
>>> 'no_of_vols'.
>>> storage_device:
>>> - servername: server1
>>> capacity:
>>> - no_of_vols: 1
>>> size: 10
>>> cap_unit: GB
>>> - no_of_vols: 2
>>> size: 11
>>> cap_unit: GB
>>> - server: server2
>>> capacity:
>>> - no_of_vols: 1
>>> size: 12
>>> cap_unit: GB
>>> - no_of_vols: 1
>>> size: 13
>>> cap_unit: GB
>>> - servername: ''
>>> capacity:
>>> - no_of_vols: 3
>>> size: 14
>>> cap_unit: GB
>>> - no_of_vols: 1
>>> size: 15
>>> cap_unit: GB
>>>
>>>
>>> below is my code working till creating epecting list of dictionaries ,
>>> but 'no_of_vols' i am facing issue.
>>>
>>> ---
>>> - name: "This Play To Print Data Based On Size In Given Server"
>>> hosts: localhost
>>> gather_facts: false
>>> vars:
>>> storage_device:
>>> - servername: server1
>>> - servername: server2
>>> "storage_details_test_capacity": [
>>> {
>>> "servername": "server1",
>>> "cap_unit": "GB",
>>> "size": "10"
>>> },
>>> {
>>> "servername": "server1",
>>> "cap_unit": "GB",
>>> "size": "11"
>>> },
>>> {
>>> "servername": "server1",
>>> "cap_unit": "GB",
>>> "size": "11"
>>> },
>>> {
>>> "cap_unit": "GB",
>>> "servername": "server2",
>>> "size": "12"
>>> },
>>> {
>>> "cap_unit": "GB",
>>> "servername": "server2",
>>> "size": "13"
>>> },
>>> {
>>> "cap_unit": "GB",
>>> "servername": "",
>>> "size": "14"
>>> },
>>> {
>>> "cap_unit": "GB",
>>> "servername": "",
>>> "size": "14"
>>> },
>>> {
>>> "cap_unit": "GB",
>>> "servername": "",
>>> "size": "14"
>>> },
>>> {
>>> "cap_unit": "GB",
>>> "servername": "",
>>> "size": "15"
>>> }
>>> ]
>>> tasks:
>>> - name: Populate storage_device list
>>> ansible.builtin.set_fact:
>>> storage_device: "{{ storage_device | default([]) +
>>> [{'servername': item.servername | default(''), 'capacity': [{'size':
>>> item.size | int, 'cap_unit': item.cap_unit}]}] }}"
>>> loop: "{{ storage_details_test_capacity }}"
>>>
>>>
>>> - name: Debug storage_device list
>>> ansible.builtin.debug:
>>> var: storage_device
>>>
>> --
>>> 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/fc1c5e4d-eb2e-4712-b2c1-9ac6f8d2c7aen%40googlegroups.com
>>> <https://groups.google.com/d/msgid/ansible-project/fc1c5e4d-eb2e-4712-b2c1-9ac6f8d2c7aen%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/6a3c2403-b7a5-4dfc-ac3c-e4c64a438fd1n%40googlegroups.com
> <https://groups.google.com/d/msgid/ansible-project/6a3c2403-b7a5-4dfc-ac3c-e4c64a438fd1n%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/09b1ebe9-aace-430f-a7f1-fc63d54ef14c%40gmail.com
> <https://groups.google.com/d/msgid/ansible-project/09b1ebe9-aace-430f-a7f1-fc63d54ef14c%40gmail.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/CAKtKohQv-gwYY8EVDcJ%3DT_y1znN4yLPBKTrG%2BA6UjB7X%3DsDcZA%40mail.gmail.com.