<dependency>
+ <groupId>ms.dew</groupId>
+ <artifactId>hbase-starter</artifactId>
+</dependency>
+diff --git a/devops/it/src/it/helloworld-backend/expected/Deployment.yaml b/devops/it/src/it/helloworld-backend/expected/Deployment.yaml index 92f2f510..ab4a7343 100644 --- a/devops/it/src/it/helloworld-backend/expected/Deployment.yaml +++ b/devops/it/src/it/helloworld-backend/expected/Deployment.yaml @@ -32,36 +32,36 @@ spec: group: ms.dew.devops.it spec: containers: - - env: - - name: JAVA_OPTIONS - value: ' -Dspring.profiles.active=test -Dserver.port=8080 -Dopentracing.jaeger.log-spans=false - -Dopentracing.jaeger.probabilistic-sampler.sampling-rate=0.1 -Dmanagement.endpoints.web.exposure.include=* - -Dmetrics.tags:application=${spring.application.name}' - image: "@ignore@" - imagePullPolicy: IfNotPresent - livenessProbe: - failureThreshold: 6 - httpGet: - path: /actuator/health - port: 8080 - scheme: HTTP - initialDelaySeconds: 30 - periodSeconds: 30 - name: dew-app - ports: - - containerPort: 8080 - name: http - protocol: TCP - readinessProbe: - failureThreshold: 3 - httpGet: - path: /actuator/health - port: 8080 - scheme: HTTP - initialDelaySeconds: 30 - periodSeconds: 30 - resources: - limits: {} - requests: {} + - env: + - name: JAVA_OPTIONS + value: ' -Dspring.profiles.active=test -Dserver.port=8080 -Dopentracing.jaeger.log-spans=false + -Dopentracing.jaeger.probabilistic-sampler.sampling-rate=0.1 -Dopentracing.spring.web.skip-pattern=/api-docs.*|/swagger.*|.*\\.png|.*\\.css|.*\\.js|.*\\.html|/favicon.ico|/hystrix.stream|/actuator.* + -Dmanagement.endpoints.web.exposure.include=* -Dmanagement.metrics.tags.application=helloworld-backend' + image: "@ignore@" + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 6 + httpGet: + path: /actuator/health + port: 8080 + scheme: HTTP + initialDelaySeconds: 30 + periodSeconds: 30 + name: dew-app + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /actuator/health + port: 8080 + scheme: HTTP + initialDelaySeconds: 30 + periodSeconds: 30 + resources: + limits: {} + requests: {} nodeSelector: group: app diff --git a/devops/it/src/it/helloworld-frontend/.dew b/devops/it/src/it/helloworld-frontend/.dew index 71d73e74..5714128c 100644 --- a/devops/it/src/it/helloworld-frontend/.dew +++ b/devops/it/src/it/helloworld-frontend/.dew @@ -7,9 +7,9 @@ profiles: serverConfig: |- server { listen 80; - server_name brian.com; + server_name localhost; location / { - root html/brian; + root /usr/share/nginx/html; index index.html index.htm; } if ( $http_host ~* "^(.*)") { diff --git a/devops/it/src/it/todo/backend/services/compute/expected/Deployment.yaml b/devops/it/src/it/todo/backend/services/compute/expected/Deployment.yaml index 6b049553..f0b50cf8 100644 --- a/devops/it/src/it/todo/backend/services/compute/expected/Deployment.yaml +++ b/devops/it/src/it/todo/backend/services/compute/expected/Deployment.yaml @@ -6,11 +6,11 @@ metadata: dew.ms/scm-url: "@ignore@" sidecar.jaegertracing.io/inject: 'true' labels: - app: todo-compute + app: compute provider: dew version: "@ignore@" group: ms.dew.devops.it - name: todo-compute + name: compute namespace: dew-prod spec: replicas: 1 @@ -35,8 +35,8 @@ spec: - env: - name: JAVA_OPTIONS value: ' -Dspring.profiles.active=prod -Dserver.port=8080 -Dopentracing.jaeger.log-spans=false - -Dopentracing.jaeger.probabilistic-sampler.sampling-rate=0.1 -Dmanagement.endpoints.web.exposure.include=* - -Dmetrics.tags:application=${spring.application.name}' + -Dopentracing.jaeger.probabilistic-sampler.sampling-rate=0.1 -Dopentracing.spring.web.skip-pattern=/api-docs.*|/swagger.*|.*\\.png|.*\\.css|.*\\.js|.*\\.html|/favicon.ico|/hystrix.stream|/actuator.* + -Dmanagement.endpoints.web.exposure.include=* -Dmanagement.metrics.tags.application=compute' image: "@ignore@" imagePullPolicy: IfNotPresent livenessProbe: diff --git a/devops/it/src/it/todo/backend/services/kernel/expected/Deployment.yaml b/devops/it/src/it/todo/backend/services/kernel/expected/Deployment.yaml index 30d3b547..b77e0a1f 100644 --- a/devops/it/src/it/todo/backend/services/kernel/expected/Deployment.yaml +++ b/devops/it/src/it/todo/backend/services/kernel/expected/Deployment.yaml @@ -35,8 +35,8 @@ spec: - env: - name: JAVA_OPTIONS value: ' -Dspring.profiles.active=prod -Dserver.port=8080 -Dopentracing.jaeger.log-spans=false - -Dopentracing.jaeger.probabilistic-sampler.sampling-rate=0.1 -Dmanagement.endpoints.web.exposure.include=* - -Dmetrics.tags:application=${spring.application.name}' + -Dopentracing.jaeger.probabilistic-sampler.sampling-rate=0.1 -Dopentracing.spring.web.skip-pattern=/api-docs.*|/swagger.*|.*\\.png|.*\\.css|.*\\.js|.*\\.html|/favicon.ico|/hystrix.stream|/actuator.* + -Dmanagement.endpoints.web.exposure.include=* -Dmanagement.metrics.tags.application=kernel' image: "@ignore@" imagePullPolicy: IfNotPresent livenessProbe: diff --git a/devops/it/src/it/todo/backend/services/notifier/expected/Deployment.yaml b/devops/it/src/it/todo/backend/services/notifier/expected/Deployment.yaml index 1c8f1b15..81c64b6a 100644 --- a/devops/it/src/it/todo/backend/services/notifier/expected/Deployment.yaml +++ b/devops/it/src/it/todo/backend/services/notifier/expected/Deployment.yaml @@ -35,8 +35,8 @@ spec: - env: - name: JAVA_OPTIONS value: ' -Dspring.profiles.active=prod -Dserver.port=8080 -Dopentracing.jaeger.log-spans=false - -Dopentracing.jaeger.probabilistic-sampler.sampling-rate=0.1 -Dmanagement.endpoints.web.exposure.include=* - -Dmetrics.tags:application=${spring.application.name}' + -Dopentracing.jaeger.probabilistic-sampler.sampling-rate=0.1 -Dopentracing.spring.web.skip-pattern=/api-docs.*|/swagger.*|.*\\.png|.*\\.css|.*\\.js|.*\\.html|/favicon.ico|/hystrix.stream|/actuator.* + -Dmanagement.endpoints.web.exposure.include=* -Dmanagement.metrics.tags.application=notifier' image: "@ignore@" imagePullPolicy: IfNotPresent livenessProbe: diff --git a/devops/maven/dew-maven-plugin/src/main/java/ms/dew/devops/kernel/plugin/appkind/jvmservice_springboot/JvmServiceSpringBootAppKindPlugin.java b/devops/maven/dew-maven-plugin/src/main/java/ms/dew/devops/kernel/plugin/appkind/jvmservice_springboot/JvmServiceSpringBootAppKindPlugin.java index 0f130bbb..d05871e6 100644 --- a/devops/maven/dew-maven-plugin/src/main/java/ms/dew/devops/kernel/plugin/appkind/jvmservice_springboot/JvmServiceSpringBootAppKindPlugin.java +++ b/devops/maven/dew-maven-plugin/src/main/java/ms/dew/devops/kernel/plugin/appkind/jvmservice_springboot/JvmServiceSpringBootAppKindPlugin.java @@ -182,7 +182,7 @@ private String setJavaOptionsValue(FinalProjectConfig config) { } if (config.getApp().getMetricsEnabled()) { containerEnvJavaOptionsValue += " -Dmanagement.endpoints.web.exposure.include=*" - + " -Dmetrics.tags:application=${spring.application.name}"; + + " -Dmanagement.metrics.tags.application=" + config.getAppName(); } return containerEnvJavaOptionsValue; } diff --git a/docs/index.html b/docs/index.html index 32768624..2cb0cab2 100644 --- a/docs/index.html +++ b/docs/index.html @@ -531,7 +531,20 @@
Redis集群能力实现
hbase-starter
HBase Spring Boot 实现
idempotent-starter
幂等处理模块
在集成 HBase 客户端能力的基础之上,支持 Spring Boot 配置管理、支持 Kerberos 认证。
+<dependency>
+ <groupId>ms.dew</groupId>
+ <artifactId>hbase-starter</artifactId>
+</dependency>
+spring:
+ hbase:
+ zkQuorum: localhost # zookeeper url
+ znodeParent: /hbase-secure # zookeeper znode parent
+ auth:
+ type: kerberos # 认证类型,默认是 simple,可选:simple 和 kerberos
+ principal: # kerberos 下 principal
+ keytab: # kerberos 下 keytab 路径
+ hbaseMasterPrincipal: # kerberos 下 hbase master principal
+ hbaseRegionServerPrincipal: # kerberos 下 hbase region server principal
+ hbaseClientRetriesNumber: # hbase 客户端重试次数,默认:5
+ hbaseClientOperationTimeout: # hbase 客户端超时时间,默认:300000
+ hbaseClientScannerTimeoutPeriod: # hbase 客户端 scan 超时时间,默认:60000
+ hbaseClientPause: # hbase 重试的休眠时间,默认:30
+@Autowired
+private HBaseTemplate hbaseTemplate;
+
+hbaseTemplate.get("table_hbase", "0002093140000000",
+ "0", "reg_platform", (result, row) -> Bytes.toString(result.value()));
++ + | ++HBaseTemplate 其他使用方法可以详见 hbase-starter 模块下的 test 内容。 + | +
helm repo add kiwigrid https://kiwigrid.github.io
# 安装,不使用代理要加上 --set image.tag=v2.4.0 --set image.repository=registry.cn-hangzhou.aliyuncs.com/google_containers/fluentd-elasticsearch
+# 请根据需要进行节点亲和性相关设置,但请保证需要收集日志的节点有Fluentd部署。
+# e.g. 只收集部署了应用的节点的日志,设置 --set nodeSelector.group=app
# 若要启用Prometheus进行监控Fluentd,
# 需要先将Fluentd通过设置service暴露出来,然后设置prometheusRule和serviceMonitor。
# 此配置需结合Prometheus-operator使用。
@@ -5126,8 +5203,7 @@ 4.1.12. Fluentd
--set prometheusRule.labels.app=prometheus-operator \
--set prometheusRule.labels.release=dew-prometheus-operator \
--set serviceMonitor.enabled=true \
- --set serviceMonitor.labels.release=dew-prometheus-operator \
- --set nodeSelector.group=devops
+ --set serviceMonitor.labels.release=dew-prometheus-operator \
+ + | +
+Dew DevOps部分的核心是由 dew-maven-plugin 实现。
+ |
+
Dew Framework
通过分支变更触发
+Dew DevOps
完全可以独立于 Dew Framework
使用,只需要在项目的父POM中加上如下配置即可。
<profile>
+ <id>devops</id>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>ms.dew</groupId>
+ <artifactId>dew-maven-plugin</artifactId>
+ <!--生产环境请选择合适的版本!-->
+ <version>${dew.version}</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>init</goal>
+ <goal>prepare</goal>
+ <goal>build</goal>
+ <goal>release</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</profile>
钉钉 只支持markdown格式的钉钉消息
+HTTP 数据结构分为以下几种情况
+伸缩扩展
+PROCESS_EMPTY(空项目)
+{ + "title": "DevOps process successful", # 消息标题 + "content": { # 消息内容 + "kind": "PROCESS_EMPTY", # 过程处理类型 + "ci": "", # ci操作 + "message": {} # 消息结果内容 + } +}+
Maven配置
+PROCESS_INIT(初始化)
+{ + "title": "DevOps process successful", # 消息标题 + "content": { # 消息内容 + "kind": "PROCESS_INIT", # 过程处理类型 + "ci": "", # ci操作 + "message": { # 消息结果内容 + "profile": "uat", # 分支或者环境 + "project": "todo-parent", # 项目名称 + } + } +}+
重用版本
+PROCESS_EXECUTE_SUCCESS(成功)/PROCESS_EXECUTE_FAILURE(失败)
+{ + "title": "DevOps process successful", # 消息标题 + "content": { # 消息内容 + "kind": "PROCESS_EXECUTE_SUCCESS", # 过程处理类型 + "ci": "", # ci操作 + "message": { # 消息结果内容 + "mojoName": "release", # mvn操作步骤 + "profile": "uat", # 分支或者环境 + "project": "todo-parent", # 项目名称 + "successfulFlag": "Successful", # 成功标识 + "group": "ms.dew.devops.it", # 项目group名称 + "message":"***", # 错误信息 + "throwable":"**" # 错误 + } + } +}+
脚本使用
+PROCESS_GLOBAL_ERROR(全局错误)
+{ + "title": "DevOps process successful", # 消息标题 + "content": { # 消息内容 + "kind": "PROCESS_GLOBAL_ERROR", # 过程处理类型 + "ci": "", # ci操作 + "message": { # 消息结果内容 + "error": "release", # 错误信息 + "errorStackTrace": "uat" # 错误堆栈信息 + } + } +}+
支持的项目类型
+PROCESS_SHUTDOWN(关闭)
+{ + "title": "DevOps process successful", # 消息标题 + "content": { # 消息内容 + "kind": "PROCESS_SHUTDOWN", # 过程处理类型 + "ci": "", # ci操作 + "message": { # 消息结果内容 + "successfulExecProjects": [{ # 成功项目 + "groupId":"com.terran.message", # maven groupId + "artifactId":"dingtalk", # maven artifactId + "execMojos":["release"], # 执行成功的操作, 有release(发布)、unrelease(卸载)、scale(扩容)、rollback(回滚)四种操作 + "name":"dingtalk" # maven项目名称 + "reason":null + }], + "failureExecProjects": [{ # 成功项目 + "groupId":"com.terran.message", # maven groupId + "artifactId":"dingtalk", # maven artifactId + "execMojos":["release"], # 执行成功的操作, 有release(发布)、unrelease(卸载)、scale(扩容)、rollback(回滚)四种操作 + "name":"dingtalk", # maven项目名称 + "reason":"***" # 失败原因 + }], + "noneExecProjects": [{ # 成功项目 + "groupId":"com.terran.message", # maven groupId + "artifactId":"dingtalk", # maven artifactId + "execMojos":["release"], # 执行成功的操作, 有release(发布)、unrelease(卸载)、scale(扩容)、rollback(回滚)四种操作 + "name":"dingtalk", # maven项目名称 + "reason":"***" # 未执行原因 + }], + "ignoreExecProjects": [{ # 成功项目 + "groupId":"com.terran.message", # maven groupId + "artifactId":"dingtalk", # maven artifactId + "execMojos":["release"], # 执行成功的操作, 有release(发布)、unrelease(卸载)、scale(扩容)、rollback(回滚)四种操作 + "name":"dingtalk", # maven项目名称 + "reason":"***" # 忽略原因 + }], + } + } +}+
# 默认环境配置
namespace: default # 命名空间,强烈建议修改为特定的命名空间
-kind: # 项目类型,默认自动探测,也可以显式指定为 JVM_SERVICE/JVM_LIB/FRONTEND/POM
skip: false # 是否跳过,为true时表示
disableReuseVersion: # 是否禁用重用版本,e.g. 生产环境重用预发环境的最后一个版本(不用重新打包Docker image)
# 默认情况前端工程为true(node编译期会混入环境信息导致无法重用),其它工程为false
@@ -5382,52 +5661,50 @@ 4.3.2. Maven
dew.devops.docker.registry.url # Docker Registry Url e.g. https://harbor.dew.ms/v2
dew.devops.docker.registry.username # Docker Registry 用户名
dew.devops.docker.registry.password # Docker Registry 密码
-ew.devops.quiet
+dew.devops.quiet # 是否静默处理
# ============= 日志及调试场景使用 =============
dew.devops.podName # 要使用的Pod名称
# ============= 日志场景使用 =============
@@ -5570,11 +5847,11 @@ /.dew配置说明
# 默认通知配置,详见 Dew的通知处理模块
-#notify:
- # type 不填写时默认使用钉钉,也可以选择 type: HTTP / MAIL
- #args:
- # 通知的URL,可自行修改,详见 https://open-doc.dingtalk.com/microapp/serverapi2/qf2nxq
- #url: https://oapi.dingtalk.com/robot/send?access_token=8ff65c48001c1981df7d326b5cac497e5ca27190d5e7ab7fe9168ad69b103455
+notifies:
+ - type: DD
+ args:
+ # 通知的URL,可自行修改,详见 https://open-doc.dingtalk.com/microapp/serverapi2/qf2nxq
+ url: https://oapi.dingtalk.com/robot/send?access_token=8ff65c48001c1981df7d326b5cac497e5ca27190d5e7ab7fe9168ad69b103455
profiles:
# 添加测试环境
test:
@@ -5669,7 +5946,21 @@
# 默认通知配置,详见 Dew的通知处理模块
-#notify:
- # type 不填写时默认使用钉钉,也可以选择 type: HTTP / MAIL
- #args:
- # 通知的URL,可自行修改,详见 https://open-doc.dingtalk.com/microapp/serverapi2/qf2nxq
- #url: https://oapi.dingtalk.com/robot/send?access_token=8ff65c48001c1981df7d326b5cac497e5ca27190d5e7ab7fe9168ad69b103455
+notifies:
+ - type: DD
+ args:
+ # 通知的URL,可自行修改,详见 https://open-doc.dingtalk.com/microapp/serverapi2/qf2nxq
+ url: https://oapi.dingtalk.com/robot/send?access_token=8ff65c48001c1981df7d326b5cac497e5ca27190d5e7ab7fe9168ad69b103455
profiles:
# 添加uat环境
uat:
@@ -5860,6 +6151,11 @@ 5.1.1. 代码
dew.devops.docker.registry.password=Dew123456
# Kubernetes base64 configuration
dew.devops.kube.config=YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIGNlcnRpZmljYXRlLWF1dGhvcml0eS1kYXRhOiBMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VONVJFTkRRV0pEWjBGM1NVSkJaMGxDUVVSQlRrSm5hM0ZvYTJsSE9YY3dRa0ZSYzBaQlJFRldUVkpOZDBWUldVUldVVkZFUlhkd2NtUlhTbXdLWTIwMWJHUkhWbnBOUWpSWVJGUkZOVTFFVVhoTlZFRXpUVlJCZUU0eGIxaEVWRWsxVFVSUmQwOUVRVE5OVkVGNFRqRnZkMFpVUlZSTlFrVkhRVEZWUlFwQmVFMUxZVE5XYVZwWVNuVmFXRkpzWTNwRFEwRlRTWGRFVVZsS1MyOWFTV2gyWTA1QlVVVkNRbEZCUkdkblJWQkJSRU5EUVZGdlEyZG5SVUpCU3pWbENqUkpLekJrVG5RNVFsWm1OMWhOZWxWM2FIZGtTRlZ0WmsxWGFHdGlkelU1YVVGbmFVY3lSRGcyTTNkamNWWXhhRGswTjJ4c01rVlNRM0puWlRkM1prVUtWRklyY0ZOcVJUZGlPRWhNUlRaNE5VZEhXbkkyUkhKa1kwVnhhRFZSYzNoeUwyODVOVGxrYVNzeldYTmFNR3AwYVRSalFVNURjMGR2T0RkaFZpOUNOQXAzUmpBMmEyOXJVVU5yYlZSYVNXbG1kRWQwYW5CWlJWUkljV0phVlhwMlpYTnNRamRhY0daeWVXY3ZhWHBWVjI0M0x6VXhkVTVhZEdaclZtSkRhR0pCQ2psS1ozSnlXVFJqYTBZck1XdG5VVmxrTjFKMlRsRnVkMDQwTm5WbGJsUklhVlJaYWpONGVYVnVkbU5GYTNZd1RVNU1WV2haUXpOQ2JWcDNlVmxtTWxZS1IwaHJZbWt4VEZWa01WSlNSWFJVUTNKdWIydExPRUZ3UVV0NE4yaGpaVFpETm5OYVEwWTNWVEpvYXpWSk1qTlVUa2xJUkZGb1dGUkZka3BhTlZCbFpncFNNMDlWY0Zaak0wVkliREJPVDFGMFZ6Tk5RMEYzUlVGQllVMXFUVU5GZDBSbldVUldVakJRUVZGSUwwSkJVVVJCWjB0clRVRTRSMEV4VldSRmQwVkNDaTkzVVVaTlFVMUNRV1k0ZDBSUldVcExiMXBKYUhaalRrRlJSVXhDVVVGRVoyZEZRa0ZKZVdab1JqTmljMkZIWlRSeGQwMVdhRE14VjNCT1NTOU9URUVLZEZCc01VWkllbWxNYW5BcldVMW9MMjlyZDFKcmQzaERUbU5QWVhwRGVVUnlSbkozYVhkbE0ydG9USEExYVZwak5WTnVRMlJWUjBobVNsTjZPVEJwZWdwamNDdEViRXhQWnpKWGNUbFFObk5qTkZCV2JsaEhNRTVZUjBZMU1sSmtkRWw2Y205UE5ESkVVVWRDVTBSUGFVbHlTM2RpY25Bdk1HUTRLMWs1ZHl0WkNrSnVXVGxZZEVWNlNtOVdRMkp0YTFock5UTXlTa04xU0ZaSlVtOWpURGxUYjI1UVpIVjRNWFo0YjFJcmNuQTJRWE5VTkN0cloxRTFXbkJaVVZreVQzVUthVVJMTnpGWlFrbzBjbWxSZDBNNWJWRnJaV2RSYXpsdWFFUk9ORWhxYzIxMWJIQmFiemRJU0ZCTVZtVXZNa3BEZEhaRFUzUnVkVTFFYjNOQ1ZWRnJNZ292Ykd0b05uZzNkRlF2YWpKSU4wRldXalZMTlc5NE5FMHhPVFZ4ZEhrMFlsTmFjbmhoTWpVek5FTnpSblpJTTA1M1REZE1hMGhTYW5Sc2N6MEtMUzB0TFMxRlRrUWdRMFZTVkVsR1NVTkJWRVV0TFMwdExRbz0KICAgIHNlcnZlcjogaHR0cHM6Ly8xMC4yMDAuMTMxLjE4OjY0NDMKICBuYW1lOiBrdWJlcm5ldGVzCmNvbnRleHRzOgotIGNvbnRleHQ6CiAgICBjbHVzdGVyOiBrdWJlcm5ldGVzCiAgICB1c2VyOiBrdWJlcm5ldGVzLWFkbWluCiAgbmFtZToga3ViZXJuZXRlcy1hZG1pbkBrdWJlcm5ldGVzCmN1cnJlbnQtY29udGV4dDoga3ViZXJuZXRlcy1hZG1pbkBrdWJlcm5ldGVzCmtpbmQ6IENvbmZpZwpwcmVmZXJlbmNlczoge30KdXNlcnM6Ci0gbmFtZToga3ViZXJuZXRlcy1hZG1pbgogIHVzZXI6CiAgICBjbGllbnQtY2VydGlmaWNhdGUtZGF0YTogTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVTTRha05EUVdSeFowRjNTVUpCWjBsSlJWUlZjbE5SV21kblowRjNSRkZaU2t0dldrbG9kbU5PUVZGRlRFSlJRWGRHVkVWVVRVSkZSMEV4VlVVS1FYaE5TMkV6Vm1sYVdFcDFXbGhTYkdONlFXVkdkekI0VDFSQk1FMVVSWGRPZWtWM1RWUmtZVVozTUhsTlJFRXdUVlJCZDA1NlJYZE5ha1poVFVSUmVBcEdla0ZXUW1kT1ZrSkJiMVJFYms0MVl6TlNiR0pVY0hSWldFNHdXbGhLZWsxU2EzZEdkMWxFVmxGUlJFVjRRbkprVjBwc1kyMDFiR1JIVm5wTVYwWnJDbUpYYkhWTlNVbENTV3BCVGtKbmEzRm9hMmxIT1hjd1FrRlJSVVpCUVU5RFFWRTRRVTFKU1VKRFowdERRVkZGUVhSdmFXOHdjbWxTU2k5QlkzQXhlVE1LUjBKbVkxaGhRbWhMTlRWek1EWk1ibEI2TmpCWGVEQnlkalZ6SzNWeVdVaFliWFYyU2pWVGNrVlpRbEpIWWtWdlRIcDVVemhYVW1KU01HdDFjbEJOUlFvMVpWUlpUR012UnpaeGNuVnVka1p4UjNSak4xaFJSMGN6VkVzdlJUSnNLMkkxZVdJeGEwTnliM2htTTNOelVFeFVVbVZDT0hFd1NrWm5iRmRpZEdjeUNsZElWVFJhUlZrNE1sbzVObkVyWkV4clZHaFJNRUV4YlZWMlUxRjZWMFlyU2xOaVNYbHNkVTV4VWxBMGExaHdZME16U1hKQlozcEdPWEZITkV0R1V6Z0tkM2xuUm5sRU9VUlJja3cyWkRGcE5qaDFVazR6YW10bFZYTTBNMHRDTlc4cldGcEhka05KY2tsR1owaDNXRUZhVkRkVE1ub3ZaRVJRZG5vcmFVaFdVQXBZYzFaUlIweEVkRGx4YWtwR2JYRk1WazlRZVVGelFuWlhWM0Z6VFZaTFpWSXJWbGhYYkRoSll6bG9iMFZWVkdOcmEyMXhRV0YzWkdNMlEzcEplbFJ5Q21FelNqRTRVVWxFUVZGQlFtOTVZM2RLVkVGUFFtZE9Wa2hST0VKQlpqaEZRa0ZOUTBKaFFYZEZkMWxFVmxJd2JFSkJkM2REWjFsSlMzZFpRa0pSVlVnS1FYZEpkMFJSV1VwTGIxcEphSFpqVGtGUlJVeENVVUZFWjJkRlFrRkRSVmRUYTB3MFkwRmFhekJsVnpScVMzTlhhVEV6YTAxSmJ5ODNMM3BZZG1aRWFBcGpTR05YYVdONlRqUndNRGs1T0RoVmVtbHdVak54YUZCMmVHaHhXR0pwTlRKS09WVlJOVkFyVUUxS05IRjJOamRSU1VGM1pHMXhlRXRzZFVORldqWk1DazVoYmtWRGNtZDVaek5QZW1kQ1dtaElUa3N4YUhob2VtdzBMME54YTBKTmNGbEJNSEprWWpKVlpUTlhiV05wV1hkc1EyUk9Ramw2ZVhKV01VUXZVa2tLZW5aTFYwUnJUMU5xV2pjMFVGWlpXbWh5VVdkWFJWVllPVWRGYlVsSlZXcFFZbXhsYTNKV1kyOXVTbmxpT1ZwV2VqZDNNbFZNVUVkTFkxcG1iMHBMYkFwWUt5OWhhVk5SYWs0NWRFazRRelEyYUd0aWFtTlFkalJwVHpJMmNtcFZSRTB2VDJsRWFuVlBLMnRFTjFaTlFqZHpWMjFTVFZkUWVGbFhTWE5rZG5wNUNtRk5Semd3VnpsMk9FMUpSbFJ4TjBsVVNVTTJjelowVld0aWFsUjVNMlZwVUhSM1ozUlFLMU5aZG1GRFVWRndiVFl6WnowS0xTMHRMUzFGVGtRZ1EwVlNWRWxHU1VOQlZFVXRMUzB0TFFvPQogICAgY2xpZW50LWtleS1kYXRhOiBMUzB0TFMxQ1JVZEpUaUJTVTBFZ1VGSkpWa0ZVUlNCTFJWa3RMUzB0TFFwTlNVbEZiMmRKUWtGQlMwTkJVVVZCZEc5cGJ6QnlhVkpLTDBGamNERjVNMGRDWm1OWVlVSm9TelUxY3pBMlRHNVFlall3VjNnd2NuWTFjeXQxY2xsSUNsaHRkWFpLTlZOeVJWbENVa2RpUlc5TWVubFRPRmRTWWxJd2EzVnlVRTFGTldWVVdVeGpMMGMyY1hKMWJuWkdjVWQwWXpkWVVVZEhNMVJMTDBVeWJDc0tZalY1WWpGclEzSnZlR1l6YzNOUVRGUlNaVUk0Y1RCS1JtZHNWMkowWnpKWFNGVTBXa1ZaT0RKYU9UWnhLMlJNYTFSb1VUQkJNVzFWZGxOUmVsZEdLd3BLVTJKSmVXeDFUbkZTVURScldIQmpRek5KY2tGbmVrWTVjVWMwUzBaVE9IZDVaMFo1UkRsRVVYSk1ObVF4YVRZNGRWSk9NMnByWlZWek5ETkxRalZ2Q2l0WVdrZDJRMGx5U1VablNIZFlRVnBVTjFNeWVpOWtSRkIyZWl0cFNGWlFXSE5XVVVkTVJIUTVjV3BLUm0xeFRGWlBVSGxCYzBKMlYxZHhjMDFXUzJVS1VpdFdXRmRzT0Vsak9XaHZSVlZVWTJ0cmJYRkJZWGRrWXpaRGVrbDZWSEpoTTBveE9GRkpSRUZSUVVKQmIwbENRVVV2SzJGbldWaEVjalI1T0RCMlFncFVVbWhKT1V4RmRscFJXa3B2Y1ZoS1NWcEVUU3RTZEhCSFJrRmlVMEV4Y0ZWeFpHeG9PV2hRZUdaNVoyZEhjRVJCYW5CYVZVbG9jbXMzYTFVNFJtbHdDa1V2T1hkSUwwWk1kVzlCUkUxNGIwTTRTalJqY25jMVpXRmxNSE51VTBwNmRrRTFUREIwZFRsalluSkRLMVJIYkhKeldERlNSMVJIZDJ4SFpTc3ZjMDRLTVVKMFIwYzVWMDlHYjB4Rk5tMTZSbkUwT1ZRek9EWmtORXhpTDJFMmRIbGFRV1pOZEVGYWNFaGhjRnBHZEVwYVZXOTJlRXRFZVVkWE56Rk9UMElyWWdwdWN6WlRaV2hRV1VZMU0wbGFXRGswYWk5NVJFeDNXRTVYT0ZNMmFGbEdORVpwY1RReVMyRkxlU3RFZVhKNVFrMTRVVzV4UzJaU1RsaDRRMlE0ZEhkeENuSjZWRGQwUldaQk1qVlljRllyU0hOemNVWjJVMVZEZDA1eFptbGxZbFprV25oSFdVc3dlbU5ZYnl0WWFuWlVVRlp3VTBkMlVrbHFaRlpOZFN0elNEQUtSak55VkZKNlZVTm5XVVZCTWpZeE5sTnRjbXhGWW1OTFIzbFFWRFJOUVVOVldFNVRabFJHU1RBMWJGWnRiVmRXU1RaTlRXRXlVSHBoWVRNeU4xcDFPUXBESzBwQlFYcFhTQ3RYVmpaaVZEQjVXbnBCU1Vwa05rY3JZbUZCZVhGMFVHaEdka1p6Y20xNWRXTk9lV2xzZURobVl6UkpVMHRLU3l0a2FrcHFOR0ZLQ2xKUlJsRk5UbkZ2VlhSblZXZHFVbE54WkRKNVkzcGFWRGcyTlM5VGJtWktRVVZ6U213dk9VdDBhSFpCZGpWWWIwdHBPWFJ1Tm5ORFoxbEZRVEZNWWpBS0syeE1kbWgwZVRWQmMwTkZZMGRNWTNKSlZTOWxTMUYyVHk5alJWbDNZMllyTjJ0aFZHZDJVMHN6Y0ZaVFUzcDZXWGhSUVVwa1NEYzNRWHBsWlVOT1RBcEphVlJoY1M5U2QweHlTalJrYlVkeVRYWmFhVVJZZVVWNFlUZDRjR1U0VldkQlpEQjFUV1pIYlRGbFIwdHBUelp6VmpKWFlrTkljME5EVm5sdmQyaHZDbUpLVGxwbVMwOUxObHBvVkZwaVUwZE9kSFJqVVdkaVRDdG1SM2t3U2s5amJqVmFZbXhPVFVObldVRTRaMjVvWnpkNmFsSjJSakZ2VWtkSmExVnFPVklLVDBSaVRXcFVja2RNYTBwTFIxSnJVR2tyV0hJemMyYzFiamxYV1dSWlIwcFBTRlI0WWxac1lUbFFlbGxCYW1SVUwxRk5RbWt4TkdGbmJ6ZFFVa2xxVHdweFNXazBVbXBhV1haUFJtTkJNRmN6VlZnd2RYQkxWMHRXU2tOUmJrUndUR0UyVlhaRU9IVXhjR2hrWjBab1JpOUJURmxoZW1sbmNIZDZUVVY2UTBoMENteHlNalY0U0ZKTU0xUkZiV3hMUVhsdWIxaFFjVkZMUW1kQ2JsWXZkblJKYURNNVFqTTVZazUxTUdoTVQySktZVzVPVEhsWWFYQlRXR3cwU1hnMFIzb0taMlJhYnpaVFdVOTJZakJrYTBwS1FVazJVakJXVEhwbE9EQmFNRkYyVUhGMFoxTmpjeXRPTkVka2JVaEZNWGRzVVU1UFUyaERNMlZwWTNNeGRIRXJNZ3BQUWpoYVdrczBTbVV5YjNrelRVbGxUVGszSzFnNFV6bG9ObUl4Y0c1c1NtcEdlblpKUkdkMlNVUkpRMDE1YzBkcFlsbGlWRlJ6VjJWRWJVNU9SVVJPQ2padFIzaEJiMGRCUVc5TVZEUmpOMGRJYkRaWlV6SjVRazlJWTJ4UU9FTTNZMnMwVDBFNE0xcFFRbmhGVkVzeGVua3hSblphVlcxb1ZGcDNlbmRJUlVFS1JEWTFUbWhVTW1SWlUwcFNXV3hKZFd0S1ptcEpTV0ZXWjNobVZHdGtTa0lyWlhOYWVtcHNXVkJFYTNWbVEzRmphWEY2UkZSNlptSlZSa29yYWpGMVpBcGhNbU00UlZCV2QyWTJRMWxLV2taYU1FZEpMMkp6VVN0Vk5XVnZZemN3ZW1FeVNtMUlhRVl5YTNocmRIUjZSME0zVTNNOUNpMHRMUzB0UlU1RUlGSlRRU0JRVWtsV1FWUkZJRXRGV1MwdExTMHRDZz09Cg==
+# Repository id, must be filled out in version replacement mode
+# If the repository needs authentication, the authentication information corresponding to this Id should be added to settings.xml
+dew.devops.it.repository.id=trc-releases
+# Snapshot repository url, must be filled out in version replacement mode
+dew.devops.it.repository.url=http://121.41.17.205:18081/nexus/content/repositories/releases/
# Snapshot repository id, must be filled out in version replacement mode
# If the repository needs authentication, the authentication information corresponding to this Id should be added to settings.xml
dew.devops.it.snapshotRepository.id=trc-snapshots
@@ -7344,7 +7640,31 @@ 6.2.7. Dnsmasq
+ + | ++ntpdate用于服务器间时间同步。 + | +
# 在各节点安装
+yum install -y ntp
+# 修改个节点/etc/crontab文件
+echo '*/1 * * * * root ntpdate cn.pool.ntp.org' >> /etc/crontab
+