基於 YAML 檔案的 OpenResty Edge 配置映象

我們提供了一個命令列工具,用於支援基於本地 YAML 檔案配置更新 OpenResty Edge 中的配置,以及從 OpenResty Edge 中匯出配置到 yaml 檔案中。 本地配置中的應用配置按應用劃分,全域性配置按照分割槽劃分。每份本地配置與 OpenResty Edge 中的一個分割槽和一個應用對應。您可以使用 Git 等版本控制工具對本地配置進行管理。

請注意:該命令列工具僅支援企業版的 OpenResty Edge。

本文件將詳細介紹如何安裝和使用該工具。

安裝

  1. 安裝命令列工具所需的依賴項

    pip3 install --upgrade openresty-edge-sdk ruamel.yaml pyOpenSSL jinja2
    

    請確保 openresty-edge-sdk 的版本大於或等於 1.2.60

  2. 執行命令列工具

    要檢視該命令列工具的使用方法,請執行以下命令:

    edge-config -h
    

    命令輸出如下(不同版本輸出可能略有差異):

    usage: edge-config [-h] -t API_TOKEN -u ADMIN_URL [-s] [-i CONFIGS_PATH] [-e EMAIL_CONFIG_FILE] [-U USERS_CONFIG_PATH] [-F]
                      [-l LOCATION] [-d DOMAIN] [-P EXPORT_TO_PATH] [-p PARTITION_ID | -n PARTITION_NAME] [-c | -E]
    
    Update or add OpenResty Edge configuration.
    
    optional arguments:
      -h, --help            show this help message and exit
      -t API_TOKEN, --api-token API_TOKEN
                            specify the API token for sending the request
      -u ADMIN_URL, --admin-url ADMIN_URL
                            specify the URL of the OpenResty Edge Admin. For example, https://admin.com:443
      -s, --disable-ssl-verify
                            turn off SSL verification for requests to access OpenResty Edge Admin
      -i CONFIGS_PATH, --configs-path CONFIGS_PATH
                            specify the path to the configuration file
      -e EMAIL_CONFIG_FILE, --email-config-file EMAIL_CONFIG_FILE
                            specify the file to the email configuration; if not specified, the email.yaml file in the configuration
                            path will be used
      -U USERS_CONFIG_PATH, --users-config-path USERS_CONFIG_PATH
                            specify the path to the users configuration; if not specified, the users/ path in the configuration
                            path will be used
      -F, --export-fake-privacy-info
                            use placeholders in place of privacy information when exporting
      -l LOCATION, --location LOCATION
                            specify the configuration name that needs to be updated, supported: page_rules, edgelang_rules,
                            upstreams, k8s_upstreams, user_variables, ip_lists, waf_whitelist, basic_auth_groups,
                            global_lua_modules, global_custom_actions, global_configs, global_page_templates, global_upstreams,
                            global_k8s_upstreams, global_ip_lists, global_basic_auth_groups, global_static_files, k8s, users, all
      -d DOMAIN, --domain DOMAIN
                            specify a domain name. When an HTTP application containing this domain exists, it will be updated;
                            otherwise, a new application will be created
      -P EXPORT_TO_PATH, --export-to-path EXPORT_TO_PATH
                            specify the storage path of the exported configuration. If not specified, a directory prefixed with
                            configs will be automatically created in the current path.
      -p PARTITION_ID, --partition-id PARTITION_ID
                            specify the id of the partition where you want to add or update the configuration
      -n PARTITION_NAME, --partition-name PARTITION_NAME
                            specify the name of the partition where you want to add or update the configuration
      -c, --cleanup         based on the location. This option allows for the cleanup of page rules, application upstreams, global
                            user variables, and resetting the access log format for partitions. It can also be used independently
                            of the location
      -E, --export          export the configuration to the specified path, which can be specified through the --export-to-path
                            option
    

    透過指定 -p PARTITION_ID-n PARTITION_NAME 選項,您可以將配置更新到指定的分割槽。

    示例:

    edge-config -t 3ed00172-280e-4e43-a4ef-3c2fae5669ca -u https://192.168.1.1 -s -i /path/of/configs -n default -d test.com
    

    此命令將更新配置到預設分割槽(名稱為 default,id 為 1),如果 test.com 應用不存在,則會建立它。

如果遇到 No module named 'MODULE_NAME' 錯誤,請使用以下命令安裝相應的依賴項:

pip3 install MODULE_NAME

請將命令中的 MODULE_NAME 替換為實際的模組名稱。

建立 API 令牌

  1. 登入 OpenResty Edge 管理控制檯。
  2. 點選右上角的使用者名稱:USERNAME > API 令牌 > 建立 API 令牌 > 複製 API 令牌。

目錄結構介紹

該命令列工具可以識別以下結構的配置:

|-- configs/
  |-- global_lua_modules/
  |-- global_basic_auth_groups/
  |-- global_custom_actions/
  |-- global_ip_lists/
  |-- global_upstreams/
  |-- global_k8s_upstreams/
  |-- global_page_templates/
  |-- global_static_files/
  |-- k8s/
  |-- upstreams/
  |-- k8s_upstreams/
  |-- edgelang_rules/
  |-- page_rules/
  |-- basic_auth_groups/
  |-- ip_lists/
  |-- user_variables/
  |-- waf_whitelist/
  |-- users/
  |-- global_configs.yaml
  |-- app.yaml
  |-- email.yaml

configs/ 目錄包含了某個分割槽的所有配置。

