我有一个 Ansible 任务,用于格式化 VLAN 列表。但是,当我使用多个 fork 运行该任务时,它会导致我的 CPU 使用率长时间飙升至 100%。我该如何优化该任务以降低 CPU 使用率或限制此任务的 CPU 使用率?
原始任务如下:
- name: Fromat VLAN list
ansible.builtin.set_fact:
device_interface_vlans: "{{ dict(key | zip(val)) }}"
vars:
dev_ifc_str: |-
{% for vlan in ansible_facts.napalm_vlans.keys() %}
{% for int in ansible_facts.napalm_vlans[vlan]['interfaces'] %}
- {int: {{ int }}, vlan: {{ nb_vlans | selectattr('vid', 'equalto', vlan | int) | map(attribute='id') | join }}}
{% endfor %}
{% endfor %}
int_vlan: "{{ dev_ifc_str | from_yaml }}"
arr: "{{ int_vlan | groupby('int') }}"
key: "{{ arr | map('first') | list }}"
val: "{{ arr | map('last') |
map('json_query', '[].vlan') |
map('community.general.dict_kv', 'vlans') | list }}"
我已经尝试过 cpulimit,但是它限制的是每个 fork 的 CPU 使用率,而不是全部。
答案1
我通过使用速度更快的 json_query 修复了这个问题:
- ansible.builtin.set_fact:
device_interface_vlans: "{{ dict(key | zip(val)) }}"
vars:
dev_ifc_str: |-
{% for vlan in ansible_facts.napalm_vlans.keys() %}
{% for int in ansible_facts.napalm_vlans[vlan]['interfaces'] %}
- {int: {{ int }}, vlan: {{ nb_vlans | json_query('[?vid == `{}`].id'.format(vlan | int)) | join }}}
{% endfor %}
{% endfor %}
int_vlan: "{{ dev_ifc_str | from_yaml }}"
arr: "{{ int_vlan | groupby('int') }}"
key: "{{ arr | map('first') | list }}"
val: "{{ arr | map('last') |
map('json_query', '[].vlan') |
map('community.general.dict_kv', 'vlans') | list }}"