알림을 위해 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
yq
JSON 파서 주변의 YAML 인식 래퍼인 를 사용하여 필요한 부분을 배열에 추가한 다음 추가 키 값을 jq
배열의 항목에 추가합니다.receivers
webhook_configs
receivers
명령줄에서 새 웹후크의 이름과 해당 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
래퍼이기 때문에 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
실제로 두 가지 인기 있는 프로젝트 가 있는데 ,유일한 사람@Kusalananda 추천 및맥파라의 yq
. 두 번째 버전(yq 버전 4.11.2)에서 동일한 작업을 수행하는 방법은 다음과 같습니다.
yq e -P '
.receivers += [{"name":"web.hook2", "webhook_configs": [{"url":""}]}] |
.receivers[].webhook_configs += [{"continue":true}]
' infile.yaml
스위치는 -P
yaml을 아름답게 인쇄합니다. 산출:
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