【问题标题】:Shell Script to write configmap编写 configmap 的 Shell 脚本
【发布时间】:2022-11-12 07:18:33
【问题描述】:

寻找一些关于编写 shell 脚本以生成配置映射以在我的集群中使用的帮助/指导。我想编写一个 shell 脚本来循环遍历值的映射或字典来填写配置映射。

例子:

apiVersion: v1
kind: ConfigMap
metadata:
  annotations:
    meta.helm.sh/release-name: prometheus-adapter
    meta.helm.sh/release-namespace: prometheus
  labels:
    app.kubernetes.io/component: metrics
    app.kubernetes.io/instance: prometheus-adapter
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: prometheus-adapter
    app.kubernetes.io/part-of: prometheus-adapter
    app.kubernetes.io/version: v0.10.0
    helm.sh/chart: prometheus-adapter-3.4.1
  name: prometheus-adapter
  namespace: prometheus
data:
  config.yaml: |
    rules:
      - seriesQuery: 'haproxy_backend_http_requests_total{namespace!="", pod!="", proxy="pod1"}'
        metricsQuery: 'sum(rate(haproxy_backend_http_requests_total{namespace!="", pod!="", proxy="pod1"}[2m])) by (<<.GroupBy>>)'
        resources:
          overrides:
            namespace: {resource: "namespace"}
        name:
          matches: "^(.*)_total$"
          # The metric we want the individual pod to match
          as: "dfs_requests_per_second"

我想编写一个 shell 脚本,添加来自 -seriesQuery 及以下的所有内容,替换存在赋值变量的值,例如 proxy="value" 和 [2m] 度量间隔。 对于每个键/值对,它会添加带有缩进的相同块。有点像这样

吊舱名称:[吊舱 1,吊舱 2] 间隔:[2m,3m]

      - seriesQuery: 'haproxy_backend_http_requests_total{namespace!="", pod!="", proxy="pod1"}'
        metricsQuery: 'sum(rate(haproxy_backend_http_requests_total{namespace!="", pod!="", proxy="pod1"}[2m])) by (<<.GroupBy>>)'
        resources:
          overrides:
            namespace: {resource: "namespace"}
        name:
          matches: "^(.*)_total$"
          # The metric we want the individual pod to match
          as: "dfs_requests_per_second"
          - seriesQuery: 'haproxy_backend_http_requests_total{namespace!="", pod!="", proxy="pod2"}'
        metricsQuery: 'sum(rate(haproxy_backend_http_requests_total{namespace!="", pod!="", proxy="pod2"}[3m])) by (<<.GroupBy>>)'
        resources:
          overrides:
            namespace: {resource: "namespace"}
        name:
          matches: "^(.*)_total$"
          # The metric we want the individual pod to match
          as: "dfs_requests_per_second"

并将其附加到下面的所有内容中

apiVersion: v1
kind: ConfigMap
metadata:
  annotations:
    meta.helm.sh/release-name: prometheus-adapter
    meta.helm.sh/release-namespace: prometheus
  labels:
    app.kubernetes.io/component: metrics
    app.kubernetes.io/instance: prometheus-adapter
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: prometheus-adapter
    app.kubernetes.io/part-of: prometheus-adapter
    app.kubernetes.io/version: v0.10.0
    helm.sh/chart: prometheus-adapter-3.4.1
  name: prometheus-adapter
  namespace: prometheus
data:
  config.yaml: |
    rules:

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    最好使用支持 YAML 的模板引擎,但前提是您的 pod 名称和间隔不包含任何有问题的字符,您可以使用 bash 轻松生成配置文件:

    #!/bin/bash
    
    pods=( pod1 pod2 )
    intervals=( 2m 3m )
    
    cat <<'EOF'
    apiVersion: v1
    kind: ConfigMap
    metadata:
      annotations:
        meta.helm.sh/release-name: prometheus-adapter
        meta.helm.sh/release-namespace: prometheus
      labels:
        app.kubernetes.io/component: metrics
        app.kubernetes.io/instance: prometheus-adapter
        app.kubernetes.io/managed-by: Helm
        app.kubernetes.io/name: prometheus-adapter
        app.kubernetes.io/part-of: prometheus-adapter
        app.kubernetes.io/version: v0.10.0
        helm.sh/chart: prometheus-adapter-3.4.1
      name: prometheus-adapter
      namespace: prometheus
    data:
      config.yaml: |
        rules:
    EOF
    
    for i in "${!pods[@]}"
    do
    cat <<EOF
          - seriesQuery: 'haproxy_backend_http_requests_total{namespace!="", pod!="", proxy="${pods[i]}"}'
            metricsQuery: 'sum(rate(haproxy_backend_http_requests_total{namespace!="", pod!="", proxy="${pods[i]}"}[${intervals[i]}])) by (<<.GroupBy>>)'
            resources:
              overrides:
                namespace: {resource: "namespace"}
            name:
              matches: "^(.*)_total$"
              # The metric we want the individual pod to match
              as: "dfs_requests_per_second"
    EOF
    done
    

    【讨论】: