mirror of
https://github.com/Security-Onion-Solutions/securityonion.git
synced 2025-12-06 09:12:45 +01:00
start of dynamic annotations for hypervisor
This commit is contained in:
@@ -1,62 +1,93 @@
|
|||||||
hypervisor:
|
hypervisor:
|
||||||
nodes: []
|
model:
|
||||||
model1:
|
testModel:
|
||||||
hardware:
|
hardware:
|
||||||
cpu:
|
cpu:
|
||||||
total: 128
|
total: 128
|
||||||
free: 128
|
free: 128
|
||||||
memory:
|
memory:
|
||||||
total: 128
|
total: 128
|
||||||
free: 128
|
free: 128
|
||||||
disks:
|
disks:
|
||||||
free:
|
free:
|
||||||
3: pci_0000_c7_00_0
|
3: pci_0000_c7_00_0
|
||||||
4: pci_0000_c8_00_0
|
4: pci_0000_c8_00_0
|
||||||
claimed:
|
claimed:
|
||||||
1: pci_0000_c5_00_0
|
1: pci_0000_c5_00_0 # hypervisor
|
||||||
2: pci_0000_c6_00_0
|
2: pci_0000_c6_00_0 # hypervisor
|
||||||
copper:
|
copper:
|
||||||
free:
|
free:
|
||||||
1: pci_0000_c4_00_0
|
3: pci_0000_c4_00_0
|
||||||
2: pci_0000_c4_00_1
|
4: pci_0000_c4_00_1
|
||||||
3: pci_0000_c4_00_2
|
5: pci_0000_c4_00_2
|
||||||
4: pci_0000_c4_00_3
|
6: pci_0000_c4_00_3
|
||||||
claimed: {}
|
claimed:
|
||||||
sfp:
|
1: pci_0000_c1_00_0 # hypervisor
|
||||||
free:
|
2: pci_0000_c1_00_1 # hypervisor
|
||||||
5: pci_0000_41_00_0
|
sfp:
|
||||||
6: pci_0000_41_00_1
|
free:
|
||||||
claimed: {}
|
5: pci_0000_02_00_0
|
||||||
model2:
|
6: pci_0000_02_00_1
|
||||||
hardware:
|
7: pci_0000_41_00_0
|
||||||
cpu:
|
8: pci_0000_41_00_1
|
||||||
total: 128
|
claimed: {}
|
||||||
free: 128
|
model1:
|
||||||
memory:
|
hardware:
|
||||||
total: 512
|
cpu:
|
||||||
free: 512
|
total: 128
|
||||||
disks:
|
free: 128
|
||||||
free:
|
memory:
|
||||||
3: pci_0000_c8_00_0
|
total: 128
|
||||||
4: pci_0000_c9_00_0
|
free: 128
|
||||||
5: pci_0000_c10_00_0
|
disks:
|
||||||
6: pci_0000_c11_00_0
|
free:
|
||||||
claimed:
|
3: pci_0000_c7_00_0
|
||||||
1: pci_0000_c6_00_0
|
4: pci_0000_c8_00_0
|
||||||
2: pci_0000_c7_00_0
|
claimed:
|
||||||
copper:
|
1: pci_0000_c5_00_0
|
||||||
free:
|
2: pci_0000_c6_00_0
|
||||||
1: pci_0000_c4_00_0
|
copper:
|
||||||
2: pci_0000_c4_00_1
|
free:
|
||||||
3: pci_0000_c4_00_2
|
1: pci_0000_c4_00_0
|
||||||
4: pci_0000_c4_00_3
|
2: pci_0000_c4_00_1
|
||||||
5: pci_0000_c5_00_0
|
3: pci_0000_c4_00_2
|
||||||
6: pci_0000_c5_00_1
|
4: pci_0000_c4_00_3
|
||||||
7: pci_0000_c5_00_2
|
claimed: {}
|
||||||
8: pci_0000_c5_00_3
|
sfp:
|
||||||
claimed: {}
|
free:
|
||||||
sfp:
|
5: pci_0000_41_00_0
|
||||||
free:
|
6: pci_0000_41_00_1
|
||||||
9: pci_0000_41_00_0
|
claimed: {}
|
||||||
10: pci_0000_41_00_1
|
model2:
|
||||||
claimed: {}
|
hardware:
|
||||||
|
cpu:
|
||||||
|
total: 128
|
||||||
|
free: 128
|
||||||
|
memory:
|
||||||
|
total: 512
|
||||||
|
free: 512
|
||||||
|
disks:
|
||||||
|
free:
|
||||||
|
3: pci_0000_c8_00_0
|
||||||
|
4: pci_0000_c9_00_0
|
||||||
|
5: pci_0000_c10_00_0
|
||||||
|
6: pci_0000_c11_00_0
|
||||||
|
claimed:
|
||||||
|
1: pci_0000_c6_00_0
|
||||||
|
2: pci_0000_c7_00_0
|
||||||
|
copper:
|
||||||
|
free:
|
||||||
|
1: pci_0000_c4_00_0
|
||||||
|
2: pci_0000_c4_00_1
|
||||||
|
3: pci_0000_c4_00_2
|
||||||
|
4: pci_0000_c4_00_3
|
||||||
|
5: pci_0000_c5_00_0
|
||||||
|
6: pci_0000_c5_00_1
|
||||||
|
7: pci_0000_c5_00_2
|
||||||
|
8: pci_0000_c5_00_3
|
||||||
|
claimed: {}
|
||||||
|
sfp:
|
||||||
|
free:
|
||||||
|
9: pci_0000_41_00_0
|
||||||
|
10: pci_0000_41_00_1
|
||||||
|
claimed: {}
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
{% set HYPERVISORHOSTS = salt['pillar.get']('hypervisor:hosts', {}) %}
|
|
||||||
|
|
||||||
{% import_yaml 'setup/virt/sensor.yaml' as SENSOR %}
|
|
||||||
{% import_yaml 'setup/virt/searchnode.yaml' as SEARCHNODE %}
|
|
||||||
|
|
||||||
{% set vars = {
|
|
||||||
'sensor': SENSOR,
|
|
||||||
'searchnode': SEARCHNODE
|
|
||||||
} %}
|
|
||||||
|
|
||||||
{% for host, guestDetails in HYPERVISORHOSTS.items() %}
|
|
||||||
{% if guestDetails['add_guest'] | length > 0 %}
|
|
||||||
{% for newGuest in guestDetails['add_guest'] %}
|
|
||||||
{% set indx = guestDetails['add_guest'].index(newGuest) %}
|
|
||||||
{% do guestDetails['add_guest'].pop(indx) %}
|
|
||||||
{% set NODETYPE = newGuest.split('_') | last %}
|
|
||||||
{% do guestDetails['guests'].update({
|
|
||||||
newGuest: {
|
|
||||||
'cpu': vars[NODETYPE].CPU,
|
|
||||||
'memory': vars[NODETYPE].MEMORY,
|
|
||||||
'disk': vars[NODETYPE].DISKS,
|
|
||||||
'copper': vars[NODETYPE].COPPER,
|
|
||||||
'sfp': vars[NODETYPE].SFP
|
|
||||||
}
|
|
||||||
}) %}
|
|
||||||
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
hypervisor:
|
|
||||||
hardware:
|
|
||||||
cpu:
|
|
||||||
total: 128
|
|
||||||
free: 128
|
|
||||||
memory:
|
|
||||||
total: 128
|
|
||||||
free: 128
|
|
||||||
disks:
|
|
||||||
free:
|
|
||||||
3: pci_0000_c7_00_0
|
|
||||||
4: pci_0000_c8_00_0
|
|
||||||
claimed:
|
|
||||||
1: pci_0000_c5_00_0
|
|
||||||
2: pci_0000_c6_00_0
|
|
||||||
copper:
|
|
||||||
free:
|
|
||||||
1: pci_0000_c4_00_0
|
|
||||||
2: pci_0000_c4_00_1
|
|
||||||
3: pci_0000_c4_00_2
|
|
||||||
4: pci_0000_c4_00_3
|
|
||||||
claimed: {}
|
|
||||||
sfp:
|
|
||||||
free:
|
|
||||||
5: pci_0000_41_00_0
|
|
||||||
6: pci_0000_41_00_1
|
|
||||||
claimed: {}
|
|
||||||
|
|
||||||
|
|
||||||
hypervisor:
|
|
||||||
hardware:
|
|
||||||
cpu:
|
|
||||||
total: 16
|
|
||||||
free: 16
|
|
||||||
memory:
|
|
||||||
total: 16
|
|
||||||
free: 16
|
|
||||||
disks:
|
|
||||||
free: {}
|
|
||||||
claimed: {}
|
|
||||||
copper:
|
|
||||||
free:
|
|
||||||
2: pci_0000_00_13_0
|
|
||||||
claimed:
|
|
||||||
1: pci_0000_00_12_0
|
|
||||||
sfp:
|
|
||||||
free: {}
|
|
||||||
claimed: {}
|
|
||||||
32
salt/soc/dyanno/hypervisor/hardwareMap.example
Normal file
32
salt/soc/dyanno/hypervisor/hardwareMap.example
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# this file will exist in /opt/so/saltstack/local/salt/hypervisor/hosts/HOSTNAME/hardwareMap
|
||||||
|
hypervisor:
|
||||||
|
hardware:
|
||||||
|
copper:
|
||||||
|
claimed:
|
||||||
|
1: pci_0000_c1_00_0
|
||||||
|
2: pci_0000_c1_00_1
|
||||||
|
free:
|
||||||
|
3: pci_0000_c4_00_0
|
||||||
|
4: pci_0000_c4_00_1
|
||||||
|
5: pci_0000_c4_00_2
|
||||||
|
6: pci_0000_c4_00_3
|
||||||
|
cpu:
|
||||||
|
free: 120
|
||||||
|
total: 120
|
||||||
|
disk:
|
||||||
|
claimed:
|
||||||
|
1: pci_0000_c5_00_0
|
||||||
|
2: pci_0000_c6_00_0
|
||||||
|
free:
|
||||||
|
3: pci_0000_c7_00_0
|
||||||
|
4: pci_0000_c8_00_0
|
||||||
|
memory:
|
||||||
|
free: 120
|
||||||
|
total: 120
|
||||||
|
sfp:
|
||||||
|
claimed: {}
|
||||||
|
free:
|
||||||
|
8: pci_0000_02_00_1
|
||||||
|
7: pci_0000_02_00_0
|
||||||
|
9: pci_0000_41_00_0
|
||||||
|
10: pci_0000_41_00_1
|
||||||
50
salt/soc/dyanno/hypervisor/hypervisor.yaml
Normal file
50
salt/soc/dyanno/hypervisor/hypervisor.yaml
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
hypervisor:
|
||||||
|
hosts:
|
||||||
|
defaultHost:
|
||||||
|
hardwareMap:
|
||||||
|
title: 'All Hardware'
|
||||||
|
description: This shows hardware available to the hypervisor and PCIe -> INT mapping.
|
||||||
|
file: true
|
||||||
|
readonly: true
|
||||||
|
global: true # set to true to remove host drop down
|
||||||
|
multiline: true
|
||||||
|
vmMap:
|
||||||
|
title: 'VM Map'
|
||||||
|
description: This shows the VMs and the hardware they have claimed.
|
||||||
|
file: true
|
||||||
|
readonly: true
|
||||||
|
global: true
|
||||||
|
multiline: true
|
||||||
|
nodes:
|
||||||
|
description: 'Available CPU: CPUFREE | Available Memory: MEMFREE | Available Disk: DISKFREE | Available Copper NIC: COPPERFREE | Available SFP NIC: SFPFREE'
|
||||||
|
syntax: json
|
||||||
|
uiElements:
|
||||||
|
- field: hostname
|
||||||
|
label: Enter the hostname
|
||||||
|
forcedType: string
|
||||||
|
- field: nodetype
|
||||||
|
label: sensor or searchnode
|
||||||
|
- field: network_mode
|
||||||
|
label: Choose static4 or dhcp4. If static4, populate IP details below.
|
||||||
|
- field: ip4
|
||||||
|
label: IP Address with netmask. ex. 192.168.1.10/24
|
||||||
|
- field: gw4
|
||||||
|
label: Gateway
|
||||||
|
- field: dns4
|
||||||
|
label: DNS. Comma seperated list. ex. 192.168.1.1,8.8.8.8
|
||||||
|
- field: search4
|
||||||
|
label: Search domain
|
||||||
|
- field: cpu
|
||||||
|
label: Number of CPU cores to assign. ex. 8
|
||||||
|
- field: memory
|
||||||
|
label: Memory, in GB to assign. ex. 16
|
||||||
|
- field: disk
|
||||||
|
label: Choose a disk or disks to assign for passthrough. Comma seperated list.
|
||||||
|
- field: copper
|
||||||
|
label: Choose a copper port or ports to assign for passthrough. Comma seperated list.
|
||||||
|
- filed: sfp
|
||||||
|
label: Choose a sfp port or ports to assign for passthrough. Comma seperated list.
|
||||||
|
file: true
|
||||||
|
global: true
|
||||||
|
|
||||||
|
vms: {}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
{% from 'soc/dynamic_annotations/hypervisor/map.jinja' import HYPERVISORS %}
|
{% from 'soc/dyanno/hypervisor/map.jinja' import HYPERVISORS %}
|
||||||
|
|
||||||
hypervisor_annotation:
|
hypervisor_annotation:
|
||||||
file.managed:
|
file.managed:
|
||||||
- name: /opt/so/saltstack/default/salt/hypervisor/soc_hypervisor.yaml
|
- name: /opt/so/saltstack/default/salt/hypervisor/soc_hypervisor.yaml
|
||||||
- source: salt://soc/dynamic_annotations/hypervisor/soc_hypervisor.yaml.jinja
|
- source: salt://soc/dyanno/hypervisor/soc_hypervisor.yaml.jinja
|
||||||
- template: jinja
|
- template: jinja
|
||||||
- defaults:
|
- defaults:
|
||||||
HYPERVISORS: {{ HYPERVISORS }}
|
HYPERVISORS: {{ HYPERVISORS }}
|
||||||
@@ -18,11 +18,11 @@ hypervisor_host_directory_{{hypervisor}}:
|
|||||||
add_searchnode_file_{{hypervisor}}:
|
add_searchnode_file_{{hypervisor}}:
|
||||||
file.managed:
|
file.managed:
|
||||||
- name: /opt/so/saltstack/local/salt/hypervisor/hosts/{{hypervisor}}/add_searchnode
|
- name: /opt/so/saltstack/local/salt/hypervisor/hosts/{{hypervisor}}/add_searchnode
|
||||||
- source: salt://soc/dynamic_annotations/hypervisor/add_node
|
- source: salt://soc/dyanno/hypervisor/add_node
|
||||||
|
|
||||||
add_sensor_file_{{hypervisor}}:
|
add_sensor_file_{{hypervisor}}:
|
||||||
file.managed:
|
file.managed:
|
||||||
- name: /opt/so/saltstack/local/salt/hypervisor/hosts/{{hypervisor}}/add_sensor
|
- name: /opt/so/saltstack/local/salt/hypervisor/hosts/{{hypervisor}}/add_sensor
|
||||||
- source: salt://soc/dynamic_annotations/hypervisor/add_node
|
- source: salt://soc/dyanno/hypervisor/add_node
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
67
salt/soc/dyanno/hypervisor/soc_hypervisor.yaml.example
Normal file
67
salt/soc/dyanno/hypervisor/soc_hypervisor.yaml.example
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
# This is the start of an example of what this file will look like. It will be generated by Salt, so this yaml file is not used by Salt.
|
||||||
|
hypervisor:
|
||||||
|
hosts:
|
||||||
|
jpphype1:
|
||||||
|
hardwareMap:
|
||||||
|
title: 'All Hardware'
|
||||||
|
description: This shows hardware available to the hypervisor and PCIe -> INT mapping.
|
||||||
|
file: true
|
||||||
|
readonly: true
|
||||||
|
global: true # set to true to remove host drop down
|
||||||
|
multiline: true
|
||||||
|
cpufree:
|
||||||
|
title: 'Available CPU: 120'
|
||||||
|
description: Available CPU for this hypervisor.
|
||||||
|
readonly: true
|
||||||
|
global: true # set to true to remove host drop down
|
||||||
|
memfree:
|
||||||
|
title: 'Available Memory: 120'
|
||||||
|
description: Available memory for this hypervisor.
|
||||||
|
readonly: true
|
||||||
|
global: true # set to true to remove host drop down
|
||||||
|
diskfree:
|
||||||
|
title: 'Available Disk: 3,4'
|
||||||
|
description: Available disk for this hypervisor.
|
||||||
|
readonly: true
|
||||||
|
global: true # set to true to remove host drop down
|
||||||
|
copperfree:
|
||||||
|
title: 'Available Copper NIC: 3,4,5,6'
|
||||||
|
description: Available copper NIC for this hypervisor.
|
||||||
|
readonly: true
|
||||||
|
global: true # set to true to remove host drop down
|
||||||
|
sfpfree:
|
||||||
|
title: 'Available SFP NIC: 7,8,9,10'
|
||||||
|
description: Available SFP NIC for this hypervisor.
|
||||||
|
readonly: true
|
||||||
|
global: true # set to true to remove host drop down
|
||||||
|
nodes:
|
||||||
|
description: List of VMs.
|
||||||
|
syntax: json
|
||||||
|
uiElements:
|
||||||
|
- field: hostname
|
||||||
|
label: Enter the hostname
|
||||||
|
forcedType: string
|
||||||
|
- field: nodetype
|
||||||
|
label: sensor or searchnode
|
||||||
|
- field: network_mode
|
||||||
|
label: Choose static4 or dhcp4. If static4, populate IP details below.
|
||||||
|
- field: ip4
|
||||||
|
label: IP Address with netmask. ex. 192.168.1.10/24
|
||||||
|
- field: gw4
|
||||||
|
label: Gateway
|
||||||
|
- field: dns4
|
||||||
|
label: DNS. Comma seperated list. ex. 192.168.1.1,8.8.8.8
|
||||||
|
- field: search4
|
||||||
|
label: Search domain
|
||||||
|
- field: cpu
|
||||||
|
label: Number of CPU cores to assign. ex. 8
|
||||||
|
- field: memory
|
||||||
|
label: Memory, in GB to assign. ex. 16
|
||||||
|
- field: disk
|
||||||
|
label: Choose a disk or disks to assign for passthrough. Comma seperated list.
|
||||||
|
- field: copper
|
||||||
|
label: Choose a copper port or ports to assign for passthrough. Comma seperated list.
|
||||||
|
- filed: sfp
|
||||||
|
label: Choose a sfp port or ports to assign for passthrough. Comma seperated list.
|
||||||
|
file: true
|
||||||
|
global: true # set to true to remove host drop down
|
||||||
36
salt/soc/dyanno/hypervisor/soc_hypervisor.yaml.jinja
Normal file
36
salt/soc/dyanno/hypervisor/soc_hypervisor.yaml.jinja
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
{%- import_yaml 'soc/dyanno/hypervisor/hypervisor.yaml' as ANNOTATION -%}
|
||||||
|
|
||||||
|
{%- set TEMPLATE = ANNOTATION.hypervisor.hosts.pop('defaultHost') -%}
|
||||||
|
|
||||||
|
{%- macro update_description(description, cpu_free, mem_free, disk_free, copper_free, sfp_free) -%}
|
||||||
|
{{- description | replace('CPUFREE', cpu_free | string)
|
||||||
|
| replace('MEMFREE', mem_free | string)
|
||||||
|
| replace('DISKFREE', disk_free | string)
|
||||||
|
| replace('COPPERFREE', copper_free | string)
|
||||||
|
| replace('SFPFREE', sfp_free | string) -}}
|
||||||
|
{%- endmacro -%}
|
||||||
|
|
||||||
|
{%- for role in HYPERVISORS -%}
|
||||||
|
{%- for hypervisor in HYPERVISORS[role].keys() -%}
|
||||||
|
{%- set cpu_free = HYPERVISORS[role][hypervisor].available_cpu -%}
|
||||||
|
{%- set mem_free = HYPERVISORS[role][hypervisor].available_memory -%}
|
||||||
|
{%- set disk_free = HYPERVISORS[role][hypervisor].available_disk -%}
|
||||||
|
{%- set copper_free = HYPERVISORS[role][hypervisor].available_copper -%}
|
||||||
|
{%- set sfp_free = HYPERVISORS[role][hypervisor].available_sfp -%}
|
||||||
|
|
||||||
|
{%- set updated_template = TEMPLATE.copy() -%}
|
||||||
|
{%- do updated_template.nodes.update({
|
||||||
|
'description': update_description(
|
||||||
|
TEMPLATE.nodes.description,
|
||||||
|
cpu_free,
|
||||||
|
mem_free,
|
||||||
|
disk_free,
|
||||||
|
copper_free,
|
||||||
|
sfp_free
|
||||||
|
)
|
||||||
|
}) -%}
|
||||||
|
{%- do ANNOTATION.hypervisor.hosts.update({hypervisor: updated_template}) -%}
|
||||||
|
{%- endfor -%}
|
||||||
|
{%- endfor -%}
|
||||||
|
|
||||||
|
{{- ANNOTATION | yaml(False) -}}
|
||||||
14
salt/soc/dyanno/hypervisor/vmMap.example
Normal file
14
salt/soc/dyanno/hypervisor/vmMap.example
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
hypervisor:
|
||||||
|
vm:
|
||||||
|
sen41_sensor:
|
||||||
|
cpu: 16
|
||||||
|
memory: 24
|
||||||
|
disk: 3
|
||||||
|
copper: 3,4
|
||||||
|
sfp: 7,8
|
||||||
|
sea42_searchnode:
|
||||||
|
cpu: 16
|
||||||
|
memory: 24
|
||||||
|
disk: 4
|
||||||
|
copper:
|
||||||
|
sfp:
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
hostname:
|
|
||||||
network_mode:
|
|
||||||
ip4:
|
|
||||||
gw4:
|
|
||||||
dns4:
|
|
||||||
search4:
|
|
||||||
cpu:
|
|
||||||
memory:
|
|
||||||
disk:
|
|
||||||
copper:
|
|
||||||
sfp:
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
hypervisor:
|
|
||||||
hosts:
|
|
||||||
defaultHost:
|
|
||||||
add_searchnode:
|
|
||||||
description: Add a new searchnode to the hypervisor.
|
|
||||||
file: True
|
|
||||||
global: True
|
|
||||||
multiline: True
|
|
||||||
add_sensor:
|
|
||||||
description: Add a new sensor to the hypervisor.
|
|
||||||
file: True
|
|
||||||
global: True
|
|
||||||
multiline: True
|
|
||||||
guests:
|
|
||||||
defaultGuest:
|
|
||||||
copper:
|
|
||||||
description: Copper nics
|
|
||||||
forcedType: "[]int"
|
|
||||||
global: True
|
|
||||||
multiline: True
|
|
||||||
sfp:
|
|
||||||
description: sfp nics
|
|
||||||
forcedType: string
|
|
||||||
global: True
|
|
||||||
multiline: True
|
|
||||||
disks:
|
|
||||||
description: disk
|
|
||||||
forcedType: "[]int"
|
|
||||||
global: True
|
|
||||||
multiline: True
|
|
||||||
cpu:
|
|
||||||
description: cpu
|
|
||||||
forcedType: int
|
|
||||||
global: True
|
|
||||||
multiline: True
|
|
||||||
memory:
|
|
||||||
description: mem
|
|
||||||
forcedType: int
|
|
||||||
global: True
|
|
||||||
multiline: True
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
{% import_yaml 'soc/dynamic_annotations/hypervisor/hypervisor.yaml' as ANNOTATION %}
|
|
||||||
|
|
||||||
{% set TEMPLATE = ANNOTATION.hypervisor.hosts.pop('defaultHost') %}
|
|
||||||
{# remove defaultGuest so that it is not shown in Grid Configuration UI #}
|
|
||||||
{% do TEMPLATE['guests'].pop('defaultGuest') %}
|
|
||||||
|
|
||||||
{% for role in HYPERVISORS %}
|
|
||||||
{% for hypervisor in HYPERVISORS[role].keys() %}
|
|
||||||
{% do ANNOTATION.hypervisor.hosts.update({hypervisor: TEMPLATE}) %}
|
|
||||||
{% endfor %}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
{{ ANNOTATION | yaml(False) }}
|
|
||||||
Reference in New Issue
Block a user