EchoMemo - 默认分类
type: channel
link: https://blog.tearth.cn/index.php/category/default/
description: 只是一个默认分类
items: 配置Gradle插件仓库
items: 部署GitLab
items: Kubeadm设置clusterName
items: kube-promethesu解决默认告警
items: Kube-Prometheus监控集群外部主机
items: 部署Kube-Prometheus实现Prometheus高可用
items: Docker环境下配置iptables规则无效
items: Docker部署RocketMQ
items: 通过WebHook将Jenkins构建信息推送到飞书
items: Win10配置定时任务运行python脚本

配置Gradle插件仓库
type: item
date: 2024-10-07T08:59:00+00:00
description: 从GitHub上下载一个开源项目，导入到IDEA后无法下载插件依赖，根据日志提供的报错信息，发现这些从https://plugins.gradle.org下载的插件链接都是404，所以需要配置插件仓库覆盖默认的仓库。找到项目目录中的settings.gradle文件，添加下面内容pluginManagement { repositories { maven { url 'https://maven.aliyun.com/repository/gradle-plugin' } gradlePluginPortal() mavenCentral() jcenter() } }上述配置首先会从阿里云的 Maven 仓库（maven.aliyun.com）尝试获取插件，如果找不到，则依次从 gradlePluginPortal() 和mavenCentral() 这些官方仓库中获取插件。

部署GitLab
type: item
date: 2024-09-27T09:52:00+00:00
description: 环境kubernets version：v1.27.15Docker version：27.0.3Helm version：v3.15.2GitLab version：v17.4.1快速启动添加helm gitlab chart仓库helm repo add gitlab https://charts.gitlab.io helm repo update执行下面命令快速进行部署helm upgrade --install gitlab gitlab/gitlab \ --version 8.4.1 \ --timeout 6000s \ --set global.hosts.domain=example.com \ --set certmanager-issuer.email=mail@example.com \ --namespace=gitlab \ --create-namespace这里我们快速启动一套GitLab服务，这里选择自定义了一些配置项--version 8.4.1 ：Chart版本为8.4.1，对应的GitLab版本为v17.4.1--timeout 6000s：部署超时时间为6000sglobal.hosts.domain=example.com：配置域名，后续实际生成的域名会根据所配置的域名进行扩展，比如配置了example.com，后续GitLab服务的域名就是gitlab.example.com，Minio服务的域名为minio.example.com。当然，也可以针对每个组件服务自定义域名，详情查看values.yaml或者查阅官方文档certmanager-issuer.email：当使用certmanager提供的证书，必须提供一个邮箱除此，其余配置都为默认配置。等待片刻，Job执行完成，Pod启动成功，就可以使用域名在浏览器访问GitLab了。默认的用户名为：root，密码可通过下面命令获取：kubectl get secret -n gitlab gitlab-gitlab-initial-root-password -ojsonpath='{.data.password}' | base64 --decode ; echo自定义部署在很多情况下，我们不需要安装chart中的所有组件，比如集群环境中已经部署certmanager或者计划使用已有的证书，那就不需要再安装certmanager，我们就可以certmanager.install设置为false，同时设置global.ingress.tls.secretName来自定义证书；还有，如果不需要部署runner服务，那我们就可以将gitlab-runner.install设置为false避免安装runner。配置私有镜像仓库配置私有镜像仓库，加快镜像拉取速度global: enterpriseImages: # Default repositories used to pull Gitlab Enterprise Edition images. # See the image.repository and workhorse.repository template helpers. migrations: repository: docker.example.com/gitlab-org/build/cng/gitlab-toolbox-ee sidekiq: repository: docker.example.com/gitlab-org/build/cng/gitlab-sidekiq-ee toolbox: repository: docker.example.com/gitlab-org/build/cng/gitlab-toolbox-ee webservice: repository: docker.example.com/gitlab-org/build/cng/gitlab-webservice-ee workhorse: repository: docker.example.com/gitlab-org/build/cng/gitlab-workhorse-ee geo-logcursor: repository: docker.example.com/gitlab-org/build/cng/gitlab-geo-logcursor certificates: image: repository: docker.example.com/gitlab-org/build/cng/certificates kubectl: image: repository: docker.example.com/gitlab-or…

