78 lines
2.1 KiB
ReStructuredText
78 lines
2.1 KiB
ReStructuredText
Counting elements in a sequence
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
The ``community.general.counter`` filter plugin allows you to count (hashable) elements in a sequence. Elements are returned as dictionary keys and their counts are stored as dictionary values.
|
|
|
|
.. code-block:: yaml+jinja
|
|
|
|
- name: Count character occurrences in a string
|
|
debug:
|
|
msg: "{{ 'abccbaabca' | community.general.counter }}"
|
|
|
|
- name: Count items in a list
|
|
debug:
|
|
msg: "{{ ['car', 'car', 'bike', 'plane', 'bike'] | community.general.counter }}"
|
|
|
|
This produces:
|
|
|
|
.. code-block:: ansible-output
|
|
|
|
TASK [Count character occurrences in a string] ********************************************
|
|
ok: [localhost] => {
|
|
"msg": {
|
|
"a": 4,
|
|
"b": 3,
|
|
"c": 3
|
|
}
|
|
}
|
|
|
|
TASK [Count items in a list] **************************************************************
|
|
ok: [localhost] => {
|
|
"msg": {
|
|
"bike": 2,
|
|
"car": 2,
|
|
"plane": 1
|
|
}
|
|
}
|
|
|
|
This plugin is useful for selecting resources based on current allocation:
|
|
|
|
.. code-block:: yaml+jinja
|
|
|
|
- name: Get ID of SCSI controller(s) with less than 4 disks attached and choose the one with the least disks
|
|
debug:
|
|
msg: >-
|
|
{{
|
|
( disks | dict2items | map(attribute='value.adapter') | list
|
|
| community.general.counter | dict2items
|
|
| rejectattr('value', '>=', 4) | sort(attribute='value') | first
|
|
).key
|
|
}}
|
|
vars:
|
|
disks:
|
|
sda:
|
|
adapter: scsi_1
|
|
sdb:
|
|
adapter: scsi_1
|
|
sdc:
|
|
adapter: scsi_1
|
|
sdd:
|
|
adapter: scsi_1
|
|
sde:
|
|
adapter: scsi_2
|
|
sdf:
|
|
adapter: scsi_3
|
|
sdg:
|
|
adapter: scsi_3
|
|
|
|
This produces:
|
|
|
|
.. code-block:: ansible-output
|
|
|
|
TASK [Get ID of SCSI controller(s) with less than 4 disks attached and choose the one with the least disks]
|
|
ok: [localhost] => {
|
|
"msg": "scsi_2"
|
|
}
|
|
|
|
.. versionadded:: 4.3.0
|