如何在Ansible中基于JSON的Disk Scope条件执行磁盘配置任务
没问题,这个需求其实很好实现,核心就是把when条件和你从JSON里提取的磁盘Scope值绑定起来就行。我给你两种常用的实现方式,你可以根据现有Playbook的结构来选:
方式1:提前筛选符合条件的磁盘(推荐)
如果你的Playbook是循环处理所有磁盘,那可以先通过过滤器把Scope为New的磁盘单独筛选出来,只对这部分磁盘执行后续配置任务,这样不用给每个任务单独加条件:
# 先加载JSON配置文件到变量里 - name: 加载磁盘配置JSON include_vars: file: /path/to/your/disk_config.json name: disk_config # 筛选出Scope为New的磁盘,存到变量 - name: 筛选需要配置的新磁盘 set_fact: target_disks: "{{ disk_config.Disks | selectattr('Scope', 'equalto', 'New') | list }}" # 循环处理符合条件的磁盘,所有配置任务都放在block里 - name: 执行新磁盘的分区/卷组/挂载配置 loop: "{{ target_disks }}" loop_control: loop_var: current_disk block: - name: 创建磁盘分区 parted: device: "{{ current_disk.device_path }}" number: 1 state: present part_start: 0% part_end: 100% - name: 创建卷组 lvg: vg: "{{ current_disk.vg_name }}" pvs: "{{ current_disk.device_path }}1" state: present - name: 创建逻辑卷 lvol: vg: "{{ current_disk.vg_name }}" lv: "{{ current_disk.lv_name }}" size: "{{ current_disk.lv_size }}" state: present - name: 创建文件系统 filesystem: fstype: "{{ current_disk.fs_type }}" dev: "/dev/{{ current_disk.vg_name }}/{{ current_disk.lv_name }}" - name: 挂载逻辑卷 mount: path: "{{ current_disk.mount_point }}" src: "/dev/{{ current_disk.vg_name }}/{{ current_disk.lv_name }}" fstype: "{{ current_disk.fs_type }}" state: mounted
这种方式的好处是逻辑清晰,只循环处理需要配置的磁盘,避免无效的循环判断。
方式2:给每个任务单独加条件判断
如果你的Playbook是逐个任务处理所有磁盘(比如先匹配所有磁盘ID,再统一执行分区),那可以给每个磁盘配置任务单独加上when条件,判断当前磁盘的Scope是否为New:
# 加载JSON配置 - name: 加载磁盘配置JSON include_vars: file: /path/to/your/disk_config.json name: disk_config # 匹配系统磁盘与JSON中的DiskID(你的现有逻辑) - name: 匹配磁盘ID对应的系统设备 set_fact: matched_disks: "{{ matched_disks | default([]) + [{'disk': item, 'device': ansible_facts.devices[dev].device}] }}" loop: "{{ disk_config.Disks }}" loop_control: loop_var: item vars: dev: "{{ ansible_facts.devices.keys() | select('match', item.DiskID | regex_replace('^.*-', '')) | first }}" # 给每个配置任务加when条件 - name: 创建磁盘分区(仅Scope为New时执行) parted: device: "{{ item.device }}" number: 1 state: present loop: "{{ matched_disks }}" when: item.disk.Scope == 'New' - name: 创建卷组(仅Scope为New时执行) lvg: vg: "{{ item.disk.vg_name }}" pvs: "{{ item.device }}1" loop: "{{ matched_disks }}" when: item.disk.Scope == 'New' # 后续的逻辑卷、文件系统、挂载任务都按这个方式添加when条件即可
额外提示
你可以用ansible-playbook -C(检查模式)来测试条件是否生效,执行后会看到哪些任务会被标记为changed(会执行),哪些会被skipped(跳过),方便验证逻辑是否正确。
内容的提问来源于stack exchange,提问作者Alessio Dini
相关产品推荐
相关产品推荐

