我一直在尝试创建一个可定期运行的游戏手册,以遍历所有Vyos防火墙规则,并确保“启用日志”命令的存在,以防有人忘记将日志添加到防火墙规则。我已经找到了vyos.vyos.vyos_firewall_rules模块,我认为它对于我需要做的工作来说是完美的。
唯一的问题是,这个模块要求您输入要更新的每个防火墙规则的规则集名称和规则号。但是,在我的例子中,我希望这是自动完成的,Ansible通过每个防火墙规则集和存在的相关规则,并确保对每个规则启用日志记录。我需要这样的东西:
- 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收集了所有规则集和相关规则的转储,并对其进行了筛选,列出了每个规则集名称以及每个关联的规则号:
- 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') }}"这样产生的输出如下:
"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模块来更新每个规则集名称和规则号。
firewall_rules:
ruleset-1:
1
2
15
20
ruleset-2
1
2我还没有弄清楚如何创建嵌套列表,或者我是否需要嵌套列表。
我对Ansible相对来说是新手,所以如果有人能给我指明正确的方向,我会很感激的。
发布于 2022-04-10 09:51:47
您可以先创建字典。
- 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 }}"给出
firewall_rules:
ruleset-1:
- 1
- 2
- 15
- 20
ruleset-2:
- 1
- 2然后使用Jinja创建结构。
- 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 %}给出
_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使结构适合您的需要,并在模块中使用它。
- vyos.vyos.vyos_firewall_rules:
config: "{{ _config|from_yaml }}"
vars:
_config: |-
...Q:“{ _config|from_yaml }的输出没有保留连字符。”。
A:您看到的格式取决于回调插件。如果您希望看到YAML将回调设置为yaml
shell> ANSIBLE_STDOUT_CALLBACK=yaml ansible-playbook test-753.yml或将内容复制到文件中。
- 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 %}给出
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: 2https://stackoverflow.com/questions/71815002
复制相似问题