network/roles/access/tasks/d-link.yml
Timotej Lazar 7a2223ea71 access: limit OIDs exposed over SNMP
Define a custom SNMP group with read access only to fields we need.

For D-Link switches, modifying the group must be handled the same as
user, i.e. the group (and user) must be removed and readded.

Untested for FS S5800.
2025-10-22 14:27:12 +02:00

68 lines
2.5 KiB
YAML

- name: Get secrets for SNMP manager
set_fact:
manager: '{{ lookup("passwordstore", "host/"+snmp_manager.name, returnall=true, missing="empty") | from_yaml }}'
- name: Generate SNMP passwords
delegate_to: localhost
command: 'snmpv3-hashgen --yaml --user {{ manager.snmp_user }} --auth {{ manager.snmp_pass }} --priv {{ manager.snmp_pass }} --hash sha1 --engine {{ snmp_engine_id }}'
check_mode: false
changed_when: false
register: snmp_config
- name: Get SNMP password hash
set_fact:
snmp_hashes: '{{ (snmp_config.stdout | from_yaml).snmpv3.hashes }}'
# check if the SNMP user and group we want to set differ from current switch config
# in this case we have to remove them before trying to chane password or settings
- name: Define SNMP user and group configuration commands
set_fact:
target_user: "snmp-server user {{ manager.snmp_user }} public v3 encrypted auth sha {{ snmp_hashes.auth }} priv {{ snmp_hashes.priv[:32] }} "
target_group: "snmp-server group public v3 priv read public "
- name: Get existing SNMP user and group entries from switch
set_fact:
current_user: "{{ ansible_net_config | split('\n')
| select('match', '^snmp-server user '+manager.snmp_user+' public v3') }}"
current_group: "{{ ansible_net_config | split('\n')
| select('match', '^snmp-server group public v3') }}"
- name: Check if existing SNMP user and/or group should be removed
set_fact:
remove_user: "{{ current_user and target_user is not in current_user }}"
remove_group: "{{ current_group and target_group is not in current_group }}"
- name: Remove existing SNMP user to reset password
when: remove_user or remove_group # can’t change group with existing users
block:
- name: Remove SNMP user
ansible.netcommon.cli_config:
config: 'no snmp-server user {{ manager.snmp_user }} public v3'
notify: write config
- set_fact:
current_user: false
- name: Remove existing SNMP group to change parameters
when: remove_group
block:
- name: Remove existing SNMP group
ansible.netcommon.cli_config:
config: 'no snmp-server group public v3 priv'
notify: write config
- set_fact:
current_group: false
# create new SNMP user and group
- name: Create SNMP group and user
when: not current_group
ansible.netcommon.cli_config:
config: '{{ target_group }}'
notify: write config
- name: Create SNMP user
when: not current_user
ansible.netcommon.cli_config:
config: '{{ target_user }}'
notify: write config