我正在开发一个开源项目,以使用Salt和Jinja2为小型企业网络或节点集群提供完整的堆栈。
但是,要使堆栈与/ 24,/ 16和/ 8等子网兼容,我需要从前缀/子网中推断出一些参数。
这里是一个例子:
用户提供子网10.0.0.0和前缀/ 23。 我想推断一下:
网络掩码是255.255.254.0,广播是10.0.1.255
我还希望用户能够在使用Salt之后执行相同的操作来指定其他参数。
但是我今天未能找到一种方法来使用Jinja2模板语言来直接在Salt Pillar中呈现值。
您可以在模板设计器http://jinja.pocoo.org/docs/2.10/templates/中看到可用的数学运算受到限制。我也在考虑过滤器,但找不到一个。
你们中的一个人知道一种使用基本数学运算来实现与IP相关的运算的方法吗? (因此没有二进制文件)
最诚挚的问候
Ox
答案 0 :(得分:0)
正如您所说,内置的Jinja过滤器对此非常有限。 我认为您需要致电Salt模块。
如果具有Salt 2016.3或更高版本,则可以在Jinja模板中调用netaddress
执行模块。确保在目标奴才上安装了Python模块netaddr
。然后,您可以在Salt州进行类似Jinja的呼叫。
/tmp/demonstration.txt:
file.managed:
- contents:
- "broadcast: {{ salt.netaddress.cidr_broadcast('10.0.0.0/23') }}"
- "netmask: {{ salt.netaddress.cidr_netmask('10.0.0.0/23') }}"
(将字符串文字10.0.0.0/23
替换为您在支柱中定义的内容。)
如果您使用的是较早的Salt版本,请将文件netaddress.py
放在_modules
(可能是file_roots
)内名为/srv/salt/state/_modules
的目录中:
# -*- coding: utf-8 -*-
import netaddr
def cidr_broadcast(str_net):
net = netaddr.IPNetwork(str_net)
return net.broadcast
def cidr_netmask(str_net):
net = netaddr.IPNetwork(str_net)
return net.netmask
执行sudo salt <target_minion> saltutil.sync_all
,它也应该工作。
但是我不确定“ 能够直接在Salt Pillar中显示值”的意思。
如果要在支柱中执行相同的操作,则可以编写支柱SLS文件,如下所示:
{%- set example_net = '10.0.0.0/23' %}
demonstration:
example_net:
net: {{ example_net }}
broadcast: {{ salt.netaddress.cidr_broadcast(example_net) }}
netmask: {{ salt.netaddress.cidr_netmask(example_net) }}
请注意,如果您需要编写自定义模块进行支柱渲染,则由于支柱是在母版上渲染的,因此工作原理有所不同。在这种情况下,您需要在主配置中设置extension_modules
并将模块放置在名为modules
的目录中。
关于, 德克