全域性配置以 global_ 作為字首:

  • global_lua_modules/:全域性 Lua 模組,每個 Lua 檔案代表一個模組。
  • global_basic_auth_groups/:全域性 Basic 認證使用者組及使用者配置。
  • global_custom_actions/:全域性自定義動作。
  • global_ip_lists/:全域性 IP 列表。
  • global_upstreams/:全域性上游。
  • global_k8s_upstreams/:全域性 Kubernetes 上游。
  • global_page_templates/:全域性頁面模板。
  • global_static_files/:全域性靜態檔案。
  • global_configs.yaml:包括全域性配置,如全域性使用者變數、訪問日誌格式等。

應用配置沒有字首:

  • upstreams/:上游伺服器資訊,可分割成多個檔案以便管理。
  • page_rules/:頁面規則,將被新增到與分割槽相關的 HTTP 應用中。
  • basic_auth_groups/:Basic 認證使用者組及使用者配置。
  • k8s_upstreams/:Kubernetes 上游伺服器資訊。
  • edgelang_rules/頁面規則介面中最前面和最後面的 Edgelang 規則。
  • ip_lists/:IP 列表資訊。
  • user_variables/:使用者變數資訊。
  • waf_whitelist/:WAF 白名單。
  • app.yaml:應用相關配置,如域名、訪問日誌格式。

其他沒有 global 字首的配置目錄:

  • users/:要新增到 Edge Admin 中的使用者,建立成功後可傳送郵件通知。
  • k8s/:Kubernetes 叢集資訊。

所有這些配置目錄都是可選的,命令列工具不要求配置目錄必須存在。

匯入配置到 OpenResty Edge 的示例

將所有配置匯入到分割槽 1(default),當應用 test.com 不存在時,會建立應用:

edge-config -t 6cc1cf09-1a39-4c17-8ed6-c11838edac12 \
    -u https://192.168.1.1 -s -i /path/of/configs -n default -d test.com

僅將頁面規則匯入到應用 “test.com”:

edge-config -t 6cc1cf09-1a39-4c17-8ed6-c11838edac12 \
    -u https://192.168.1.1 -s -i /path/of/configs -n default -l page_rules -d test.com

從 OpenResty Edge 中匯出配置的示例

匯出配置到隨機生成的目錄中(目錄資訊將在命令列工具的第一行中輸出):

edge-config -t 6cc1cf09-1a39-4c17-8ed6-c11838edac12 \
  -u https://192.168.1.1 -s -d test.com -E

匯出配置到指定的目錄中:

edge-config -t 6cc1cf09-1a39-4c17-8ed6-c11838edac12 \
  -u https://192.168.1.1 -s -d test.com -E --export-to-path /tmp/edge-configs

從 OpenResty Edge 中刪除配置的示例

刪除 default 分割槽中 test.com 域名對應的應用,如果全域性配置沒有啟用“自動同步到其他分割槽”則還會清理分割槽配置:

edge-config -t 6cc1cf09-1a39-4c17-8ed6-c11838edac12 \
    -u https://192.168.1.1 -s -i /path/of/configs -n default -d test.com -c

從應用 “test.com” 中移除所有頁面規則:

edge-config -t 6cc1cf09-1a39-4c17-8ed6-c11838edac12 \
    -u https://192.168.1.1 -s -i /path/of/configs -n default -l page_rules -d test.com -c

從分割槽 1(預設)中移除所有 Lua 模組(當啟用"透過到所有分割槽"時,因為所有分割槽共享這些配置,因此將不會執行實際的刪除操作):

edge-config -t 6cc1cf09-1a39-4c17-8ed6-c11838edac12 \
    -u https://192.168.1.1 -s -i /path/of/configs -n default -l global_lua_modules -c

配置示例

更多示例請參見基於 YAML 檔案的 OpenResty Edge 配置示例

- enable_rule: true
  actions:
    set-access-log-off: {}
    print:
      content_type: text/html
      msg: favicon.ico and robots.txt
    exit:
      code: 200
  conditions:
  - op: eq
    var: uri
    vals:
      - /favicon.ico
      - /robots.txt
  order: 1
  comment: ''
- enable_rule: true
  actions:
    - user-code:
      el: |-
        {
        my Str $transid;

        true =>
            foreign-call(module: "example", func: "go"),
            $transid = ctx-var("lm_transid"),
            $or_global_user_variable_uuid = $transid,
            done;
        }
  comment: ''

頁面規則是有序的,更新到 Edge Admin 時將保持配置檔案中的順序。此示例包括兩條頁面規則:

  1. 第一條規則判斷 URI 是否為 /favicon.ico/robots.txt,如果是,則禁用訪問日誌並輸出指定內容。
  2. 第二條規則無條件執行一段 Edgelang 程式碼,該程式碼設定全域性使用者變數 $or_global_user_variable_uuid

所有頁面規則組成一個陣列,每條頁面規則都是陣列的一個元素。

錯誤訊息示例

對於配置檔案錯誤,命令列工具將嘗試提供提示,指出錯誤發生的具體行號。

[!] Error: invalid port in upstream upstream_name_foo: 70000, file: foo.yaml, line: 6.

此外還有一些其他錯誤,例如下面的錯誤表明輸入的配置路徑不正確,命令列工具無法找到該路徑。

[!] Error: bad configs path: /bad/path.

更多說明

該命令列工具有兩個模式。 當 OpenResty Edge 中的“全域性配置 > 通用配置”以及“全域性配置 > 全域性 Lua 模組”啟用了“自動同步到其他分割槽”時,為相容多本地配置的場景,更新或清理操作中,相關配置不會被重置或清理。 當沒有啟用時,意味著各個分割槽有各自的“全域性配置 > 通用配置”以及“全域性配置 > 全域性 Lua 模組”配置,因此更新或清理操作中,這些配置中多餘的配置將會被重置或清理。