如何使用omit为无domainmembership标签的GCP VM配置ansible_host?
GCP Ansible清单动态设置ansible_host
原有配置
--- plugin: google.cloud.gcp_compute projects: - project1 - project2 - project3 filters: #- status = RUNNING #- scheduling.automaticRestart = true AND status = RUNNING keyed_groups: # Create groups from GCE labels - prefix: gcp key: labels - prefix: gcp_project key: project hostnames: # List host by name instead of the default public ip - name compose: ansible_host: name ~ "." ~ labels.domainmembership ~ ".local"
当VM(如server1)带有值为domain1的domainmembership标签时,ansible_host会被设置为:
ansible_host: "server1.domain1.local"
解决方案
修改compose段的配置,通过Jinja2条件表达式结合omit实现动态赋值:
方案1:直接指定内网IP
当标签为空/不存在时,将ansible_host设为VM的第一个网卡内网IP:
compose: ansible_host: >- {% if labels.get('domainmembership', '') | trim %} {{ name ~ "." ~ labels.domainmembership ~ ".local" }} {% else %} {{ networkInterfaces[0].networkIP }} {% endif %}
方案2:使用omit回退默认值
如果希望标签无效时不强制设置ansible_host,让Ansible自动使用hostnames配置的标识或默认IP,可改用omit:
compose: ansible_host: >- {% if labels.get('domainmembership', '') | trim %} {{ name ~ "." ~ labels.domainmembership ~ ".local" }} {% else %} {{ omit }} {% endif %}
逻辑说明
labels.get('domainmembership', ''):避免标签不存在时抛出错误,默认返回空字符串trim:过滤标签值仅含空格的无效情况- 条件判断实现两种场景的自动切换,满足不同需求
内容的提问来源于stack exchange,提问作者J1raya
相关产品推荐
相关产品推荐

