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

如何编写Ansible Playbook遍历GCP实例磁盘并校验匹配

如何用Ansible Playbook检查GCP实例磁盘的deviceName与磁盘名称是否匹配

需求

遍历GCP项目中的所有实例,提取每个实例挂载磁盘的deviceName和source字段末尾的磁盘名称,筛选出两者不匹配的项。

已完成的基础步骤

已通过gcp_compute_instance_info模块获取实例信息,代码如下:

- name: 获取实例信息
  gcp_compute_instance_info:
    zone: us-central1-a
    filters:
    - name = "{{ machine1 }}"
    project: production-project
    auth_kind: "{{ gcp_cred_kind }}"
    service_account_file: "{{ gcp_cred_file }}"
  register: server_reg

磁盘数据返回示例

模块返回的单磁盘数据结构如下(仅展示关键字段):

{
    "msg": {
        "deviceName": "test-server",
        "source": "https://www.googleapis.com/compute/v1/projects/stl-production-project/zones/us-central1-a/disks/test-server"
    }
}
{
    "msg": {
        "deviceName": "hahahaha",
        "source": "https://www.googleapis.com/compute/v1/projects/production-project/zones/us-central1-a/disks/test-data"
    }
}

其中第二个磁盘的deviceName与source末尾的磁盘名称不匹配,需要识别这类情况。

完整Playbook实现

以下Playbook会遍历所有实例的磁盘,提取并对比字段,输出不匹配的项:

---
- name: 检查GCP实例磁盘deviceName与磁盘名称是否匹配
  hosts: localhost
  gather_facts: no
  vars:
    gcp_project: production-project
    gcp_zone: us-central1-a
    gcp_cred_kind: serviceaccount
    gcp_cred_file: /path/to/your/service-account-key.json

  tasks:
    - name: 获取所有实例信息
      gcp_compute_instance_info:
        zone: "{{ gcp_zone }}"
        project: "{{ gcp_project }}"
        auth_kind: "{{ gcp_cred_kind }}"
        service_account_file: "{{ gcp_cred_file }}"
      register: all_instances

    - name: 遍历实例,检查磁盘匹配情况
      debug:
        msg: |
          实例: {{ instance.name }}
          不匹配的磁盘:
          {% for disk in instance.disks %}
              {% set disk_name = disk.source.split('/')[-1] %}
              {% if disk.deviceName != disk_name %}
              - deviceName: {{ disk.deviceName }} | 实际磁盘名称: {{ disk_name }}
              {% endif %}
          {% endfor %}
      loop: "{{ all_instances.resources }}"
      loop_control:
        loop_var: instance
      when: >
        instance.disks | selectattr('deviceName', 'ne', 
        (disk.source.split('/')[-1] if disk.source else '')) | list | length > 0

关键逻辑说明

  1. 获取所有实例:移除filters参数可获取指定区域内的所有实例,若需筛选特定实例可保留原过滤规则。
  2. 提取磁盘名称:使用split('/')[-1]拆分source字段的URL,取最后一段作为实际磁盘名称。
  3. 对比与筛选:通过Jinja2模板遍历每个磁盘,对比deviceName和提取的磁盘名称,仅输出不匹配的项。
  4. 条件输出:when条件确保仅当实例存在不匹配磁盘时才输出信息,避免无意义的空输出。

内容的提问来源于stack exchange,提问作者Philip Shangguan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:57:41