jenkins Ansible:如何从OpenShift 'oc'命令响应中获取结构化的YAML?

3npbholx  于 2023-05-16  发布在  Jenkins
关注(0)|答案(1)|浏览(195)

Ansible在Jenkins上启动,我想连接到OpenShift并获取当前实体(例如,路由)。
目标:获得一个文件,其中所有实体由---分隔。
我尝试使用to_yamlfrom_yaml等与oc --server shell命令,但到目前为止没有任何效果。
获取嵌套部分的最简单方法是什么?从stdout中提取items的最佳方法是什么?还是干脆走别的路更好?例如,不使用shell模块?
现在我试着这样做:

- name: Get K8s items
    register: getItems
    shell: oc --server {{ os_project.host }} --namespace {{ os_project.project }} --token {{ os_token }} get -o yaml route.route.openshift.io

  - name: Write united config to file
    copy:
      content: "{{ getItems.stdout }}"
      dest: processed_templates/os_backup/os_dump_{{ version }}.yml

我得到以下输出:

apiVersion: v1
items:
- apiVersion: route.openshift.io/v1
  kind: Route
  metadata:
    annotations:
      haproxy.router.openshift.io/balance: roundrobin
    <...>
      kind: Service
      name: ingressgateway-ift-shared-https-svc
      weight: 100
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

我如何得到这样的输出:

apiVersion: route.openshift.io/v1
kind: Route
metadata:
  annotations:
    haproxy.router.openshift.io/balance: roundrobin
  <...>
    kind: Service
    name: ingressgateway-ift-shared-https-svc
    weight: 100
9rbhqvlz

9rbhqvlz1#

  • stdout中取出items的最佳方法是什么?*

根据所提供的信息,最小示例剧本

---
- hosts: localhost
  become: false
  gather_facts: false

  vars:

    getItems:
      stdout:
        apiVersion: v1
        items:
        - apiVersion: route.openshift.io/v1
          kind: Route
          metadata:
            annotations:
              haproxy.router.openshift.io/balance: roundrobin
              kind: Service
              name: ingressgateway-ift-shared-https-svc
              weight: 100
        kind: List
        metadata:
          resourceVersion: ""
          selfLink: ""

  tasks:

  - debug:
      msg: "{{ getItems.stdout['items'] | first }}"

结果转换为请求的输出

TASK [debug] ******************************************
ok: [localhost] =>
  msg:
    apiVersion: route.openshift.io/v1
    kind: Route
    metadata:
      annotations:
        haproxy.router.openshift.io/balance: roundrobin
        kind: Service
        name: ingressgateway-ift-shared-https-svc
        weight: 100
  • 由于输出是一个字典,因此可以通过getItems.stdout['items']获得键的值。
  • 返回一个只有一个元素的列表。由于最终结果应该再次是一个字典,因此可以只过滤first元素。

相关问题