Ansible:如何从OpenShift 'oc'命令响应中获取结构化YAML?
解决方案
方法一:使用Ansible官方K8s模块(推荐)
直接用Ansible的k8s_info模块获取OpenShift路由,无需调用oc命令,能直接拿到结构化数据,处理更可靠。
示例代码:
- name: 获取OpenShift路由信息 k8s_info: host: "{{ os_project.host }}" api_key: "{{ os_token }}" namespace: "{{ os_project.project }}" kind: Route api_version: route.openshift.io/v1 register: route_data - name: 生成按---分隔的路由配置文件 copy: content: | {% for route in route_data.resources %} {{ route | to_yaml }} --- {% endfor %} dest: "processed_templates/os_backup/os_dump_{{ version }}.yml"
说明:
k8s_info直接返回路由的结构化列表,存储在route_data.resources中- 通过Jinja2循环遍历每个路由,用
to_yaml转为YAML格式,每个路由后添加---分隔符
方法二:改进现有Shell模块的实现
如果必须使用oc命令,需将返回的stdout解析为YAML结构,提取items列表后再处理:
示例代码:
- name: 获取K8s路由列表 register: getItems shell: oc --server {{ os_project.host }} --namespace {{ os_project.project }} --token {{ os_token }} get -o yaml route.route.openshift.io - name: 生成按---分隔的配置文件 copy: content: | {% for item in (getItems.stdout | from_yaml).items %} {{ item | to_yaml }} --- {% endfor %} dest: "processed_templates/os_backup/os_dump_{{ version }}.yml"
说明:
- 用
from_yaml把oc命令返回的字符串转为Ansible可处理的字典结构 - 提取其中的
items列表,循环每个对象转为YAML,添加分隔符---
两种方法最终都会生成你需要的格式:每个路由的完整YAML定义用---分隔,不含外层的List结构。
内容的提问来源于stack exchange,提问作者malltaf
相关产品推荐
相关产品推荐

