hosts/subnet: add ctx to allow multiple inet6 addrs

This commit is contained in:
Astro 2018-06-23 00:12:35 +02:00
parent 6320ad92d0
commit 3c6fc16a90
11 changed files with 277 additions and 162 deletions

View File

@ -154,128 +154,213 @@ hosts-inet:
bgp: 172.22.99.250
hosts-inet6:
mgmt:
server1: fd23:42:c3d2:580::1
server2: fd23:42:c3d2:580::2
switch-b1: fd23:42:c3d2:580::10
switch-b2: fd23:42:c3d2:580::11
switch-c1: fd23:42:c3d2:580::12
switch-d1: fd23:42:c3d2:580::13
switch-c3d2-main: fd23:42:c3d2:580::14
ap1: fd23:42:c3d2:580::4:1
ap2: fd23:42:c3d2:580::4:2
ap3: fd23:42:c3d2:580::4:3
ap4: fd23:42:c3d2:580::4:4
ap5: fd23:42:c3d2:580::4:5
ap6: fd23:42:c3d2:580::4:6
ap7: fd23:42:c3d2:580::4:7
ap8: fd23:42:c3d2:580::4:8
ap9: fd23:42:c3d2:580::4:9
ap10: fd23:42:c3d2:580::4:a
ap11: fd23:42:c3d2:580::4:b
ap12: fd23:42:c3d2:580::4:c
ap13: fd23:42:c3d2:580::4:d
ap14: fd23:42:c3d2:580::4:e
ap15: fd23:42:c3d2:580::4:f
ap16: fd23:42:c3d2:580::4:10
ap17: fd23:42:c3d2:580::4:11
ap18: fd23:42:c3d2:580::4:12
ap19: fd23:42:c3d2:580::4:13
ap20: fd23:42:c3d2:580::4:14
ap21: fd23:42:c3d2:580::4:15
ap22: fd23:42:c3d2:580::4:16
ap23: fd23:42:c3d2:580::4:17
ap24: fd23:42:c3d2:580::4:18
ap25: fd23:42:c3d2:580::4:19
ap26: fd23:42:c3d2:580::4:1a
ap27: fd23:42:c3d2:580::4:1b
ap28: fd23:42:c3d2:580::4:1c
ap29: fd23:42:c3d2:580::4:1d
ap30: fd23:42:c3d2:580::4:1e
ap31: fd23:42:c3d2:580::4:1f
ap32: fd23:42:c3d2:580::4:20
monit: fd23:42:c3d2:580::250
mgmt-gw: fd23:42:c3d2:580:ffff:ffff:ffff:ffff
dn42:
mgmt:
server1: fd23:42:c3d2:580::1
server2: fd23:42:c3d2:580::2
switch-b1: fd23:42:c3d2:580::10
switch-b2: fd23:42:c3d2:580::11
switch-c1: fd23:42:c3d2:580::12
switch-d1: fd23:42:c3d2:580::13
switch-c3d2-main: fd23:42:c3d2:580::14
ap1: fd23:42:c3d2:580::4:1
ap2: fd23:42:c3d2:580::4:2
ap3: fd23:42:c3d2:580::4:3
ap4: fd23:42:c3d2:580::4:4
ap5: fd23:42:c3d2:580::4:5
ap6: fd23:42:c3d2:580::4:6
ap7: fd23:42:c3d2:580::4:7
ap8: fd23:42:c3d2:580::4:8
ap9: fd23:42:c3d2:580::4:9
ap10: fd23:42:c3d2:580::4:a
ap11: fd23:42:c3d2:580::4:b
ap12: fd23:42:c3d2:580::4:c
ap13: fd23:42:c3d2:580::4:d
ap14: fd23:42:c3d2:580::4:e
ap15: fd23:42:c3d2:580::4:f
ap16: fd23:42:c3d2:580::4:10
ap17: fd23:42:c3d2:580::4:11
ap18: fd23:42:c3d2:580::4:12
ap19: fd23:42:c3d2:580::4:13
ap20: fd23:42:c3d2:580::4:14
ap21: fd23:42:c3d2:580::4:15
ap22: fd23:42:c3d2:580::4:16
ap23: fd23:42:c3d2:580::4:17
ap24: fd23:42:c3d2:580::4:18
ap25: fd23:42:c3d2:580::4:19
ap26: fd23:42:c3d2:580::4:1a
ap27: fd23:42:c3d2:580::4:1b
ap28: fd23:42:c3d2:580::4:1c
ap29: fd23:42:c3d2:580::4:1d
ap30: fd23:42:c3d2:580::4:1e
ap31: fd23:42:c3d2:580::4:1f
ap32: fd23:42:c3d2:580::4:20
monit: fd23:42:c3d2:580::250
mgmt-gw: fd23:42:c3d2:580:ffff:ffff:ffff:ffff
core:
server1: fd23:42:c3d2:581::1
server2: fd23:42:c3d2:581::102
core:
server1: fd23:42:c3d2:581::1
server2: fd23:42:c3d2:581::102
anon1: fd23:42:c3d2:581::9:1
serv-gw: fd23:42:c3d2:581::8:1
pub-gw: fd23:42:c3d2:581::8:2
c3d2-gw: fd23:42:c3d2:581::c3d2:1
c3d2-anon: fd23:42:c3d2:581::c3d2:a
bgp: fd23:42:c3d2:581::c3d2:b
mgmt-gw: fd23:42:c3d2:581::8:3
anon1: fd23:42:c3d2:581::9:1
serv-gw: fd23:42:c3d2:581::8:1
pub-gw: fd23:42:c3d2:581::8:2
c3d2-gw: fd23:42:c3d2:581::c3d2:1
c3d2-anon: fd23:42:c3d2:581::c3d2:a
bgp: fd23:42:c3d2:581::c3d2:b
mgmt-gw: fd23:42:c3d2:581::8:3
upstream1: fd23:42:c3d2:581::b:0
upstream2: fd23:42:c3d2:581::b:1
upstream3: fd23:42:c3d2:581::b:2
upstream4: fd23:42:c3d2:581::b:3
upstream1: fd23:42:c3d2:581::b:0
upstream2: fd23:42:c3d2:581::b:1
upstream3: fd23:42:c3d2:581::b:2
upstream4: fd23:42:c3d2:581::b:3
priv1-gw: fd23:42:c3d2:581::c:0
priv2-gw: fd23:42:c3d2:581::c:1
priv3-gw: fd23:42:c3d2:581::c:2
priv4-gw: fd23:42:c3d2:581::c:3
priv5-gw: fd23:42:c3d2:581::c:4
priv6-gw: fd23:42:c3d2:581::c:5
priv7-gw: fd23:42:c3d2:581::c:6
priv8-gw: fd23:42:c3d2:581::c:7
priv9-gw: fd23:42:c3d2:581::c:8
priv10-gw: fd23:42:c3d2:581::c:9
priv11-gw: fd23:42:c3d2:581::c:a
priv12-gw: fd23:42:c3d2:581::c:b
priv13-gw: fd23:42:c3d2:581::c:c
priv14-gw: fd23:42:c3d2:581::c:d
priv15-gw: fd23:42:c3d2:581::c:e
priv16-gw: fd23:42:c3d2:581::c:d
priv1-gw: fd23:42:c3d2:581::c:0
priv2-gw: fd23:42:c3d2:581::c:1
priv3-gw: fd23:42:c3d2:581::c:2
priv4-gw: fd23:42:c3d2:581::c:3
priv5-gw: fd23:42:c3d2:581::c:4
priv6-gw: fd23:42:c3d2:581::c:5
priv7-gw: fd23:42:c3d2:581::c:6
priv8-gw: fd23:42:c3d2:581::c:7
priv9-gw: fd23:42:c3d2:581::c:8
priv10-gw: fd23:42:c3d2:581::c:9
priv11-gw: fd23:42:c3d2:581::c:a
priv12-gw: fd23:42:c3d2:581::c:b
priv13-gw: fd23:42:c3d2:581::c:c
priv14-gw: fd23:42:c3d2:581::c:d
priv15-gw: fd23:42:c3d2:581::c:e
priv16-gw: fd23:42:c3d2:581::c:d
serv:
serv-gw: fd23:42:c3d2:582::1
dns: fd23:42:c3d2:582:2:0:0:2
stats: fd23:42:c3d2:582:2:0:0:3
radius: fd23:42:c3d2:582:2:0:0:4
zeit: fd23:42:c3d2:582:2:0:0:5
pub:
pub-gw: fd23:42:c3d2:583::1
priv1:
priv1-gw: fd23:42:c3d2:5c0::1
priv2:
priv2-gw: fd23:42:c3d2:5c1::1
priv3:
priv3-gw: fd23:42:c3d2:5c2::1
priv4:
priv4-gw: fd23:42:c3d2:5c3::1
priv5:
priv5-gw: fd23:42:c3d2:5c4::1
priv6:
priv6-gw: fd23:42:c3d2:5c5::1
priv7:
priv7-gw: fd23:42:c3d2:5c6::1
priv8:
priv8-gw: fd23:42:c3d2:5c7::1
priv9:
priv9-gw: fd23:42:c3d2:5c8::1
priv10:
priv10-gw: fd23:42:c3d2:5c9::1
priv11:
priv11-gw: fd23:42:c3d2:5ca::1
priv12:
priv12-gw: fd23:42:c3d2:5cb::1
priv13:
priv13-gw: fd23:42:c3d2:5cc::1
priv14:
priv14-gw: fd23:42:c3d2:5cd::1
priv15:
priv15-gw: fd23:42:c3d2:5ce::1
priv16:
priv16-gw: fd23:42:c3d2:5cf::1
serv:
serv-gw: fd23:42:c3d2:582::1
dns: fd23:42:c3d2:582:2:0:0:2
stats: fd23:42:c3d2:582:2:0:0:3
radius: fd23:42:c3d2:582:2:0:0:4
zeit: fd23:42:c3d2:582:2:0:0:5
pub:
pub-gw: fd23:42:c3d2:583::1
priv1:
priv1-gw: fd23:42:c3d2:5c0::1
priv2:
priv2-gw: fd23:42:c3d2:5c1::1
priv3:
priv3-gw: fd23:42:c3d2:5c2::1
priv4:
priv4-gw: fd23:42:c3d2:5c3::1
priv5:
priv5-gw: fd23:42:c3d2:5c4::1
priv6:
priv6-gw: fd23:42:c3d2:5c5::1
priv7:
priv7-gw: fd23:42:c3d2:5c6::1
priv8:
priv8-gw: fd23:42:c3d2:5c7::1
priv9:
priv9-gw: fd23:42:c3d2:5c8::1
priv10:
priv10-gw: fd23:42:c3d2:5c9::1
priv11:
priv11-gw: fd23:42:c3d2:5ca::1
priv12:
priv12-gw: fd23:42:c3d2:5cb::1
priv13:
priv13-gw: fd23:42:c3d2:5cc::1
priv14:
priv14-gw: fd23:42:c3d2:5cd::1
priv15:
priv15-gw: fd23:42:c3d2:5ce::1
priv16:
priv16-gw: fd23:42:c3d2:5cf::1
radio:
radio-gw: fd23:42:c3d2:586::1
radio:
radio-gw: fd23:42:c3d2:586::1
c3d2:
c3d2-anon: fd23:42:c3d2:523::c3d2:1
c3d2-gw: fd23:42:c3d2:523::c3d2:4
bgp: fd23:42:c3d2:523::c3d2:ff0b
c3d2:
c3d2-anon: fd23:42:c3d2:523::c3d2:1
c3d2-gw: fd23:42:c3d2:523::c3d2:4
bgp: fd23:42:c3d2:523::c3d2:ff0b
up1:
core:
server1: 2a02:8106:208:5281::1
server2: 2a02:8106:208:5281::102
anon1: 2a02:8106:208:5281::9:1
serv-gw: 2a02:8106:208:5281::8:1
pub-gw: 2a02:8106:208:5281::8:2
c3d2-gw: 2a02:8106:208:5281::c3d2:1
c3d2-anon: 2a02:8106:208:5281::c3d2:a
bgp: 2a02:8106:208:5281::c3d2:b
mgmt-gw: 2a02:8106:208:5281::8:3
upstream1: 2a02:8106:208:5281::b:0
upstream2: 2a02:8106:208:5281::b:1
upstream3: 2a02:8106:208:5281::b:2
upstream4: 2a02:8106:208:5281::b:3
priv1-gw: 2a02:8106:208:5281::c:0
priv2-gw: 2a02:8106:208:5281::c:1
priv3-gw: 2a02:8106:208:5281::c:2
priv4-gw: 2a02:8106:208:5281::c:3
priv5-gw: 2a02:8106:208:5281::c:4
priv6-gw: 2a02:8106:208:5281::c:5
priv7-gw: 2a02:8106:208:5281::c:6
priv8-gw: 2a02:8106:208:5281::c:7
priv9-gw: 2a02:8106:208:5281::c:8
priv10-gw: 2a02:8106:208:5281::c:9
priv11-gw: 2a02:8106:208:5281::c:a
priv12-gw: 2a02:8106:208:5281::c:b
priv13-gw: 2a02:8106:208:5281::c:c
priv14-gw: 2a02:8106:208:5281::c:d
priv15-gw: 2a02:8106:208:5281::c:e
priv16-gw: 2a02:8106:208:5281::c:d
serv:
serv-gw: 2a02:8106:208:5282::1
dns: 2a02:8106:208:5282:2:0:0:2
stats: 2a02:8106:208:5282:2:0:0:3
radius: 2a02:8106:208:5282:2:0:0:4
zeit: 2a02:8106:208:5282:2:0:0:5
pub:
pub-gw: 2a02:8106:208:5283::1
priv1:
priv1-gw: 2a02:8106:208:52c0::1
priv2:
priv2-gw: 2a02:8106:208:52c1::1
priv3:
priv3-gw: 2a02:8106:208:52c2::1
priv4:
priv4-gw: 2a02:8106:208:52c3::1
priv5:
priv5-gw: 2a02:8106:208:52c4::1
priv6:
priv6-gw: 2a02:8106:208:52c5::1
priv7:
priv7-gw: 2a02:8106:208:52c6::1
priv8:
priv8-gw: 2a02:8106:208:52c7::1
priv9:
priv9-gw: 2a02:8106:208:52c8::1
priv10:
priv10-gw: 2a02:8106:208:52c9::1
priv11:
priv11-gw: 2a02:8106:208:52ca::1
priv12:
priv12-gw: 2a02:8106:208:52cb::1
priv13:
priv13-gw: 2a02:8106:208:52cc::1
priv14:
priv14-gw: 2a02:8106:208:52cd::1
priv15:
priv15-gw: 2a02:8106:208:52ce::1
priv16:
priv16-gw: 2a02:8106:208:52cf::1
radio:
radio-gw: 2a02:8106:208:5286::1
c3d2:
c3d2-anon: 2a02:8106:208:5201::c3d2:1
c3d2-gw: 2a02:8106:208:5201::c3d2:4
bgp: 2a02:8106:208:5201::c3d2:ff0b

