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
关键逻辑说明
- 变量加载:通过循环一次性加载两个JSON变量文件,确保后续能访问到
createNetwork和machines两个变量集合。 - 网络筛选:使用
selectattr过滤器,结合inventory_hostname(当前执行任务的主机名),从createNetwork列表中筛选出ID存在于当前主机networks配置中的网络项,存入filtered_networks变量。 - 循环执行:遍历筛选后的
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
相关产品推荐
相关产品推荐

