{# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at https://securityonion.net/license; you may not use this file except in compliance with the Elastic License 2.0. #} {# USED TO GENERATE PILLAR/KAFKA/NODES.SLS. #} {% import_yaml 'kafka/defaults.yaml' as KAFKADEFAULTS %} {% from 'vars/globals.map.jinja' import GLOBALS %} {% set process_x_roles = KAFKADEFAULTS.kafka.config.broker.process_x_roles %} {% set current_kafkanodes = salt.saltutil.runner( 'mine.get', tgt='G@role:so-manager or G@role:so-managersearch or G@role:so-standalone or G@role:so-receiver', fun='network.ip_addrs', tgt_type='compound') %} {% set STORED_KAFKANODES = salt['pillar.get']('kafka:nodes', default=None) %} {% set existing_ids = [] %} {# Check STORED_KAFKANODES for existing kafka nodes and pull their IDs so they are not reused across the grid #} {% if STORED_KAFKANODES != none %} {% for node, values in STORED_KAFKANODES.items() %} {% if values.get('nodeid') %} {% do existing_ids.append(values['nodeid']) %} {% endif %} {% endfor %} {% endif %} {# Create list of possible node ids #} {% set all_possible_ids = range(1, 65536)|list %} {# Create list of available node ids by looping through all_possible_ids and ensuring it isn't in existing_ids #} {% set available_ids = [] %} {% for id in all_possible_ids %} {% if id not in existing_ids %} {% do available_ids.append(id) %} {% endif %} {% endfor %} {# Collect kafka eligible nodes and check if they're already in STORED_KAFKANODES to avoid potentially reassigning a nodeid #} {% set NEW_KAFKANODES = {} %} {% for minionid, ip in current_kafkanodes.items() %} {% set hostname = minionid.split('_')[0] %} {# Override the default process_x_roles for manager and set to 'broker,controller'. Changes from SOC UI will overwrite this #} {% if hostname == GLOBALS.manager %} {% set process_x_roles = 'broker,controller' %} {% endif %} {% if STORED_KAFKANODES != none and hostname not in STORED_KAFKANODES.items() %} {% set new_id = available_ids.pop(0) %} {% do NEW_KAFKANODES.update({hostname: {'nodeid': new_id, 'ip': ip[0], 'role': process_x_roles }}) %} {% endif %} {% if hostname not in NEW_KAFKANODES.items() %} {% set new_id = available_ids.pop(0) %} {% do NEW_KAFKANODES.update({hostname: {'nodeid': new_id, 'ip': ip[0], 'role': process_x_roles }}) %} {% endif %} {% endfor %} {# Combine STORED_KAFKANODES and NEW_KAFKANODES for writing to the pillar/kafka/nodes.sls #} {% set COMBINED_KAFKANODES = {} %} {% for node, details in NEW_KAFKANODES.items() %} {% do COMBINED_KAFKANODES.update({node: details}) %} {% endfor %} {% if STORED_KAFKANODES != none %} {% for node, details in STORED_KAFKANODES.items() %} {% do COMBINED_KAFKANODES.update({node: details}) %} {% endfor %} {% endif %}