View File

@ -23,25 +23,48 @@ subnets-inet:
radio: 172.20.73.128/26
subnets-inet6:
mgmt: fd23:42:c3d2:580::/64
core: fd23:42:c3d2:581::/64
serv: fd23:42:c3d2:582::/64
pub: fd23:42:c3d2:583::/64
radio: fd23:42:c3d2:586::/64
priv1: fd23:42:c3d2:5c0::/64
priv2: fd23:42:c3d2:5c1::/64
priv3: fd23:42:c3d2:5c2::/64
priv4: fd23:42:c3d2:5c3::/64
priv5: fd23:42:c3d2:5c4::/64
priv6: fd23:42:c3d2:5c5::/64
priv7: fd23:42:c3d2:5c6::/64
priv8: fd23:42:c3d2:5c7::/64
priv9: fd23:42:c3d2:5c8::/64
priv10: fd23:42:c3d2:5c9::/64
priv11: fd23:42:c3d2:5ca::/64
priv12: fd23:42:c3d2:5cb::/64
priv13: fd23:42:c3d2:5cc::/64
priv14: fd23:42:c3d2:5cd::/64
priv15: fd23:42:c3d2:5ce::/64
priv16: fd23:42:c3d2:5cf::/64
c3d2: fd23:42:c3d2:523::/64
dn42:
mgmt: fd23:42:c3d2:580::/64
core: fd23:42:c3d2:581::/64
serv: fd23:42:c3d2:582::/64
pub: fd23:42:c3d2:583::/64
radio: fd23:42:c3d2:586::/64
priv1: fd23:42:c3d2:5c0::/64
priv2: fd23:42:c3d2:5c1::/64
priv3: fd23:42:c3d2:5c2::/64
priv4: fd23:42:c3d2:5c3::/64
priv5: fd23:42:c3d2:5c4::/64
priv6: fd23:42:c3d2:5c5::/64
priv7: fd23:42:c3d2:5c6::/64
priv8: fd23:42:c3d2:5c7::/64
priv9: fd23:42:c3d2:5c8::/64
priv10: fd23:42:c3d2:5c9::/64
priv11: fd23:42:c3d2:5ca::/64
priv12: fd23:42:c3d2:5cb::/64
priv13: fd23:42:c3d2:5cc::/64
priv14: fd23:42:c3d2:5cd::/64
priv15: fd23:42:c3d2:5ce::/64
priv16: fd23:42:c3d2:5cf::/64
c3d2: fd23:42:c3d2:523::/64
up1:
c3d2: 2a02:8106:208:5201::/64
core: 2a02:8106:208:5281::/64
serv: 2a02:8106:208:5282::/64
pub: 2a02:8106:208:5283::/64
radio: 2a02:8106:208:5286::/64
priv1: 2a02:8106:208:52c0::/64
priv2: 2a02:8106:208:52c1::/64
priv3: 2a02:8106:208:52c2::/64
priv4: 2a02:8106:208:52c3::/64
priv5: 2a02:8106:208:52c4::/64
priv6: 2a02:8106:208:52c5::/64
priv7: 2a02:8106:208:52c6::/64
priv8: 2a02:8106:208:52c7::/64
priv9: 2a02:8106:208:52c8::/64
priv10: 2a02:8106:208:52c9::/64
priv11: 2a02:8106:208:52ca::/64
priv12: 2a02:8106:208:52cb::/64
priv13: 2a02:8106:208:52cc::/64
priv14: 2a02:8106:208:52cd::/64
priv15: 2a02:8106:208:52ce::/64
priv16: 2a02:8106:208:52cf::/64

