嵌套嵌套循环的Ansible字典

舒适曲线2000

我以前尝试过使用像这样的字典结构,但从来没有让它在模板中工作。我需要遍历servers不匹配的所有第一级密钥的子网/ subnet_cidrs inventory_hostname

---
- name: Test Playbook
  hosts: localhost
  gather_facts: no

  vars:
    servers: 
      alpha.lan:
        eth0:
          subnet: 192.168.0.0
          subnet_mask: 255.255.255.0
          subnet_cidr: 24
        eth1:
          subnet: 192.168.1.0
          subnet_mask: 255.255.255.0
          subnet_cidr: 24
      bravo.lan:
        eth0:
          subnet: 172.16.0.0
          subnet_mask: 255.255.252.0
          subnet_cidr: 22
        eth1:
          subnet: 172.16.4.0
          subnet_mask: 255.255.252.0
          subnet_cidr: 22

  tasks:
    - debug:
        msg: "{{something['subnet']}}/{{something['subnet_cidr']}}"
      loop: "{{servers...}}"

因此,如果此剧本在alpha.lan上运行,我会得到

"msg": "172.16.0.0/22"
"msg": "172.16.4.0/22"

这就是我在模板中使用它的方式,能够在最终输出中使用item和item2的值:

{% for key,item in servers.items() if key != inventory_hostname %}
{% for key2,item2 in item.items() %}
{{item2['subnet']}}/{{item2['subnet_cidr']}}
{% endfor %}
{% endfor %}

我希望能够在防火墙命令中独立使用或对每个第三级密钥(子网,subnet_mask,subnet_cidr)进行测试。在此先感谢您的帮助。

我尝试使用的一些信息来源:https :
//docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html
https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html
https ://jinja.palletsprojects.com/zh/2.11.x/templates/#list-of-builtin-filters

弗拉基米尔·博特卡

给字典服务器剧本

- hosts: alpha.lan,bravo.lan
  tasks:
    - debug:
        msg: "{{ item.value.subnet }}/{{ item.value.subnet_cidr }}"
      loop: "{{ servers[host]|dict2items }}"
      loop_control:
        label: "{{ item.key }}"
      vars:
        host: "{{ servers|difference([inventory_hostname])|first }}"

给(删节)

TASK [debug] ****
ok: [alpha.lan] => (item=eth0) => 
  msg: 172.16.0.0/22
ok: [alpha.lan] => (item=eth1) => 
  msg: 172.16.4.0/22
ok: [bravo.lan] => (item=eth0) => 
  msg: 192.168.0.0/24
ok: [bravo.lan] => (item=eth1) => 
  msg: 192.168.1.0/24

问:第一级密钥列表,...遍历服务器...,同时也遍历第二级密钥

给定字典

servers: 
  alpha.lan:
    eth0:
      subnet: 192.168.0.0
      subnet_cidr: 24
    eth1:
      subnet: 192.168.1.0
      subnet_cidr: 24
  bravo.lan:
    eth0:
      subnet: 172.16.0.0
      subnet_cidr: 22
    eth1:
      subnet: 172.16.4.0
      subnet_cidr: 22
  charlie.lan:
    eth0:
      subnet: 172.17.0.0
      subnet_cidr: 22
    eth1:
      subnet: 172.17.4.0
      subnet_cidr: 22

和任务

shell> cat loop-net.yml
- debug:
    msg: "inventory: {{ inventory_hostname }}
          server: {{ outer_item }}
          net: {{ item.value.subnet }}/{{ item.value.subnet_cidr }}"
  loop: "{{ servers[outer_item]|dict2items }}"
  loop_control:
    label: "{{ item.key }}"

下面的剧本

shell> cat pb.yml
- hosts: alpha.lan,bravo.lan,charlie.lan
  tasks:
    - include_tasks: loop-net.yml
      loop: "{{ servers.keys()|difference([inventory_hostname]) }}"
      loop_control:
        loop_var: outer_item

shell> ansible-playbook pb.yml | grep msg | sort
  msg: 'inventory: alpha.lan server: bravo.lan net: 172.16.0.0/22'
  msg: 'inventory: alpha.lan server: bravo.lan net: 172.16.4.0/22'
  msg: 'inventory: alpha.lan server: charlie.lan net: 172.17.0.0/22'
  msg: 'inventory: alpha.lan server: charlie.lan net: 172.17.4.0/22'
  msg: 'inventory: bravo.lan server: alpha.lan net: 192.168.0.0/24'
  msg: 'inventory: bravo.lan server: alpha.lan net: 192.168.1.0/24'
  msg: 'inventory: bravo.lan server: charlie.lan net: 172.17.0.0/22'
  msg: 'inventory: bravo.lan server: charlie.lan net: 172.17.4.0/22'
  msg: 'inventory: charlie.lan server: alpha.lan net: 192.168.0.0/24'
  msg: 'inventory: charlie.lan server: alpha.lan net: 192.168.1.0/24'
  msg: 'inventory: charlie.lan server: bravo.lan net: 172.16.0.0/22'
  msg: 'inventory: charlie.lan server: bravo.lan net: 172.16.4.0/22'

以下任务给出了相同的结果

    - debug:
        msg: "inventory: {{ inventory_hostname }}
              server: {{ item.0.key }}
              net: {{ item.1.net }}"
      with_subelements:
        - "{{ my_servers|from_yaml|dict2items }}"
        - value
      vars:
        my_servers: |
          {% for key,item in servers.items() if key != inventory_hostname %}
            {{ key }}:
          {% for key2,item2 in item.items() %}
              - {ifc: {{ key2 }}, net: {{ item2.subnet }}/{{ item2.subnet_cidr }}}
          {% endfor %}
          {% endfor %}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Ansible:循环遍历嵌套的字典变量

来自分类Dev

嵌套字典上的For循环

来自分类Dev

循环创建嵌套字典

来自分类Dev

从 For 循环创建嵌套字典

来自分类Dev

Ansible中使用列表和字典的嵌套循环

来自分类Dev

嵌套变量的Ansible循环

来自分类Dev

Ansible中的嵌套循环

来自分类Dev

如何从嵌套循环返回字典

来自分类Dev

无循环访问嵌套字典

来自分类Dev

在 ansible 的 if 语句中嵌套 for 循环

来自分类Dev

使用for循环在字典中嵌套字典迭代

来自分类Dev

在Jinja2模板中循环Ansible变量数组以创建嵌套字典

来自分类Dev

Ansible:如何替换嵌套字典中的值?

来自分类Dev

在Python中循环浏览嵌套字典

来自分类Dev

在Python中使用for循环创建嵌套字典

来自分类Dev

嵌套循环在Ansible Jinja模板中

来自分类Dev

循环中的Ansible和嵌套变量

来自分类Dev

Ansible自定义嵌套循环

来自分类Dev

Ansible嵌套循环交叉列表参考?

来自分类Dev

结果中嵌套项目的Ansible循环

来自分类Dev

如何通过循环嵌套字典并列出字典?

来自分类Dev

循环嵌套嵌套的诺言

来自分类Dev

在同时嵌套嵌套循环

来自分类Dev

字典与嵌套字典的列表

来自分类Dev

嵌套循环

来自分类Dev

嵌套循环

来自分类Dev

嵌套if循环

来自分类Dev

如何在Ansible中使用嵌套变量(字典键)?

来自分类Dev

如何在Ansible中从字典中提取深度嵌套的数据