【问题标题】:How do I use the IP addresses of machines matching a grain in a Salt State file如何使用与 Salt State 文件中的颗粒匹配的机器的 IP 地址
【发布时间】:2014-09-26 08:25:12
【问题描述】:

我正在创建一个添加iptables 规则的公式/状态文件:

ipt_allow:
  iptables.append:
    - table: filter
    - chain: INPUT
    - jump: ACCEPT
    - match: state
    - connstate: 'NEW,ESTABLISHED'
    - dport: 6666
    - proto: tcp
    - source: 'ip1, ip2, ip3, ...'

我不想硬编码source 中的 IP 地址。 ip1ip2ip3是与grain role:role1匹配的minions的IP地址。那样的话,如果我在路上添加更多带有颗粒role1 的小兵,一旦我重新运行这个状态文件,它们就会被添加到 iptables 规则中。我该怎么做?

【问题讨论】:

    标签: jinja2 salt-stack


    【解决方案1】:

    知道了。这可以使用 Salt mine 函数来完成。

    1. /srv/pillar/mines.sls:

      mine_functions:
        network.ip_addrs:
          - eth1
      

      这使得network.ip_addrs 可供master 和minions 使用,特别是eth1 接口。

    2. /srv/pillar/top.sls:

      base:
        '*':
          - mines
      

      这会将柱子(因此是 mine 功能)应用于所有小兵。

    3. 现在您可以在状态文件中使用 mine.get 函数来调用该 mine 函数。这是我在我的案例中使用的:

      {% for server, addrs in salt['mine.get']('role:role1', 'network.ip_addrs', expr_form='grain').items() %}
      ipt_allow_{{ 服务器 }}:
        iptables.append:
          - 表:过滤器
          - 链:输入
          - 跳跃:接受
          - 匹配:状态
          - connstate:'新的,已建立的'
          - 端口:6666
          - 原型:tcp
          - 来源:{{ addrs[0] }}
      {% endfor %}
      

      地点:

      • salt['mine.get'] 调用mine.get 函数,
      • ('role:role1', 'network.ip_addrs', expr_form='grain').items() 告诉函数匹配具有role1 作为role 的值的minions,这是一个grain (expr_form='grain'),并得到它的network.ip_addrs
      • 输出是匹配的minion id(我相信)和network.ip_addrs的结果,所以我们将它存储在serveraddrs中。
      • for 循环每次使用{{ server }} 中的值并用{{ addrs[0] }} 中的IP 地址替换时都会创建一个新ID。

    有帮助的链接:

    【讨论】:

      猜你喜欢
      • 2023-04-11
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 2022-03-03
      • 2011-02-11
      • 2012-03-10
      • 2016-04-15
      • 2012-07-01
      相关资源
      最近更新 更多