View File

@ -34,6 +34,7 @@ bind9:
- context:
domain: {{ domain }}
net: {{ net }}
ctx: dn42
{%- endfor %}

View File

@ -18,7 +18,7 @@ $TTL 10M
{%- endfor %}
{%- endif %}
{%- if pillar['hosts-inet6'].get(net) %}
{%- if pillar['hosts-inet6'][ctx].get(net) %}
{%- for name, aaaa in pillar['hosts-inet6'][net].items() %}
{{ name }} IN AAAA {{ aaaa }}
{%- endfor %}

View File

@ -19,7 +19,7 @@ $TTL 10M
{%- endfor %}
{%- endfor %}
{%- for net, hosts in pillar['hosts-inet6'].items() %}
{%- for net, hosts in pillar['hosts-inet6']['dn42'].items() %}
{%- for host, aaaa in hosts.items() %}
{%- set reverse = salt['network.reverse_ip'](aaaa) %}
{%- if reverse.endswith(domain) %}

View File

@ -58,12 +58,16 @@ protocol ospf ZW6 {
2a02:8106:208:5200::/56;
};
{%- for iface, ips in salt['grains.get']('ip_interfaces').items() %}
{%- set subnet = pillar['subnets-inet6'].get(iface) %}
{%- if iface == 'core' or iface == 'br-core' %}
interface "{{ iface }}" {
};
{%- elif subnet %}
{%- else %}
{%- for ctx, subnets in pillar['subnets-inet6'].items() %}
{%- set subnet = subnets.get(iface) %}
{%- if subnet %}
stubnet {{ subnet }} {};
{%- endif %}
{%- endfor %}
{%- endif %}
{%- endfor %}
{%- if pillar['ospf'].get('stubnets-inet6') %}

