Commit ae2de975 authored by BO ZHANG's avatar BO ZHANG 🏀
Browse files

refactor(deploy): 统一使用 HARBOR_IMAGE_PREFIX 变量

parent 1f8730ec
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@ help:
	@echo "Repo-level wrapper. Commands are executed in $(SUBDIR)/"
	@echo ""
	@echo "Common usage:"
	@echo "  make build BUILD_NUMBER=100000 HARBOR_PROJECT=harbor.csst.nao:10443/csst/"
	@echo "  make build BUILD_NUMBER=100000 HARBOR_API_URL=https://harbor.csst.nao:10443 HARBOR_API_PROJECT=csst"
	@echo "  make ansible-update ENV=p368"
	@echo "  make ansible-stop ENV=csu"
	@echo ""
+16 −11
Original line number Diff line number Diff line
@@ -12,7 +12,8 @@

```bash
export BUILD_NUMBER=100000
export HARBOR_PROJECT=harbor.csst.nao:10443/csst/
export HARBOR_API_URL=https://harbor.csst.nao:10443
export HARBOR_API_PROJECT=csst

make build
make push
@@ -26,7 +27,8 @@ make clean
```bash
export ENV=p368
export BUILD_NUMBER=100000
export HARBOR_PROJECT=harbor.csst.nao:10443/csst/
export HARBOR_API_URL=https://harbor.csst.nao:10443
export HARBOR_API_PROJECT=csst

make ansible-update
```
@@ -41,7 +43,8 @@ make ansible-update
```bash
export ENV=csu
export BUILD_NUMBER=100000
export HARBOR_PROJECT=csu-harbor.csst.nao:10443/csst/
export HARBOR_API_URL=https://csu-harbor.csst.nao:10443
export HARBOR_API_PROJECT=csst

make ansible-update
```
@@ -113,10 +116,10 @@ make ansible-down
```

说明:
- `make pull` 只负责从 `required-images.txt` 拉取第三方镜像,不依赖 `BUILD_NUMBER/HARBOR_PROJECT`
- `make pull` 只负责从 `required-images.txt` 拉取第三方镜像,不依赖 `BUILD_NUMBER/HARBOR_API_*`
- `make push` 会把镜像推送到仓库,镜像 tag 使用 `BUILD_NUMBER`(默认 `latest`)。
- `make clean` 会统一清理本地构建镜像、dangling images、builder cache,以及其他未使用镜像。
- `make ansible-*` 主要依赖 `ENV` 选择 inventory;同时会把 `BUILD_NUMBER`(镜像 tag,默认 `latest`)与 `HARBOR_PROJECT`(可选,镜像仓库前缀,如 `harbor.csst.nao:10443/csst/`)作为 Ansible extra vars 传入,用于决定 docker compose 使用的镜像 tag/前缀。
- `make ansible-*` 主要依赖 `ENV` 选择 inventory;镜像仓库前缀会由 `HARBOR_API_URL/HARBOR_API_PROJECT` 自动派生,用于决定 docker compose 使用的镜像 tag/前缀。
- `make ansible-update`:更新 `master + worker`
- `make ansible-update-master`:只更新 `master`
- `make ansible-update-worker`:只更新 `worker`,并在 `serial: 1` 的滚动流程中跳过 busy worker。
@@ -179,16 +182,17 @@ ansible-playbook \
  ansible/<playbook>.yml \
  -e env=<env> \
  -e build_number=<build_number> \
  [-e harbor_project=<harbor_project_prefix>]
  [-e harbor_image_prefix=<harbor_image_prefix>] \
  [-e harbor_registry=<harbor_registry>]
