シェルを使用して Alertmanager 構成ファイルに新しい Web フックを関連付けます。

シェルを使用して Alertmanager 構成ファイルに新しい Web フックを関連付けます。

通知にAlertmanagerを使用しますが、デフォルトではalertmanagerWebフックは1つだけです。私の要件に応じてWebフックも必要です。

既存の構成

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  group_wait: {{ getsdcv "system" "group_wait" "10s"}}
  group_interval: {{ getsdcv "system" "group_interval" "10s"}}
  {{- $repeat_interval := getsdcv "system" "repeat_interval" "" }}
  {{- if not (eq $repeat_interval "") }}
  repeat_interval: {{ $repeat_interval }}
  {{- end }}
  receiver: 'web.hook'
receivers:
- name: 'web.hook'
  webhook_configs:
  - url: 'http://{{ getsdcv "system" "ip" "localhost"}}:{{ getsdcv "system" "port" "8005"}}/'

inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance'] 

新しいウェブフックを追加した後

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  group_wait: {{ getsdcv "system" "group_wait" "10s"}}
  group_interval: {{ getsdcv "system" "group_interval" "10s"}}
  {{- $repeat_interval := getsdcv "system" "repeat_interval" "" }}
  {{- if not (eq $repeat_interval "") }}
  repeat_interval: {{ $repeat_interval }}
  {{- end }}
  receiver: 'web.hook'
  routes:
    - receiver: "web.hook"
      continue: true
    - receiver: "web.hook1"
      match:
        alertname: BusinessKpiDown
      continue: true
receivers:
- name: 'web.hook'
  webhook_configs:
  - url: 'http://{{ getsdcv "system" "ip" "localhost"}}:{{ getsdcv "system" "port" "8005"}}/'

- name: 'web.hook1'
  webhook_configs:
  - url: 'http://0.0.0.0:8010/hooks/my-webhook'

inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance'] 

シェルスクリプトでこれを試しましたが失敗しました。

awk -v RS='^$' '{$0=gensub(/(receivers:\s+users:)(\s+)/,"\\1\\2- name: 'web.hook2'\\2",1)}1'

ただし、新しいWebフックを添付することはできません。

答え1

注:この回答は、次の非常に異なる入力文書に適用されます。

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 12h
  receiver: 'web.hook'
receivers:
- name: 'web.hook'
  webhook_configs:
  - url: ''
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

これで質問の文書が修正され、有効なYAMLファイルにはなりません。残念ながら、この回答はそのまま使用できません。興味深いかもしれない方のためにここに残しておきます。


receivers配列に次の項目を追加したいようです。

- name: web.hook2
  webhook_configs:
    - url: ''

...そしてそこには

- continue: true

receivers要素にwebhook_configs

私たちはこれを行うことができます。yq私達はからまで利用できますhttps://kislyuk.github.io/yq/:

yq -y '
    .receivers += [{"name":"web.hook2","webhook_configs":[{"url":""}]}] | 
    .receivers |= map(.webhook_configs += [{"continue":true}])' file.yaml

yqJSONパーサーの周りのYAML対応ラッパーで、必要な部分を配列に追加し、追加のキー値を配列内のjq項目に追加します。receiverswebhook_configsreceivers

コマンドラインで新しいWebフックの名前とそのURLを渡すには、シェル変数を使用して文字列として式に挿入しないyqyqくださいyq。必要):

myname='web.hook2'
myurl=''

yq -y --arg name "$myname" --arg url "$myurl" '
    .receivers += [{"name":$name,"webhook_configs":[{"url":$url}]}] | 
    .receivers |= map(.webhook_configs += [{"continue":true}])' file.yaml

yq-i--in-placeまたは、オプションを使用した「内部」編集もサポートしています。

結果は質問の例を提供します。

global:
  resolve_timeout: 5m
route:
  group_by:
    - alertname
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 12h
  receiver: web.hook
receivers:
  - name: web.hook
    webhook_configs:
      - url: ''
      - continue: true
  - name: web.hook2
    webhook_configs:
      - url: ''
      - continue: true
inhibit_rules:
  - source_match:
      severity: critical
    target_match:
      severity: warning
    equal:
      - alertname
      - dev
      - instance

-Y代わりにinを使用して実行すると、混合タグのソートが停止-yします。yq

global:
  resolve_timeout: 5m
route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 12h
  receiver: 'web.hook'
receivers:
  - name: 'web.hook'
    webhook_configs:
      - url: ''
      - continue: true
  - name: web.hook2
    webhook_configs:
      - url: ''
      - continue: true
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

--indentless-lists元の文書と同様に、オプションを指定してリストのインデントを削除することもできますyq


yqラッパーなので、jqこのyq式はJSONに変換された文書を処理します。その後、文書は再びYAMLに変換されますyq。参考までに、次は式で変更された元の文書のJSONバリアントですyq

{
  "global": {
    "resolve_timeout": "5m"
  },
  "route": {
    "group_by": [
      "alertname"
    ],
    "group_wait": "10s",
    "group_interval": "10s",
    "repeat_interval": "12h",
    "receiver": "web.hook"
  },
  "receivers": [
    {
      "name": "web.hook",
      "webhook_configs": [
        {
          "url": ""
        }
      ]
    }
  ],
  "inhibit_rules": [
    {
      "source_match": {
        "severity": "critical"
      },
      "target_match": {
        "severity": "warning"
      },
      "equal": [
        "alertname",
        "dev",
        "instance"
      ]
    }
  ]
}

答え2

yq実際に2つの人気のあるプロジェクトがありますが、唯一の人@Kusalananda おすすめとマクパラの yq。 2番目のバージョン(yqバージョン4.11.2)で同じことを行う方法は次のとおりです。

yq e -P '
  .receivers += [{"name":"web.hook2", "webhook_configs": [{"url":""}]}] |
  .receivers[].webhook_configs += [{"continue":true}]
' infile.yaml

スイッチは-Pyamlを美しく印刷します。出力:

global:
  resolve_timeout: 5m
route:
  group_by:
    - alertname
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 12h
  receiver: web.hook
receivers:
  - name: web.hook
    webhook_configs:
      - url: ""
      - continue: true
  - name: web.hook2
    webhook_configs:
      - url: ""
      - continue: true
inhibit_rules:
  - source_match:
      severity: critical
    target_match:
      severity: warning
    equal:
      - alertname
      - dev
      - instance

関連情報