View File

@ -14,7 +14,7 @@ LoadPlugin logfile
{%- if plugin == 'network' and conf == 'client' %}
LoadPlugin network
<Plugin network>
Server "{{ pillar['hosts-inet6']['serv']['stats'] }}" "25826"
Server "{{ pillar['hosts-inet6']['dn42']['serv']['stats'] }}" "25826"
</Plugin>
{%- elif plugin == 'network' and conf == 'server' %}
LoadPlugin network

View File

@ -7,13 +7,13 @@ set network.mgmt.proto=static
set network.mgmt.ipaddr={{ pillar['hosts-inet']['mgmt'][hostname] }}
set network.mgmt.netmask=255.255.255.0
set network.mgmt.gateway={{ pillar['hosts-inet']['mgmt']['mgmt-gw'] }}
set network.mgmt.ip6addr={{ pillar['hosts-inet6']['mgmt'][hostname] }}/64
set network.mgmt.ip6gw={{ pillar['hosts-inet6']['mgmt']['mgmt-gw'] }}
set network.mgmt.ip6addr={{ pillar['hosts-inet6']['dn42']['mgmt'][hostname] }}/64
set network.mgmt.ip6gw={{ pillar['hosts-inet6']['dn42']['mgmt']['mgmt-gw'] }}
delete network.mgmt.dns
add_list network.mgmt.dns={{ pillar['hosts-inet']['core']['upstream1'] }}
add_list network.mgmt.dns={{ pillar['hosts-inet6']['core']['upstream1'] }}
add_list network.mgmt.dns={{ pillar['hosts-inet6']['dn42']['core']['upstream1'] }}
add_list network.mgmt.dns={{ pillar['hosts-inet']['core']['upstream2'] }}
add_list network.mgmt.dns={{ pillar['hosts-inet6']['core']['upstream2'] }}
add_list network.mgmt.dns={{ pillar['hosts-inet6']['dn42']['core']['upstream2'] }}
{%- endmacro %}
{%- if conf.get('firstboot') %}

