在Yaml文件中使用动态变量/占位符

时间:2020-02-20 20:08:55

标签: python bash google-app-engine google-cloud-platform yaml

我有一个Google AppEngine Yaml文件,如下所示:

entrypoint: mlflow server \
    --host 0.0.0.0 \
    --workers 4 \
    --backend-store-uri postgresql+psycopg2://$DB_USER:$DB_PASS@/$DB_NAME?host=/cloudsql/<project_id>:us-east1:<cloud-sql-instance> \
    --default-artifact-root gs://$GCP_STORAGE_BUCKET \
    --port $PORT
service: mlflow-tracking-server
runtime: python37
beta_settings:
    cloud_sql_instances: <project_id>:us-east1:<cloud-sql-instance>
resources:
    cpu: 4
    memory_gb: 12
    disk_size_gb: 60

如何用这些占位符变量替换它们各自的值?

对于Kubernetes,我知道我有一个执行此操作的bash脚本。

示例:

#!/usr/bin/env bash

sed "s/GCLOUD_SERVICE_KEY_ENC_REPLACE/$(printf "%s" "$GCLOUD_SERVICE_KEY_ENC"|base64)/g" mlflow_gcp_secret.yaml | \
sed "s/GCP_STORAGE_BUCKET_REPLACE/$(printf "%s" "$GCP_STORAGE_BUCKET"|base64)/g" | \
sed "s/CLOUDSQL_USER_REPLACE/$(printf "%s" "$DB_USER"|base64)/g" | \
sed "s/CLOUDSQL_PASS_REPLACE/$(printf "%s" "$DB_PASS"|base64)/g" | \
sed "s/CLOUDSQL_DB_REPLACE/$(printf "%s" "$DB_NAME"|base64)/g" | \
kubectl apply -f -

现在,我想为App Engine yaml文件做些事情。

2 个答案:

答案 0 :(得分:1)

我认为您的sed示例足以使您在此任务上取得进展。但是,这是第二种方法。由于所有占位符看起来都像环境变量,因此可以使用bash插值为您进行替换。

考虑以下代码:

DBUSER=user
DBPASS=pass
GCP_STORAGE_BUCKET=bucket

cat  > 4appengine <<EOF
entrypoint: mlflow server \
    --host 0.0.0.0 \
    --workers 4 \
    --backend-store-uri postgresql+psycopg2://$DB_USER:$DB_PASS@/$DB_NAME?host=/cloudsql/<project_id>:us-east1:<cloud-sql-instance> \
    --default-artifact-root gs://$GCP_STORAGE_BUCKET \
    --port $PORT
service: mlflow-tracking-server
runtime: python37
beta_settings:
    cloud_sql_instances: <project_id>:us-east1:<cloud-sql-instance>
resources:
    cpu: 4
    memory_gb: 12
    disk_size_gb: 60
EOF

上面,替换了变量的脚本将被写入文件4appengine。

答案 1 :(得分:1)

有一个专用于此的工具:

envsubst '$DB_USER:$DB_PASS:$GCP_STORAGE_BUCKET' <cfg.yml

将环境中列出的所有变量替换为

演示:https://ideone.com/6mEQk9

注意:envsubst是gnu gettext的一部分,很常见,但默认情况下可能不可用。