```

### 私有 Harbor 镜像拉取(Docker login)

如果你在 DAG 运行期使用 DockerOperator 从私有 Harbor 拉取镜像,需要确保 **每个 master/worker 宿主机**已完成 `docker login`(因为 DockerOperator 实际由宿主机 `dockerd` 拉取镜像)。

本项目已在 `ansible/deploy.yml``ansible/update.yml` 中提供可选的自动登录步骤:当 `harbor_project`(用于镜像前缀)与 Harbor 凭证同时存在时,会在所有节点执行一次 `docker login`
本项目已在 `ansible/deploy.yml``ansible/update.yml` 中提供可选的自动登录步骤:当 `harbor_registry` 与 Harbor 凭证同时存在时,会在所有节点执行一次 `docker login`

建议优先在 `deploy_configs/<env>/inventory.ini` 配置 `harbor_registry`(例如 `harbor.csst.nao:10443`)用于登录;避免仅为了登录而设置 `harbor_project` 导致 docker-compose 把第三方镜像也切到 Harbor 前缀
建议优先在 `deploy_configs/<env>/inventory.ini` 配置 `harbor_registry`(例如 `harbor.csst.nao:10443`)用于登录;镜像前缀则统一由 `variables.toml` 中的 `HARBOR_API_URL/HARBOR_API_PROJECT` 派生

推荐做法:不要把明文密码写进 `inventory.ini`
- 方案 A(推荐):在执行 Ansible 的控制端设置环境变量 `HARBOR_USERNAME`/`HARBOR_PASSWORD`
@@ -218,7 +222,7 @@ ansible-playbook -i deploy_configs/${ENV}/inventory.ini ansible/update.yml -e en

2) `deploy_configs/<env>/inventory.ini`(必需)
- 定义部署拓扑(master/worker)、SSH 连接与关键变量(如 `deploy_dir``registry_pull``harbor_registry``extra_hosts``jwt_secret`)。`worker` 组支持按主机单独设置 `worker_concurrency`,Ansible 在启动各 worker 时会把该值映射到容器内并发配置。
- 镜像 tag/仓库前缀默认由执行端的 `BUILD_NUMBER/HARBOR_PROJECT` 传入(见上文);如需固化到环境配置,也可以在 inventory 的 `[all:vars]` 中设置 `build_number/harbor_project` 覆盖。
- 镜像 tag 默认由执行端的 `BUILD_NUMBER` 传入;镜像仓库前缀统一由 `variables.toml` 中的 `HARBOR_API_URL/HARBOR_API_PROJECT` 派生,也可通过执行端环境变量覆盖。

3) `deploy_configs/<env>/variables.toml`(可选,但推荐)
- `runtime`:唯一的共享运行时环境分组。部署时会同时导入 Airflow Variables(键名固定为 `runtime`)并渲染为 `deploy_configs/<env>/gateway.env`,分别供 DAG 任务执行阶段与 API Gateway 启动阶段使用。
@@ -281,7 +285,8 @@ set -e

export ENV=p368
export BUILD_NUMBER=100000
export HARBOR_PROJECT=harbor.csst.nao:10443/csst/
export HARBOR_API_URL=https://harbor.csst.nao:10443
export HARBOR_API_PROJECT=csst

make build
make push
@@ -289,7 +294,7 @@ make push

说明:
- `make build` 会构建全部镜像,并将 Portal 的 build number 设置为 `BUILD_NUMBER`
- `make push` 会将镜像推送到 `HARBOR_PROJECT` 指定的仓库。
- `make push` 会将镜像推送到 `HARBOR_API_URL/HARBOR_API_PROJECT` 派生出的仓库前缀

## 故障排除

+29 −19
Original line number Diff line number Diff line

# 镜像版本和构建相关
BUILD_NUMBER ?= latest
HARBOR_PROJECT ?= 
HARBOR_API_URL ?=
HARBOR_API_PROJECT ?=
HARBOR_IMAGE_PREFIX ?=
SKIP_JS9 ?= 1
DOCKER_BUILD_PROGRESS ?= plain
PIP_INDEX_URL ?= https://pypi.tuna.tsinghua.edu.cn/simple/
@@ -13,12 +15,21 @@ PIP_RETRIES ?= 5
# 第三方依赖镜像清单文件
REQ_FILE := required-images.txt

ifeq ($(strip $(HARBOR_IMAGE_PREFIX)),)
ifneq ($(strip $(HARBOR_API_URL)),)
HARBOR_IMAGE_PREFIX := $(shell python3 -c "from urllib.parse import urlparse; import sys; url=sys.argv[1].strip(); proj=sys.argv[2].strip().strip('/'); parsed=urlparse(url if '://' in url else 'https://' + url); reg=(parsed.netloc or parsed.path).strip('/'); print((reg + '/' + proj + '/' if proj else reg + '/') if reg else '')" "$(HARBOR_API_URL)" "$(HARBOR_API_PROJECT)")
else ifneq ($(strip $(ENV)),)
HARBOR_IMAGE_PREFIX := $(shell python3 scripts/variables_toml_tool.py harbor-image-prefix deploy_configs/$(ENV)/variables.toml /dev/stdout 2>/dev/null | tr -d '\n')
endif
endif
HARBOR_REGISTRY := $(shell printf '%s' "$(HARBOR_IMAGE_PREFIX)" | sed 's#/*$$##' | cut -d/ -f1)

# 业务自定义镜像
TARGET_AIRFLOW := $(HARBOR_PROJECT)csst-airflow:$(BUILD_NUMBER)
TARGET_API_GATEWAY := $(HARBOR_PROJECT)csst-airflow-api-gateway:$(BUILD_NUMBER)
TARGET_TASK_PORTAL := $(HARBOR_PROJECT)csst-airflow-task-portal:$(BUILD_NUMBER)
TARGET_WORKER_STATS_AGENT := $(HARBOR_PROJECT)csst-airflow-worker-stats-agent:$(BUILD_NUMBER)
TARGET_JS9 := $(HARBOR_PROJECT)csst-airflow-js9:$(BUILD_NUMBER)
TARGET_AIRFLOW := $(HARBOR_IMAGE_PREFIX)csst-airflow:$(BUILD_NUMBER)
TARGET_API_GATEWAY := $(HARBOR_IMAGE_PREFIX)csst-airflow-api-gateway:$(BUILD_NUMBER)
TARGET_TASK_PORTAL := $(HARBOR_IMAGE_PREFIX)csst-airflow-task-portal:$(BUILD_NUMBER)
TARGET_WORKER_STATS_AGENT := $(HARBOR_IMAGE_PREFIX)csst-airflow-worker-stats-agent:$(BUILD_NUMBER)
TARGET_JS9 := $(HARBOR_IMAGE_PREFIX)csst-airflow-js9:$(BUILD_NUMBER)

CUSTOM_IMAGE_COUNT := 5
ifeq ($(strip $(SKIP_JS9)),1)
@@ -26,8 +37,11 @@ CUSTOM_IMAGE_COUNT := 4
endif

ANSIBLE_EXTRA_VARS := -e env=$(ENV) -e build_number=$(BUILD_NUMBER)
ifneq ($(strip $(HARBOR_PROJECT)),)
ANSIBLE_EXTRA_VARS += -e harbor_project=$(HARBOR_PROJECT)
ifneq ($(strip $(HARBOR_IMAGE_PREFIX)),)
ANSIBLE_EXTRA_VARS += -e harbor_image_prefix=$(HARBOR_IMAGE_PREFIX)
endif
ifneq ($(strip $(HARBOR_REGISTRY)),)
ANSIBLE_EXTRA_VARS += -e harbor_registry=$(HARBOR_REGISTRY)
endif

API_GATEWAY_BUILD_ARGS := --build-arg PIP_DEFAULT_TIMEOUT=$(PIP_DEFAULT_TIMEOUT) --build-arg PIP_RETRIES=$(PIP_RETRIES)
@@ -97,7 +111,7 @@ build:
	for img in $$(grep -v '^#' $(REQ_FILE) | grep -v '^$$'); do \
		basename="$${img##*/}"; \
		name="$${basename%%:*}"; \
		target="$(HARBOR_PROJECT)$${name}:$(BUILD_NUMBER)"; \
		target="$(HARBOR_IMAGE_PREFIX)$${name}:$(BUILD_NUMBER)"; \
		if docker image inspect $${img} > /dev/null 2>&1; then \
			echo "[$${count}/$${total_imgs}] Processing $${img} -> $${target} (Skipping pull, already exists)..."; \
		else \
@@ -140,16 +154,16 @@ build:
	echo "All $${total_imgs} images prepared successfully."

push:
	@if [ -z "$(HARBOR_PROJECT)" ]; then echo "Error: HARBOR_PROJECT is empty. Please specify a registry prefix to push. Example: make push HARBOR_PROJECT=csu-harbor.csst.nao:10443/csst/"; exit 1; fi
	@if [ -z "$(HARBOR_IMAGE_PREFIX)" ]; then echo "Error: HARBOR_IMAGE_PREFIX is empty. Please specify HARBOR_API_URL/HARBOR_API_PROJECT or HARBOR_IMAGE_PREFIX before push."; exit 1; fi
	@set -e; \
	total=$$(grep -v '^#' $(REQ_FILE) | grep -v '^$$' | wc -l); \
	total_imgs=$$(($$total+$(CUSTOM_IMAGE_COUNT))); \
	echo "Pushing all $${total_imgs} images to $(HARBOR_PROJECT)..."; \
	echo "Pushing all $${total_imgs} images to $(HARBOR_IMAGE_PREFIX)..."; \
	count=1; \
	for img in $$(grep -v '^#' $(REQ_FILE) | grep -v '^$$'); do \
		basename="$${img##*/}"; \
		name="$${basename%%:*}"; \
		target="$(HARBOR_PROJECT)$${name}:$(BUILD_NUMBER)"; \
		target="$(HARBOR_IMAGE_PREFIX)$${name}:$(BUILD_NUMBER)"; \
		echo "[$${count}/$${total_imgs}] Pushing $${target}..."; \
		docker push $${target}; \
		count=$$((count+1)); \
@@ -161,7 +175,7 @@ push:
	if [ "$(SKIP_JS9)" != "1" ]; then \
		echo "[$$(($$total+5))/$${total_imgs}] Pushing $(TARGET_JS9)..." && docker push $(TARGET_JS9); \
	fi; \
	echo "All $${total_imgs} images pushed successfully to $(HARBOR_PROJECT) with tag $(BUILD_NUMBER)."
	echo "All $${total_imgs} images pushed successfully to $(HARBOR_IMAGE_PREFIX) with tag $(BUILD_NUMBER)."

all: clean pull build push

@@ -200,14 +214,10 @@ ansible-deploy:
ansible-update:
	@if [ -z "$(ENV)" ]; then echo "Error: ENV is not set. Usage: make ansible-update ENV=p368"; exit 1; fi
	@if [ ! -f "deploy_configs/$(ENV)/inventory.ini" ]; then echo "Error: deploy_configs/$(ENV)/inventory.ini not found"; exit 1; fi
	@effective_harbor_project="$(HARBOR_PROJECT)"; \
	if [ -z "$$effective_harbor_project" ]; then \
		effective_harbor_project=$$(awk -F= '/^[[:space:]]*harbor_project=/{print $$2; exit}' deploy_configs/$(ENV)/inventory.ini); \
	fi; \
	echo "ENV=$(ENV)"; \
	echo "BUILD_NUMBER=$(BUILD_NUMBER)"; \
	echo "HARBOR_PROJECT=$(HARBOR_PROJECT)"; \
	echo "EFFECTIVE_HARBOR_PROJECT=$$effective_harbor_project"
	echo "HARBOR_IMAGE_PREFIX=$(HARBOR_IMAGE_PREFIX)"; \
	echo "HARBOR_REGISTRY=$(HARBOR_REGISTRY)"
	ansible-playbook -i deploy_configs/$(ENV)/inventory.ini ansible/update.yml $(ANSIBLE_EXTRA_VARS)

ansible-update-master:
+22 −22
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@
    _env: "{{ env | default('p368') }}"
    _deploy_dir: "{{ deploy_dir | default('/opt/csst-airflow') }}"
    local_project_dir: ".."
    _docker_registry: "{{ (harbor_registry | default('') | trim) if (harbor_registry | default('') | trim | length > 0) else (((harbor_project | default('')).split('/')[0]) if (harbor_project | default('') | length > 0) else '') }}"
    _docker_registry: "{{ (harbor_registry | default('') | trim) if (harbor_registry | default('') | trim | length > 0) else (((harbor_image_prefix | default('')).split('/')[0]) if (harbor_image_prefix | default('') | length > 0) else '') }}"
    _docker_login_username: "{{ harbor_username | default(lookup('env', 'HARBOR_USERNAME'), true) | default('', true) }}"
    _docker_login_password: "{{ harbor_password | default(lookup('env', 'HARBOR_PASSWORD'), true) | default('', true) }}"

@@ -169,7 +169,7 @@
    - name: Start Master services (postgres, redis, elasticsearch, airflow core, api, etc.)
      shell: |
        set -e
        export HARBOR_PROJECT="{{ harbor_project | default('') }}"
        export HARBOR_IMAGE_PREFIX="{{ harbor_image_prefix | default('') }}"
        export BUILD_NUMBER="{{ _build_number }}"
        export MASTER_IP="{{ hostvars[groups['master'][0]]['ansible_host'] | default('127.0.0.1') }}"
        export JWT_SECRET="{{ jwt_secret | default('eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhaXJmbG93IiwiaWF0IjoxNzU1NDQ3NjMxLCJleHAiOjE3ODY5ODM2MzF9.CbxQayEt370iHhvYXhHMESsk1IWmi8QLMOcctIlbicXhybNtBbfboDUdUDMClwvkSuTjC0AOeSHL23pGyy0plQ') }}"
@@ -185,20 +185,20 @@
          COMPOSE_FILES="$COMPOSE_FILES -f deploy_configs/{{ _env }}/docker-compose.harbor-api-auth.override.yml"
        fi

        docker rmi -f {{ harbor_project | default('') }}postgres:{{ _build_number }} || true
        docker rmi -f {{ harbor_project | default('') }}redis:{{ _build_number }} || true
        docker rmi -f {{ harbor_project | default('') }}elasticsearch:{{ _build_number }} || true
        docker rmi -f {{ harbor_project | default('') }}kibana:{{ _build_number }} || true
        docker rmi -f {{ harbor_project | default('') }}filebeat:{{ _build_number }} || true
        docker rmi -f {{ harbor_project | default('') }}prometheus:{{ _build_number }} || true
        docker rmi -f {{ harbor_project | default('') }}grafana:{{ _build_number }} || true
        docker rmi -f {{ harbor_project | default('') }}cadvisor:{{ _build_number }} || true
        docker rmi -f {{ harbor_project | default('') }}node-exporter:{{ _build_number }} || true
        docker rmi -f {{ harbor_project | default('') }}csst-airflow-api-gateway:{{ _build_number }} || true
        docker rmi -f {{ harbor_project | default('') }}csst-airflow-task-portal:{{ _build_number }} || true
        docker rmi -f {{ harbor_project | default('') }}csst-airflow-js9:{{ _build_number }} || true
        docker rmi -f {{ harbor_project | default('') }}csst-airflow:{{ _build_number }} || true
        docker rmi -f {{ harbor_project | default('') }}csst-airflow-worker-stats-agent:{{ _build_number }} || true
        docker rmi -f {{ harbor_image_prefix | default('') }}postgres:{{ _build_number }} || true
        docker rmi -f {{ harbor_image_prefix | default('') }}redis:{{ _build_number }} || true
        docker rmi -f {{ harbor_image_prefix | default('') }}elasticsearch:{{ _build_number }} || true
        docker rmi -f {{ harbor_image_prefix | default('') }}kibana:{{ _build_number }} || true
        docker rmi -f {{ harbor_image_prefix | default('') }}filebeat:{{ _build_number }} || true
        docker rmi -f {{ harbor_image_prefix | default('') }}prometheus:{{ _build_number }} || true
        docker rmi -f {{ harbor_image_prefix | default('') }}grafana:{{ _build_number }} || true
        docker rmi -f {{ harbor_image_prefix | default('') }}cadvisor:{{ _build_number }} || true
        docker rmi -f {{ harbor_image_prefix | default('') }}node-exporter:{{ _build_number }} || true
        docker rmi -f {{ harbor_image_prefix | default('') }}csst-airflow-api-gateway:{{ _build_number }} || true
        docker rmi -f {{ harbor_image_prefix | default('') }}csst-airflow-task-portal:{{ _build_number }} || true
        docker rmi -f {{ harbor_image_prefix | default('') }}csst-airflow-js9:{{ _build_number }} || true
        docker rmi -f {{ harbor_image_prefix | default('') }}csst-airflow:{{ _build_number }} || true
        docker rmi -f {{ harbor_image_prefix | default('') }}csst-airflow-worker-stats-agent:{{ _build_number }} || true
        {{ docker_compose_cmd }} $COMPOSE_FILES --env-file deploy_configs/airflow.env --profile master pull
        {{ docker_compose_cmd }} $COMPOSE_FILES --env-file deploy_configs/airflow.env --profile master up -d --remove-orphans
        ensure_tag() {
@@ -327,7 +327,7 @@
    - name: Start Worker services (celery-worker, filebeat, monitoring)
      shell: |
        set -e
        export HARBOR_PROJECT="{{ harbor_project | default('') }}"
        export HARBOR_IMAGE_PREFIX="{{ harbor_image_prefix | default('') }}"
        export BUILD_NUMBER="{{ _build_number }}"
        export MASTER_IP="{{ hostvars[groups['master'][0]]['ansible_host'] | default('127.0.0.1') }}"
        export JWT_SECRET="{{ jwt_secret | default('eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhaXJmbG93IiwiaWF0IjoxNzU1NDQ3NjMxLCJleHAiOjE3ODY5ODM2MzF9.CbxQayEt370iHhvYXhHMESsk1IWmi8QLMOcctIlbicXhybNtBbfboDUdUDMClwvkSuTjC0AOeSHL23pGyy0plQ') }}"
@@ -343,10 +343,10 @@
          COMPOSE_FILES="$COMPOSE_FILES -f deploy_configs/{{ _env }}/docker-compose.docker-sock.override.yml"
        fi

        docker rmi -f {{ harbor_project | default('') }}filebeat:{{ _build_number }} || true
        docker rmi -f {{ harbor_project | default('') }}cadvisor:{{ _build_number }} || true
        docker rmi -f {{ harbor_project | default('') }}node-exporter:{{ _build_number }} || true
        docker rmi -f {{ harbor_project | default('') }}csst-airflow:{{ _build_number }} || true
        docker rmi -f {{ harbor_image_prefix | default('') }}filebeat:{{ _build_number }} || true
        docker rmi -f {{ harbor_image_prefix | default('') }}cadvisor:{{ _build_number }} || true
        docker rmi -f {{ harbor_image_prefix | default('') }}node-exporter:{{ _build_number }} || true
        docker rmi -f {{ harbor_image_prefix | default('') }}csst-airflow:{{ _build_number }} || true
        {{ docker_compose_cmd }} $COMPOSE_FILES --env-file deploy_configs/airflow.env --profile worker pull
        {{ docker_compose_cmd }} $COMPOSE_FILES --env-file deploy_configs/airflow.env --profile worker up -d --remove-orphans --force-recreate airflow-worker worker-stats-agent filebeat cadvisor node-exporter
        ensure_tag() {
@@ -411,7 +411,7 @@
    - name: Restart Flower and API Gateway to ensure they detect new workers
      shell: |
        set -e
        export HARBOR_PROJECT="{{ harbor_project | default('') }}"
        export HARBOR_IMAGE_PREFIX="{{ harbor_image_prefix | default('') }}"
        export BUILD_NUMBER="{{ _build_number }}"
        export ENV="{{ _env }}"

+2 −2
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@
  tasks:
    - name: Shutdown Master services
      shell: |
        export HARBOR_PROJECT="{{ harbor_project | default('') }}"
        export HARBOR_IMAGE_PREFIX="{{ harbor_image_prefix | default('') }}"
        export BUILD_NUMBER="{{ _build_number }}"
        export MASTER_IP="{{ hostvars[groups['master'][0]]['ansible_host'] | default('127.0.0.1') }}"
        export JWT_SECRET="{{ jwt_secret | default('eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhaXJmbG93IiwiaWF0IjoxNzU1NDQ3NjMxLCJleHAiOjE3ODY5ODM2MzF9.CbxQayEt370iHhvYXhHMESsk1IWmi8QLMOcctIlbicXhybNtBbfboDUdUDMClwvkSuTjC0AOeSHL23pGyy0plQ') }}"
@@ -45,7 +45,7 @@
  tasks:
    - name: Shutdown Worker services
      shell: |
        export HARBOR_PROJECT="{{ harbor_project | default('') }}"
        export HARBOR_IMAGE_PREFIX="{{ harbor_image_prefix | default('') }}"
        export BUILD_NUMBER="{{ _build_number }}"
        export MASTER_IP="{{ hostvars[groups['master'][0]]['ansible_host'] | default('127.0.0.1') }}"
        export JWT_SECRET="{{ jwt_secret | default('eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhaXJmbG93IiwiaWF0IjoxNzU1NDQ3NjMxLCJleHAiOjE3ODY5ODM2MzF9.CbxQayEt370iHhvYXhHMESsk1IWmi8QLMOcctIlbicXhybNtBbfboDUdUDMClwvkSuTjC0AOeSHL23pGyy0plQ') }}"
Loading