Ansible使用gcp_compute_disk模块从快照创建GCP磁盘失败问题
Ansible 2.9 使用gcp_compute_disk从快照创建磁盘的修复方案
问题根因
source_snapshot参数传值格式错误:Ansible 2.9内置的gcp_compute_disk模块要求该参数传入快照的selfLink字符串,你当前传入的是包含selfLink的字典结构,模块无法识别该参数,直接按空白磁盘逻辑创建。如果你是通过gcp_compute_snapshot模块生成快照并注册为变量,需要取该变量的selfLink属性,而非直接传入整个变量。- 磁盘类型与磁盘zone不匹配:你创建磁盘的zone是
us-central1-a,但硬编码的磁盘类型URL中zone为us-central1-b,参数校验失败后会被模块忽略,进一步导致快照逻辑不生效。
修复后配置示例
- name: Create GCP snapshots hosts: localhost gather_facts: yes vars: gcp_project: test-project gcp_cred_kind: serviceaccount gcp_cred_file: /etc/ansible/keys/ansible-test-project-service-account-key.json zone: "us-central1-a" region: "us-central1" instancename: "test-instance" # 直接定义为字符串即可,无需套字典 snapshot_selflink: "https://www.googleapis.com/compute/v1/projects/test-project/global/snapshots/test-snapshot1" tasks: - name: create data disk from a snapshot gcp_compute_disk: name: "{{ instancename }}-data-1" description: "{{ instancename }}-data-1" zone: "{{ zone }}" project: "{{ gcp_project }}" auth_kind: "{{ gcp_cred_kind }}" service_account_file: "{{ gcp_cred_file }}" # 直接传入快照selfLink字符串 source_snapshot: "{{ snapshot_selflink }}" labels: usage: test-label # 磁盘类型的zone通过变量引用,避免不匹配 type: "https://www.googleapis.com/compute/v1/projects/test-project/zones/{{ zone }}/diskTypes/pd-standard" state: present register: disk_data
如果你的快照是通过gcp_compute_snapshot任务生成并注册到disksnapshot变量,直接将source_snapshot的值改为{{ disksnapshot.selfLink }}即可。
验证方法
修改后如果仍有问题,可加-vvv参数运行playbook,查看模块调用GCP API的请求体,确认sourceSnapshot字段是否已正确填入快照的selfLink值。
内容的提问来源于stack exchange,提问作者Thor
相关产品推荐
相关产品推荐