Kubeadm设置clusterName
type: item
date: 2022-05-04T04:00:00+00:00
description: Kubeadm设置clusterName使用Kubeadm可以快速的创建一个k8s集群，但是默认情况下Kubeadm创建的集群名称都是kubernetes(集群名称可以使用命令kubectl config get-clusters查询)。在实际使用中，如果管理多个k8s集群，就需要对集群名称做区分，方便管理维护。通过网上查找资料，现在可以通过修改kubeadm初始化配置文件，自定义clusterName，操作步骤如下：[scode type="yellow"]配置文件的功能仍然处于 alpha 状态并且在将来的版本中可能会改变，但是一些更加高级的功能只能够通过配置文件设置，比如clusterName[/scode]使用命令kubeadm config print init-defaults > kubeadm-init.yaml获取kubeadm init 的默认 init 配置对象，并将其写入到文件kubeadm-init.yaml中，文件内容如下：apiVersion: kubeadm.k8s.io/v1beta3 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 1.2.3.4 bindPort: 6443 nodeRegistration: criSocket: /var/run/dockershim.sock imagePullPolicy: IfNotPresent name: node taints: null --- apiServer: timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta3 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: {} etcd: local: dataDir: /var/lib/etcd imageRepository: k8s.gcr.io kind: ClusterConfiguration kubernetesVersion: 1.23.0 networking: dnsDomain: cluster.local serviceSubnet: 10.96.0.0/12 scheduler: {}对生成的默认配置文件进行修改，这里按照实际需求，对下面的几个配置项进行修改：集群名称clusterName、镜像仓库地址imageRepository、Service网段networking.serviceSubnet、Pod网段networking.podSubnet，最终修改后的文件内容如下：apiVersion: kubeadm.k8s.io/v1beta3 clusterName: k8s-dev imageRepository: registry.aliyuncs.com/google_containers kind: ClusterConfiguration networking: serviceSubnet: 10.96.0.0/12 podSubnet: 10.244.0.0/16使用修改后的文件初始化集群kubeadm init --config kubeadm-init.yaml踩坑flannel CrashLoopBackOff问题和原因集群初始化操作完成之后，部署flannel，过一会就会看到flannel Pod CrashLoopBackOff，查看flannel日志有这么一行Error registering network: failed to acquire lease: node "ubuntu-vm" pod cidr not assigned，很明确告知了flannel CrashLoopBackOff 的原因是未分配Pod网段。I0503 10:17:21.246851 1 main.go:205] CLI flags config: {etcdEndpoints:http://127.0.0.1:4001,http://127.0.0.1:2379 etcdPrefix:/coreos.com/network etcdKeyfile: etcdCertfile: etcd…

kube-promethesu解决默认告警
type: item
date: 2022-05-02T03:37:00+00:00
description: kube-promethesu解决KubeProxyDown等默认告警在kube-promethesu部署完成之后，会出现KubeControllerManagerDown、KubeProxyDown、KubeSchedulerDown、Watchdog四个告警Watchdog查看Watchdog的告警描述：This is an alert meant to ensure that the entire alerting pipeline is functional. This alert is always firing, therefore it should always be firing in Alertmanager and always fire against a receiver. There are integrations with various notification mechanisms that send a notification when this alert is not firing. For example the "DeadMansSnitch" integration in PagerDuty.，简单来说，这个告警是为了保证告警功能可以正常使用，如果这个告警消失，那就表示告警系统出了问题。如果不需要这个功能，可以修改prometheus目录中的相关文件kubePrometheus-prometheusRule.yaml，注释或删除相关的内容。apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: labels: app.kubernetes.io/component: exporter app.kubernetes.io/name: kube-prometheus app.kubernetes.io/part-of: kube-prometheus prometheus: k8s role: alert-rules name: kube-prometheus-rules namespace: monitoring spec: groups: - name: general.rules ... # - alert: Watchdog # annotations: # description: | # This is an alert meant to ensure that the entire alerting pipeline is functional. # This alert is always firing, therefore it should always be firing in Alertmanager # and always fire against a receiver. There are integrations with various notification # mechanisms that send a notification when this alert is not firing. For example the # "DeadMansSnitch" integration in PagerDuty. # runbook_url: https://runbooks.prometheus-operator.dev/runbooks/general/watchdog # summary: An alert that should always be firing to certify that Alertmanager # is working properly. # expr: vector(1) # labels: # severity: none - name: node-network ... - name: kube-prometheus-node-recording.rules ... - name: kube-prometheus-general.rules ...修改完成后，使用kubectl apply -f prometheus/kubePrometheus-prometheusRule.yaml更新配置，稍等片刻，就可以看到告警Watchdog已从告警列表消失。KubeControllerManagerDownKubeControllerManagerDown告警描述：KubeControllerManager has disappeared from Prometheus target discovery.，翻译：KubeContro…

Kube-Prometheus监控集群外部主机
type: item
date: 2022-04-28T15:25:00+00:00
description: 自定义抓取配置在prometheus目录下创建一个新目录AdditionalScrapeConfigs用来存放集群外部一些抓取的配置文件 ➜ ~ mkdir -p prometheus/AdditionalScrapeConfigs在目录AdditionalScrapeConfigs中新建两个文件：additional-scrape-configs-Secret.yaml和additional-scrape-configs-ConfigMap.yaml，示例如下：additional-scrape-configs-Secret.yaml（新建）apiVersion: v1 kind: Secret metadata: name: prometheus-additional-scrape-configs-secret namespace: monitoring labels: app.kubernetes.io/component: prometheus-targets app.kubernetes.io/instance: main app.kubernetes.io/name: prometheus-additional-scrape-configs app.kubernetes.io/part-of: kube-prometheus app.kubernetes.io/version: 0.23.0 stringData: prometheus-additional-scrape.yaml: | # 以下内容自定义 - job_name: node-exporter file_sd_configs: - files: - /additional-scrape-configs/node-exporter.yaml refresh_interval: 30s relabel_configs: - source_labels: - __address__ regex: '(.*):9100' target_label: instance action: replace replacement: $1 - job_name: container-exporter file_sd_configs: - files: - /additional-scrape-configs/container-exporter.yaml refresh_interval: 30s type: Opaqueadditional-scrape-configs-ConfigMap.yaml（新建）apiVersion: v1 kind: ConfigMap metadata: name: prometheus-additional-scrape-configs-configmap namespace: monitoring labels: app.kubernetes.io/component: prometheus app.kubernetes.io/instance: main app.kubernetes.io/name: prometheus-additional-scrape-configs app.kubernetes.io/part-of: kube-prometheus app.kubernetes.io/version: 0.23.0 data: node-exporter.yaml: | # 以下内容自定义 - targets: - "192.168.33.254:9100" container-exporter.yaml: | # 以下内容自定义 - targets: - "192.168.33.254:9080"prometheus-prometheus.yaml（更新）apiVersion: monitoring.coreos.com/v1 kind: Prometheus metadata: labels: app.kubernetes.io/component: prometheus app.kubernetes.io/instance: k8s app.kubernetes.io/name: prometheus app.kubernetes.io/part-of: kube-prometheus app.kubernetes.io/version: 2.32.1 name: k8s namespace: monitoring spec: ... version: 2.32.1 ## 新增以下配置 # 挂载configMap volumeMounts: - name: prometheus-additional-scrape…

部署Kube-Prometheus实现Prometheus高可用
type: item
date: 2022-04-24T13:00:00+00:00
description: 介绍Kube-Prometheus官网该项目收集Kubernetes清单，Grafana仪表板和Prometheus规则，并结合文档和脚本，以使用Prometheus运算符提供易于操作的端到端Kubernetes集群监控。目前最新版本：v0.10.0，本文使用最新版本进行安装。Kube-Prometheus主要包括以下组件：Prometheus OperatorPrometheus Operator有以下功能：定义Kubernetes资源类型，比如Prometheus，Alertmanager，PrometheusRule等；简化部署和配置；基于Kubernetes标签自动生成target配置。高可用的Prometheus高可用的AlertmanagerPrometheus Node-exporterPrometheus Adapter for Kubernetes Metrics APIskube-state-metrics可视化仪表盘Grafana[scode type="yellow"]根据Kubernetes版本，选择合适的kube-prometheus版本[/scode]kube-prometheus stackKubernetes 1.19Kubernetes 1.20Kubernetes 1.21Kubernetes 1.22Kubernetes 1.23release-0.7✔✔✗✗✗release-0.8✗✔✔✗✗release-0.9✗✗✔✔✗release-0.10✗✗✗✔✔main✗✗✗✔✔环境说明操作系统：CentOS 7.9.2009Kube-Prometheus：v0.10.0Kubernetes：v1.23.5Docker：20.10.14一键部署克隆仓库到本地或者下载指定的版本的Releases包，下面命令是官方提供的部署命令，可以快速的启动。kubectl apply --server-side -f manifests/setup until kubectl get servicemonitors --all-namespaces ; do date; sleep 1; echo ""; done kubectl apply -f manifests/但是会存在以下问题：官方yaml文件没有归类，不方便之后的集群管理；部分image需要从k8s.gcr.io拉取，如果是国内机器并没有合适的代理，那就会导致image无法拉取；Prometheus和Grafana没有配置数据持久化，一旦pod重启或被删除，数据也将被删除；默认的Service无法暴露服务端口到集群外的客户端。自定义部署为了针对性地解决上面几个问题，我们进行以下处理yaml文件分类Kube-Prometheus v0.10.0一共有84个yaml文件 ::aru:distressed:: 为了方便管理，根据服务类型将相应的yaml文件进行分类是很有必要的。创建目录mkdir alertmanager blackboxExporter grafana kubeStateMetrics kubernetesControlPlane nodeExporter prometheus prometheusAdapter prometheusOperator根据服务类型yaml文件进行分类mv alertmanager-* ./alertmanager mv blackboxExporter-* ./blackboxExporter mv grafana-* ./grafana mv kubeStateMetrics-* ./kubeStateMetrics mv kubernetesControlPlane-* ./kubernetesControlPlane mv nodeExporter-* ./nodeExporter mv prometheus-* ./prometheus mv prometheusAdapter-* ./prometheusAdapter mv prometheusOperator-* ./prometheusOperator mv kubePrometheus-prometheusRule.yaml ./prometheus此时目录结构如下[collapse status="false" title="目录结构 (10 directories, 84 files)"]. ├── alertmanager │ ├── alertmanager-alertmanager.yaml │ ├── alertmanager-podDisruptionBudget.yaml │ ├── alertmanager-prom…

Docker环境下配置iptables规则无效
type: item
date: 2022-04-20T08:14:00+00:00
description: 场景在服务器用Docker启动了一个MySQL实例，并通过-p将容器的端口3306映射到宿主机的8006。 ➜ ~ docker run --name mysql --restart always -p 8006:3306 -e LANG=C.UTF-8 -e MYSQL_ROOT_PASSWORD=123456 -d mysql现在使用iptables限制连接MySQL的客户端IP，这里向INPUT链中插入一条DROP规则拒绝来自192.168.33.0/24的主机访问宿主机的8006。 ➜ ~ iptables -I INPUT -p tcp --dport 8006 -s 192.168.33.0/24 -j DROP ➜ ~ iptables -nvL INPUT --line-numbers Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 0 0 DROP tcp -- * * 192.168.33.0/24 0.0.0.0/0 tcp dpt:8006 2 411 28776 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 3 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 4 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 5 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 6 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited添加规则之后，在本机进行测试仍然可以连通192.168.33.8:8006，防火墙规则没生效。 Tearth-MBP:~ tearth ~ telnet 192.168.33.8 8006 Trying 192.168.33.8... Connected to example.com. Escape character is '^]'. J 8.0.258bKQ=+�DzLWtOAw5*%caching_sha2_password在服务器查看刚添加的这条规则(num: 1)，没有任何流量经过这条规则，再次确定了这条规则没有生效。 ➜ ~ iptables -nvL INPUT --line-numbers Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 0 0 DROP tcp -- * * 192.168.33.0/24 0.0.0.0/0 tcp dpt:8006 2 2333 163K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 3 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 4 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 5 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 6 64 4992 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited原因在 Linux 上，Docker 操纵iptables规则来提供网络隔离，Docker 安装了两个自定义 iptables 链DOCKER-USER和 的DOCKER，并确保传入的数据包始终首先由这两个链检查。如果通过 Docker 公开一个端口，无论防火墙配置了什么规则，这个端口都会被公开。如果希望即使在端口通过 Docker 公开时也应用这些规则，则必须将这些规则添加到 DOCKER-USER链中。解决根据Docker官方文档，可以通过在DOCKER-USER链中添加相应的规则控制。（⚠️ 在DOCKER-USER中配置规则，端口写容器监听的端口3306，而不是映射到宿主机的端口8006） ➜ ~ iptables -I DOCKER-USER -p tcp --dport 3306 -s 192.168.33.0/24 -j DROP再次测试防火墙规则是否生…

Docker部署RocketMQ
type: item
date: 2022-04-17T01:45:00+00:00
description: 官方RocketMQ镜像启动服务失败项目需要部署RocketMQ，于是找到了RocketMQ官方的Docker镜像，在启动的过程中发现，只要挂载宿主机目录，容器便无法正常启动，启动过程和容器日志均没有看到明显的报错，只看到 container STATUS: Exited (253) 1 second ago原因查看官方Dockerfile，可以看到在镜像中创建了一个名为rocketmq的组和用户，并且gid和uid都指定3000，并将RockerMQ目录的所属组和用户更改为rocketmq用户。当需要将容器中RockerMQ目录中的文件或目录映射到宿主机中时，就必须保证指定的宿主机目录权限与容器中的一致，如果出现权限不一致的问题，就会导致容器启动失败的问题。... # 定义组名，用户名，并分配相应的ID ARG user=rocketmq ARG group=rocketmq ARG uid=3000 ARG gid=3000 ... # 创建组和用户 RUN groupadd -g ${gid} ${group} \ && useradd -u ${uid} -g ${gid} -m -s /bin/bash ${user} ... # RockerMQ目录更改所属组和用户 RUN chown -R ${uid}:${gid} ${ROCKETMQ_HOME} ... # 指定容器以哪个用户运行 USER ${user} ...解决方法更改宿主机挂载目录所属组和用户在宿主机创建与容器中相同的组和用户，并设置gid和uid为3000。这里用户名不一定要一样，但是gid和uid必须要和容器中的一致，设置为3000。# 创建组和用户 groupadd -g 3000 rocketmq useradd -u 3000 -g 3000 -M -s /bin/bash rocketmq # 修改宿主机挂载目录的所属组和用户 chown -R rocketmq:rocketmq data重新制作Docker image除了更改宿主机挂载目录所属组和用户，也可以通过重制镜像解决问题，稍修改下官方Dockerfile，去掉创建组，创建用户，RocketMQ目录授权，指定容器启动用户的部分，重新build即可，具体参考下面的Dockerfile。[collapse status="false" title="Dockerfile"]FROM openjdk:8-slim ARG version ENV ROCKETMQ_VERSION=${version} ENV ROCKETMQ_HOME=/rocketmq ENV MQ_SERVER_HEAP_OPTS="-Xms2g -Xmx2g" ENV MQ_BROKER_HEAP_OPTS="-Xms4g -Xmx4g" WORKDIR / RUN apt-get update -y; \ apt-get install wget gpg unzip vim net-tools -y; \ wget -O rocketmq.zip https://archive.apache.org/dist/rocketmq/${ROCKETMQ_VERSION}/rocketmq-all-${ROCKETMQ_VERSION}-bin-release.zip; \ wget -O rocketmq.zip.asc https://archive.apache.org/dist/rocketmq/${ROCKETMQ_VERSION}/rocketmq-all-${ROCKETMQ_VERSION}-bin-release.zip.asc; \ wget -O KEYS https://www.apache.org/dist/rocketmq/KEYS; \ gpg --import KEYS; \ gpg --batch --verify rocketmq.zip.asc rocketmq.zip ; \ unzip rocketmq.zip ; \ mv rocketmq-${ROCKETMQ_VERSION} rocketmq; \ sed -i '/Xms/{s/-Xms4g -Xmx4g/${MQ_SERVER_HEAP_OPTS}/;}' ${ROCKETMQ_HOME}/bin/runserver.sh; \ sed -i '/Xms/{s/-Xms8g -Xmx8g/${MQ_BROKER_HEAP_OPTS}/;}' ${ROCKETMQ_HOME}/bin/runbroker.sh; \ rm -rf rocketmq.zip rocketmq.zip.asc KEYS; \ apt-ge…

通过WebHook将Jenkins构建信息推送到飞书
type: item
date: 2022-04-12T13:50:00+00:00
description: 部署PrometheusAlert项目地址：feiyu563/PrometheusAlertPrometheusAlert可以通过二进制，Docker，k8s多种方式部署，具体部署步骤参考官网。PrometheusAlert部署完，打开Web，"模板管理" > "自定义模板" > "添加模板"创建一个自定义模板，模板类型选择"飞书"，这里支持的模板类型有十几种，除了飞书还有钉钉，企业微信，Email等等，根据实际情况选择合适的模板；模板用途选择"Jenkins"；模板内容参考下面的内容进行填写；消息协议JSON内容是测试模板的时候需要填写的，可忽略。填写完成后保存模板即可，接着在Jenkins安装相关插件。[collapse status="false" title="模板内容（点击查看）"]**[Jenkins构建信息(点击查看详情)]({{.buildUrl}})** 构建人员：{{.userName}} 任务名称：{{.projectName}} 构建编号：{{.buildName}} 构建参数：{{.buildVars}} 构建状态：{{.event}} 持续时间：{{.duration}} 当前时间：{{GetCSTtime ""}}[/collapse]模板的URL稍后会在Jenkins插件中进行配置安装配置Jenkins插件安装插件项目地址：jenkinsci/outbound-webhook-plugin在线安装登录到Jenkins，"系统管理" > "插件管理" > "可选插件"，搜索"Outbound WebHook for build events"[scode type="yellow"]最新版本0.3.0只支持JDK14及以上版本，如果JDK版本小于14，建议下载历史版本手动安装或者下载源码重新编译打包。[/scode]手动安装如果Jenkins无法在线安装或因为JDK版本要求，需要安装旧版本，可以手动安装。在Jenkins插件官网下载历史版本或者自己重新打包。推荐使用我重新打的包，[button color="info" icon="" url="https://cloud.tearth.cn/s/k5h6" type=""]点击下载[/button]，提取码 2o2yu9，对比官方插件做了以下处理：JDK版本不必大于等于14可以配置多个WebHook地址增加了构建发起人userName和构建持续时间duration两个字段配置插件创建任务，在任务配置中选择“构建后操作”，选择"Outbound WebHook notification"在文本框中填入模板URL（多个URL之间用;分开），根据需要选择哪些触发哪些事件时推送消息。效果构建成功构建失败构建不稳定

Win10配置定时任务运行python脚本
type: item
date: 2022-04-11T08:03:00+00:00
description: Win + S 搜索任务计划程序创建任务创建一个名称为“demo”的定时任务，触发器这个触发器表示：没隔5min执行一次指定操作配置操作程序或脚本：指向python程序。这里我配置的是项目的虚拟环境添加参数：要执行的python脚本文件名称起始于：python脚本文件所在的目录