셸을 사용하여 Alertmanager 구성 파일에 새 웹후크를 연결합니다.

셸을 사용하여 Alertmanager 구성 파일에 새 웹후크를 연결합니다.

알림을 위해 Alertmanager를 사용하는데 기본적으로 alertmanager웹훅은 하나만 있습니다. 내 요구 사항에 따라 웹훅도 필요합니다.

기존 구성

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'

하지만 새로운 웹훅을 첨부할 수는 없습니다.

답변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

명령줄에서 새 웹후크의 이름과 해당 URL을 전달하려면 이를 쉘 변수를 사용하여 문자열로 표현식에 삽입하지 말고 yq대신 다음과 같은 경우 yq변수를 올바르게 생성하십시오( 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래퍼이기 때문에 jqyq표현식은 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실제로 두 가지 인기 있는 프로젝트 가 있는데 ,유일한 사람@Kusalananda 추천 및맥파라의 yq. 두 번째 버전(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

관련 정보