使用Jinja2模板语言从前缀/子网推导网络参数

时间:2018-07-09 11:20:23

标签: math jinja2 salt-stack

我正在开发一个开源项目,以使用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

1 个答案:

答案 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的目录中。

关于, 德克