View File

@ -22,7 +22,7 @@ LoadPlugin interface
LoadPlugin iwinfo
LoadPlugin network
<Plugin network>
Server "{{ pillar['hosts-inet6']['serv']['stats'] }}" "25826"
Server "{{ pillar['hosts-inet6']['dn42']['serv']['stats'] }}" "25826"
</Plugin>
EOF

View File

@ -34,16 +34,18 @@ lxc.network.ipv4={{ inet_addr }}/{{ prefix_len }}
lxc.network.ipv4.gateway={{ pillar['hosts-inet'][net][gw] }}
{%- endif %}
{%- set hosts6 = pillar['hosts-inet6'].get(net) %}
{%- set inet6_addr = hosts6 and hosts6.get(id) %}
{%- if inet6_addr %}
{%- set prefix6_len = pillar['subnets-inet6'][net].split('/')[1] %}
{%- for ctx, hosts in pillar['hosts-inet6'].items() %}
{%- set hosts6 = hosts.get(net) %}
{%- set inet6_addr = hosts6 and hosts6.get(id) %}
{%- if inet6_addr %}
{%- set prefix6_len = pillar['subnets-inet6'][ctx][net].split('/')[1] %}
lxc.network.ipv6={{ inet6_addr }}/{{ prefix6_len }}
{%- endif %}
{%- set gw6 = conf.get('gw6') %}
{%- if gw6 %}
lxc.network.ipv6.gateway={{ pillar['hosts-inet6'][net][gw6] }}
{%- endif %}
{%- endif %}
{%- set gw6 = conf.get('gw6') %}
{%- if gw6 %}
lxc.network.ipv6.gateway={{ hosts[net][gw6] }}
{%- endif %}
{%- endfor %}
{%- if conf['type'] == 'veth' %}
lxc.network.link=br-{{ net }}

View File

@ -4,18 +4,18 @@ server:
forward-zone:
name: "{{ pillar['bind']['root-domain'] }}"
forward-addr: {{ pillar['hosts-inet']['serv']['dns'] }}
forward-addr: {{ pillar['hosts-inet6']['serv']['dns'] }}
forward-addr: {{ pillar['hosts-inet6']['dn42']['serv']['dns'] }}
{%- for domain in pillar['bind']['reverse-zones-inet'] %}
forward-zone:
name: "{{ domain }}"
forward-addr: {{ pillar['hosts-inet']['serv']['dns'] }}
forward-addr: {{ pillar['hosts-inet6']['serv']['dns'] }}
forward-addr: {{ pillar['hosts-inet6']['dn42']['serv']['dns'] }}
{%- endfor %}
{%- for domain in pillar['bind']['reverse-zones-inet6'] %}
forward-zone:
name: "{{ domain }}"
forward-addr: {{ pillar['hosts-inet']['serv']['dns'] }}
forward-addr: {{ pillar['hosts-inet6']['serv']['dns'] }}
forward-addr: {{ pillar['hosts-inet6']['dn42']['serv']['dns'] }}
{%- endfor %}