首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vyos上不可更新的多重防火墙规则

Vyos上不可更新的多重防火墙规则
EN

Stack Overflow用户
提问于 2022-04-10 08:40:39
回答 1查看 126关注 0票数 1

我一直在尝试创建一个可定期运行的游戏手册,以遍历所有Vyos防火墙规则,并确保“启用日志”命令的存在,以防有人忘记将日志添加到防火墙规则。我已经找到了vyos.vyos.vyos_firewall_rules模块,我认为它对于我需要做的工作来说是完美的。

唯一的问题是,这个模块要求您输入要更新的每个防火墙规则的规则集名称和规则号。但是,在我的例子中,我希望这是自动完成的,Ansible通过每个防火墙规则集和存在的相关规则,并确保对每个规则启用日志记录。我需要这样的东西:

代码语言:javascript
复制
- name: Enable logging for each firewall rule
  vyos.vyos.vyos_firewall_rules:
    config:
    - afi: ipv4
      rule_sets:
      - name: *all rules sets*
        rules:
        - number: *all numbers*
          log: enabled

我使用vyos.vyos.vyos_firewall_rules收集了所有规则集和相关规则的转储,并对其进行了筛选,列出了每个规则集名称以及每个关联的规则号:

代码语言:javascript
复制
    - name: Get rulesets
      vyos.vyos.vyos_firewall_rules:
        config:
        state: gathered
      register: output

    - name: Filter output and populate the list of rule set names
      debug:
        msg: "Rule set name: {{ item.0.name }}, rule number: {{ item.1.number }}"
      loop: "{{ output.gathered[0]['rule_sets'] | subelements('rules') }}"

这样产生的输出如下:

代码语言:javascript
复制
"Rule set name: ruleset-1, rule number: 1"
"Rule set name: ruleset-1, rule number: 2"
"Rule set name: ruleset-1, rule number: 15"
"Rule set name: ruleset-1, rule number: 20"
"Rule set name: ruleset-2, rule number: 1"
"Rule set name: ruleset-2, rule number: 2"

我有点困在从这里去的地方了。我觉得我需要像下面这样将信息过滤到嵌套列表中,然后以某种方式循环vyos.vyos.vyos_firewall_rules模块来更新每个规则集名称和规则号。

代码语言:javascript
复制
firewall_rules:
   ruleset-1:
     1
     2
     15
     20
   ruleset-2
     1
     2

我还没有弄清楚如何创建嵌套列表,或者我是否需要嵌套列表。

我对Ansible相对来说是新手,所以如果有人能给我指明正确的方向,我会很感激的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-10 09:51:47

您可以先创建字典。

代码语言:javascript
复制
    - set_fact:
        firewall_rules: "{{ dict(rsets|zip(rules)) }}"
      vars:
        rsets: "{{ output.gathered.0.rule_sets|
                   map(attribute='name')|list }}"
        rules: "{{ output.gathered.0.rule_sets|
                   map(attribute='rules')|
                   map('map', attribute='number')|list }}"

给出

代码语言:javascript
复制
  firewall_rules:
    ruleset-1:
    - 1
    - 2
    - 15
    - 20
    ruleset-2:
    - 1
    - 2

然后使用Jinja创建结构。

代码语言:javascript
复制
    - debug:
        var: _config|from_yaml
      vars:
        _config: |-
          - afi: ipv4
            rule_sets:
          {% for set, rules in firewall_rules.items() %}
              - name: {{ set }}
                rules:
          {% for rule in rules %}
                  - number: {{ rule }}
          {% endfor %}
          {% endfor %}

给出

代码语言:javascript
复制
  _config|from_yaml:
  - afi: ipv4
    rule_sets:
    - name: ruleset-1
      rules:
      - number: 1
      - number: 2
      - number: 15
      - number: 20
    - name: ruleset-2
      rules:
      - number: 1
      - number: 2

使结构适合您的需要,并在模块中使用它。

代码语言:javascript
复制
- vyos.vyos.vyos_firewall_rules:
    config: "{{ _config|from_yaml }}"
  vars:
    _config: |-
    ...

Q:“{ _config|from_yaml }的输出没有保留连字符。”

A:您看到的格式取决于回调插件。如果您希望看到YAML将回调设置为yaml

代码语言:javascript
复制
shell> ANSIBLE_STDOUT_CALLBACK=yaml ansible-playbook test-753.yml

或将内容复制到文件中。

代码语言:javascript
复制
    - copy:
        dest: test-753-out.yml
        content: |
          {{ _config }}
      vars:
        _config: |-
          - afi: ipv4
            rule_sets:
          {% for set, rules in firewall_rules.items() %}
              - name: {{ set }}
                rules:
          {% for rule in rules %}
                  - number: {{ rule }}
          {% endfor %}
          {% endfor %}

给出

代码语言:javascript
复制
shell> cat test-753-out.yml
- afi: ipv4
  rule_sets:
    - name: ruleset-1
      rules:
        - number: 1
        - number: 2
        - number: 15
        - number: 20
    - name: ruleset-2
      rules:
        - number: 1
        - number: 2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71815002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档