借助 ChatGPT 解决运维问题:Nginx Location块匹配删除

科技   2024-09-05 21:08   上海  

背景

昨天(2024年9月5日),一个运维同事在群里发布了一个需求,聊天记录如下。

image

解决过程

此时,我们直接将配置文件图片丢给GPT,并给它一个解决需求的提示词。这里就直接复制群里兄弟的聊天昨天需求提示词:

提示词如下:

比如我过滤出这个服务名,怎么删除包含这个服务名的location,整个location,因为不一定有多少行,没法按照行数删

image
image

GPT理解了我们的意思,但是没有理解很准确,群友的需求是匹配到proxy_pass 后面的地址,然后删除整个location块的内容,这里线验证下基础localhost 路由的匹配删除,再来调试其他的。

测试验证

$ cat nginx.conf 
location /dataCenterService {
    proxy_pass http://semantic-datacenter-service:31001/;
}

location /uploadDemo {
    client_max_body_size 20M;
    proxy_send_timeout 1200s;
    proxy_read_timeout 1200s;
    proxy_connect_timeout 1200s;
    send_timeout 1200s;
    proxy_pass http://intelligent-quality-inspection-service:31001/;
}

location /accountService {
    proxy_pass http://hc-account-analysis-service:31001/;
}

location /qa2020Service{
    proxy_pass http://10.0.0.22:9188/;
}

执行命令测试:

这里专门把 -i参数去掉了,这样防止意外修改文件。

$ sed  '/location \/accountService {/,/}/d' nginx.conf
location /dataCenterService {
    proxy_pass http://semantic-datacenter-service:31001/;
}

location /uploadDemo {
    client_max_body_size 20M;
    proxy_send_timeout 1200s;
    proxy_read_timeout 1200s;
    proxy_connect_timeout 1200s;
    send_timeout 1200s;
    proxy_pass http://intelligent-quality-inspection-service:31001/;
}


location /qa2020Service{
    proxy_pass http://10.0.0.22:9188/;
}

可以看到结果是符合预期了,可以将包含某个location路由的nginx块给去掉。接下来我继续通过提示词调试GPT的输出,满足匹配到proxy_pass 后面的地址,然后删除整个localhost 块的内容.

我们继续向chatgpt 发送提示词:

很棒,但我的需求是匹配到proxy_pass 后面的地址,然后删除整个localhost 块的内容.

image

GPT给了一条命令我们来测试下:

命令执行结果如下:

$ sed  '/location \//,/}/ {/proxy_pass .*hc-account-analysis-service/!b};/location \//,/}/d' nginx.conf
location /dataCenterService {
    proxy_pass http://semantic-datacenter-service:31001/;
}

location /uploadDemo {
    client_max_body_size 20M;
    proxy_send_timeout 1200s;
    proxy_read_timeout 1200s;
    proxy_connect_timeout 1200s;
    send_timeout 1200s;
    proxy_pass http://intelligent-quality-inspection-service:31001/;
}

location /accountService {
    proxy_pass http://hc-account-analysis-service:31001/;
}

location /qa2020Service{
    proxy_pass http://10.0.0.22:9188/;
}

可以看到没有任何变化,于是我继续调整提示词:

  • 结果不太符合预期

  • 附上命令及输出结果

image

GPT很快理解了我的意思,又给我生成了一条命令:

image
$ sed  '/location \//{N;/: {/,/proxy_pass .*hc-account-analysis-service/!b};/}/d}' nginx.conf
sed: -e expression #1, char 73: unexpected `}'

接着我继续将命令输出结果发送给gpt:

image

这次还是错的,经历了几轮调试之后,gpt终于给出了符合需求的命令:

image

配置文件

$ cat nginx.conf 
location /dataCenterService {
    proxy_pass http://semantic-datacenter-service:31001/;
}

location /uploadDemo {
    client_max_body_size 20M;
    proxy_send_timeout 1200s;
    proxy_read_timeout 1200s;
    proxy_connect_timeout 1200s;
    send_timeout 1200s;
    proxy_pass http://intelligent-quality-inspection-service:31001/;
}

location /accountService {
    proxy_pass http://hc-account-analysis-service:31001/;
}

location /qa2020Service{
    proxy_pass http://10.0.0.22:9188/;
}

删除proxy_pass 包含hc-account-analysis-service的块:

$ sed -n '/location \//{:a;N;/}/!ba;/proxy_pass .*hc-account-analysis-service/{d};p}' nginx.conf
location /dataCenterService {
    proxy_pass http://semantic-datacenter-service:31001/;
}
location /uploadDemo {
    client_max_body_size 20M;
    proxy_send_timeout 1200s;
    proxy_read_timeout 1200s;
    proxy_connect_timeout 1200s;
    send_timeout 1200s;
    proxy_pass http://intelligent-quality-inspection-service:31001/;
}
location /qa2020Service{
    proxy_pass http://10.0.0.22:9188/;
}

删除proxy_pass 包含intelligent-quality-inspection-service的块

$ sed -n '/location \//{:a;N;/}/!ba;/proxy_pass .*intelligent-quality-inspection-service/{d};p}' nginx.conf
location /dataCenterService {
proxy_pass http://semantic-datacenter-service:31001/;
}
location /accountService {
proxy_pass http://hc-account-analysis-service:31001/;
}
location /qa2020Service{
proxy_pass http://10.0.0.22:9188/;
}

大功告成!


扫码加入,即可免费试用!

云原生运维圈
专注于Docker、Kubernetes、Prometheus、Istio、Terraform、OpenTelemetry等云原生技术分享!
 最新文章