You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible Playbook双循环:仅创建目标主机匹配的网络

Ansible双循环实现仅创建目标主机存在的网络

实现思路

  • 加载所有必要的变量文件:Database_vars.json 和 machines.json
  • 提取当前目标主机在machines.json中配置的所有网络ID
  • 筛选Database_vars.json中createNetwork列表里,ID匹配当前主机网络ID的项
  • 遍历筛选后的结果,执行网络创建任务

修改后的完整Playbook

---
# Play 1 : Create Networks
- name: create networks based on options in Database_vars.json
  hosts: target
  tasks:
    - name: Load all required variable files
      include_vars:
        file: "{{ item }}"
      loop:
        - "Database_vars.json"
        - "machines.json"
      tags: [always]

    - name: Filter networks to create (only those present in current host's config)
      set_fact:
        filtered_networks: "{{ createNetwork | selectattr('id', 'in', machines[inventory_hostname].networks.keys()) | list }}"
      tags: [createNetwork]

    - name: Create Networks(s)
      include_tasks:
        file: createNetworkSub.yaml
        apply:
          tags:
            - createNetwork
      loop: "{{ filtered_networks }}"
      tags: [createNetwork, never]
      ignore_errors: yes

关键逻辑说明

  1. 变量加载:通过循环一次性加载两个JSON变量文件,确保后续能访问到createNetwork和machines两个变量集合。
  2. 网络筛选:使用selectattr过滤器,结合inventory_hostname(当前执行任务的主机名),从createNetwork列表中筛选出ID存在于当前主机networks配置中的网络项,存入filtered_networks变量。
  3. 循环执行:遍历筛选后的filtered_networks列表,调用子任务文件执行创建操作,确保只创建当前主机实际配置的网络。

补充说明

  • 确保machines.json中的主机名和Ansible inventory中的主机名完全一致(示例中为oda8m032),否则machines[inventory_hostname]会无法匹配到对应配置。
  • 子任务文件createNetworkSub.yaml中可直接使用循环变量item访问网络的id和name属性,也可通过machines[inventory_hostname].networks[item.id]获取该网络对应的接口和IP信息。

内容的提问来源于stack exchange,提问作者Akash-BLR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 22:46:11