專案

專案是定義節點組態的資源集合。 專案包含 規格。 節點啟動時,會藉由處理和執行一連串規格來設定。

Azure CycleCloud 會使用專案來管理叢集應用程式,例如批次排程器。 在 CycleCloud HPCPack 中,專案是一種 hn 規格和 cn 規格,可定義 HPCPack 前端節點和計算節點的設定和配方。

以下是部分節點定義。 docker-registry 節點會執行三個規格:來自 okta 專案 1.3.0 版的系結規格,以及 Docker 專案 2.0.0 版的核心和登錄規格:

[[node docker-registry]]
    Locker = base-storage
    [[[cluster-init okta:bind:1.3.0]]]
    [[[cluster-init docker:core:2.0.0]]]
    [[[cluster-init docker:registry:2.0.0]]]

尾端標籤是專案版本號碼。

[[[cluster-init <project>:<spec>:<project version>]]]

保險箱是儲存體帳戶容器和認證的參考。 節點具有預設保險箱,因此這個屬性並非絕對必要。

Azure CycleCloud 會使用儲存體帳戶的速記,因此 https://mystorage.blob.core.windows.net/mycontainer 可以撰寫為 az://mystorage/mycontainer

節點會使用 pogo 工具,從保險箱下載它所參考的每個專案:

pogo get az://mystorage/mycontainer/projects/okta/1.3.0/bind

如果專案是在節點上定義,但不存在於預期的儲存位置,則節點會向 CycleCloud 回報 Software Installation Failure

CycleCloud 具有預設在所有節點上執行的內部專案,以執行特殊磁片區和網路處理,以及設定與 CycleCloud 的通訊。 這些內部專案會自動鏡像到保險箱。

使用者需負責將任何其他專案鏡像到保險箱。 CycleCloud CLI有撰寫專案的方法:

cyclecloud project init myproject

和 鏡像:

cyclecloud project init mylocker

投影到保險箱。

規格是由 Python、殼層或 PowerShell 腳本所組成。

建立新專案

若要建立新的專案,請使用 CLI 命令 cyclecloud project init myproject ,其中 myproject 是您想要建立的專案名稱。 這會建立名為 「myproject」 的專案,其中包含您可以變更的單一規格 「default」。 系統會使用您將修改的基本架構檔案來建立目錄樹狀結構,以包含您自己的資訊。

目錄結構

專案命令會建立下列目錄:

      \myproject
          ├── project.ini
          ├── blobs
          ├── templates
          ├── specs
          │   ├── default
          │     └── cluster-init
          │        ├── scripts
          │        ├── files
          │        └── tests
          │     └── chef
          │         ├── site-cookbooks
          │         ├── data_bag
          │         └── roles

範本目錄會保存您的叢集範本,而規格將包含定義您專案的規格。 spec 有兩個子目錄:cluster-init 和自訂 chef。 cluster-init 包含具有特殊意義的目錄,例如 腳本 目錄 (包含以語彙順序在節點) 上執行的 腳本、將 放在節點上的檔案 (原始資料檔案放在節點) ,而 測試 (包含在測試模式中啟動時要執行的測試) 。

自訂 chef 子目錄有三個目錄: site-cookbooks (用於操作手冊 定義) 、 data_bags (資料bag 定義) ,以及 ( chef 角色定義檔案的角色) 。

project.ini

project.ini 是包含您專案所有中繼資料的檔案。 它可以包含:

參數 描述
NAME 專案的名稱。 單字必須以虛線分隔,例如 order-66-2018
label 專案的名稱。 完整名稱 (,具有叢集) 空格以供顯示之用。
類型 三個選項:排程器、應用程式、 < 空白 > 。 決定專案的類型,並產生適當的範本。 預設:應用程式
version 格式:x.x.x

儲 物 櫃

專案內容會儲存在 保險箱內。 您可以透過 命令 cyclecloud project upload (locker) 將專案的內容上傳至 CycleCloud 安裝中定義的任何保險箱,其中 (保險箱) 是 CycleCloud 安裝中的雲端儲存保險箱名稱。 此保險箱將會設定為預設目標。 或者,您也可以使用 命令 cyclecloud locker list 來查看可用的保險箱。 您可以使用 來 cyclecloud locker show (locker) 檢視特定保險箱的詳細資料。

如果您新增一個以上的保險箱,您可以使用 來設定預設值 cyclecloud project default_target (locker) ,然後直接執行 cyclecloud project upload 。 您也可以設定全域預設保險箱,讓專案可以使用 命令 cyclecloud project default locker (locker) -global 共用。

注意

預設保險箱會儲存在 cyclecloud 組態檔中, (通常位於 ~/.cycle/config.ini) ,而不是project.ini中。 這是為了允許project.ini進行版本控制。

上傳專案內容會壓縮 chef 目錄,並將 chef 和 cluster init 同步處理至目標保險箱。 這些會儲存在:

  • (保險箱) /projects/ (專案) / (版 /) / (spec_name) /cluster-init
  • (保險箱) /projects/ (專案) / () / (spec_name) /chef 版本

Blob 下載

使用 project download 將project.ini中參考的所有 Blob 下載到本機 Blob 目錄。 命令會使用 參數, [locker] 並嘗試從保險箱將列在project.ini中的 Blob 下載到本機儲存體。 如果找不到檔案,則會傳回錯誤。

專案設定

規格

建立新專案時,會定義單一預設規格。 您可以透過 cyclecloud project add_spec 命令將其他規格新增至專案。

版本控制

根據預設,所有專案都有 1.0.0 。 您可以在開發及部署專案時設定自訂版本,方法是在project.ini檔案中設定 version=x.y.z

例如,如果 「locker_url」 是 「az://my-account/my-container/projects」,則專案的名稱為 「Order66」,版本為 「1.6.9」,而規格為 「default」,您的 URL 會是:

  • az://my-account/my-container/projects/Order66/1.6.9/default/cluster-init
  • az://my-account/my-container/projects/Order66/1.6.9/default/chef

Blob

Blob 有兩種類型: 專案 Blob使用者 Blob

專案 Blob

專案 Blob 是由專案作者提供的二進位檔案,假設它們可以散發 (,也就是您合法允許轉散發) 開放原始碼專案的二進位檔案。 專案 Blob 會進入專案的「blobs」 目錄,而上傳至保險箱時,它們會位於/project/blob。

若要將 Blob 新增至專案,請將檔案 () 新增至 您的project.ini

[[blobs optionalname]]
  Files = projectblob1.tgz, projectblob2.tgz, projectblob3.tgz

多個 Blob 可以以逗號分隔。 您也可以指定專案 Blob 目錄的相對路徑。

使用者 Blob

使用者 Blob 是專案作者無法合法轉散發的二進位檔案,例如 UGE 二進位檔。 這些檔案不會與專案一起封裝,而是必須手動暫存到保險箱。 這些檔案會位於 /blobs/my-project/my-blob.tgz。 使用者 Blob 不需要在project.ini中定義。

若要下載任何 Blob,請使用 jetpack download CLI 或 jetpack_download Chef 資源的 命令。 CycleCloud 會先尋找使用者 Blob。 如果找不到該檔案,則會使用專案層級 Blob。

注意

可以覆寫具有相同名稱的使用者 Blob 的專案 Blob。

在叢集範本內指定專案

專案語法可讓您在節點上指定多個規格。 若要定義專案,請使用下列專案:

[[[cluster-init myspec]]]
  Project = myproject # inferred from name
  Version = x.y.z
  Spec = default  # (alternatively, you can name your own spec to be used here)
  Locker = default  # (optional, will use default locker for node)

注意

在 'spec' 之後指定的名稱可以是任何專案,但可以和 應該用來做為定義一些 > 通用屬性的快捷方式。

您也可以將多個規格套用至指定的節點,如下所示:

[[node scheduler]]
  [[[cluster-init myspec]]]
  Project = myproject
  Version = x.y.z
  Spec = default  # (alternatively, you can name your own spec to be used here)
  Locker = default  # (optional, will use default locker for node)

[[[cluster-init otherspec]]]
Project = otherproject
Version = a.b.c
Spec = otherspec  # (optional)

透過以冒號分隔專案名稱、規格名稱和版本,CycleCloud 可以自動將這些值剖析為適當的 Project/Version/Spec 設定:

[[node scheduler]]
  AdditionalClusterInitSpecs = $ClusterInitSpecs
  [[[cluster-init myproject:myspec:x.y.z]]]
  [[[cluster-init otherproject:otherspec:a.b.c]]]

您也可以在節點之間繼承規格。 例如,您可以在所有節點之間共用通用規格,然後在排程器節點上執行自訂規格:

[[node defaults]]
[[[cluster-init my-project:common:1.0.0]]]
Order = 2 # optional
[[node scheduler]]
[[[cluster-init my-project:scheduler:1.0.0]]]
Order = 1 # optional

[[nodearray execute]]
[[[cluster-init my-project:execute:1.0.0]]]
   Order = 1 # optional

這會將 和 scheduler 規格同時 common 套用至排程器節點,同時只將 和 execute 規格套用 common 至執行 nodearray。

根據預設,規格會依範本中顯示的循序執行,先執行繼承的規格。 Order 是設為預設值 1000 的選擇性整數,可用來定義規格的順序。

如果定義中 [[[cluster-init]]] 只指定一個名稱,則會假設它是規格名稱。 例如:

[[[cluster-init myspec]]]
Project = myproject
Version = 1.0.0

是名稱所隱含的有效規格設定 Spec=myspec

run_list

您可以在project.ini內的專案或規格層級指定 Runlist:

[spec scheduler]
run_list = role[a], recipe[b]

當節點包含規格「排程器」時,定義的run_list會自動附加至任何先前定義的 Runlist。 例如,如果我定義的 [configuration] run_list是 run_list = recipe[test] ,則最終的執行清單會是 run_list = recipe[cyclecloud], recipe[test], role[a], recipe[b], recipe[cluster_init]

您也可以在節點上的規格層級覆寫 Runlist。 這會取代包含在project.ini中的任何run_list。 例如,如果我們將節點定義變更為下列專案:

[cluster-init test-project:scheduler:1.0.0]
run_list = recipe[different-test]

系統會忽略專案中定義的 Runlist,並改用上述專案。 節點上的最終 Runlist 會是 run_list = recipe[cyclecloud], recipe[test], recipe[different-test], recipe[cluster_init]

注意

runlist 是 chef 特有的,否則不適用。

檔案位置

壓縮的 chef 檔案會在節點啟動的啟動階段下載。 它們會下載至 $JETPACK_HOME/system/chef/tarballs ,並解壓縮至 $JETPACK_HOME/system/chef/chef/chef-repo/,並在交集節點時使用。

注意

若要執行自訂操作手冊,您必須在節點的run_list中指定它們。

cluster-init 檔案會下載至 /mnt/cluster-init/ (專案) / (規格) /。 針對 「my-project」 和 「my-spec」,您會看到位於 /mnt/cluster-init/my-project/my-spec中的腳本、檔案和測試。

同步處理專案

CycleCloud 專案可以從鏡像同步處理到叢集本機雲端儲存體。 在範本內的區段上 [cluster-init] 設定 SourceLocker 屬性。 指定的保險箱名稱將會當做專案的來源使用,而內容會在叢集啟動時同步到您的保險箱。 您也可以使用保險箱的名稱作為 cluster-init 名稱的第一個部分。 例如,如果來源保險箱是 「cyclecloud」,則下列兩個定義相同:

[cluster-init my-project:my-spect:1.2.3]
  SourceLocker=cyclecloud

[cluster-init cyclecloud/my-proect:my-spec:1.2.3]

大型檔案儲存體

專案支援大型檔案。 在新建立專案的最上層,您會看到大型檔案的「Blob」目錄, (blob) 。 請注意,放置於此目錄中的 Blob 有特定用途,且會以不同于「檔案」目錄中的專案來運作。

「blobs」 目錄中的專案與規格和版本無關:可以在規格或專案版本之間共用「Blob」中的任何專案。 例如,不常變更之程式的安裝程式可以儲存在 「blob」 內,並在 project.ini內參考。 當您逐一查看專案版本時,該單一檔案會維持不變,而且只會複製到雲端儲存體一次,以節省傳輸和儲存成本。

若要新增 Blob,只要將檔案放入 「blobs」 目錄中,然後編輯 您的project.ini 以參考該檔案:

[blobs]
  Files=big_file1.tgz

當您使用 命令時 project upload ,project.ini中所參考的所有 Blob 都會傳輸到雲端儲存體。

記錄檔

執行 cluster-init 時產生的記錄檔位於 $JETPACK_HOME/logs/cluster-init/ (專案) / (規格)

執行檔案

成功執行 cluster-init 腳本時,會將檔案放在 /mnt/cluster-init/.run/ (專案) / (規格) ,以確保不會在後續交集上再次執行。 如果您想要再次執行腳本,請刪除此目錄中的適當檔案。

腳本目錄

當 CycleCloud 在腳本目錄中執行腳本時,它會將環境變數新增至規格和專案目錄的路徑和名稱:

CYCLECLOUD_PROJECT_NAME
CYCLECLOUD_PROJECT_PATH
CYCLECLOUD_SPEC_NAME
CYCLECLOUD_SPEC_PATH

在 Linux 上,名為 「test-project」 且規格為 「default」 的專案會有路徑,如下所示:

CYCLECLOUD_PROJECT_NAME = test-project
CYCLECLOUD_PROJECT_PATH = /mnt/cluster-init/test-project
CYCLECLOUD_SPEC_NAME = default
CYCLECLOUD_SPEC_PATH = /mnt/cluster-init/test-project/default

僅執行腳本

僅執行 cluster-init 腳本:

jetpack converge --cluster-init

命令的輸出會同時移至 STDOUT 以及 jetpack.log。 每個腳本也會記錄其輸出:

      $JETPACK_HOME/logs/cluster-init/(project)/(spec)/scripts/(script.sh).out

自訂 chef 和 Composable Specs

每個規格都有 chef 目錄。 在交集之前,每個規格都會取消定位並擷取到本機 chef-repo,並以相同名稱取代任何現有的操作手冊、角色和資料包, (s) 。 這會依照規格的定義順序來完成,因此在命名衝突的情況下,最後定義的規格一律會優先。

jetpack 下載

若要在 cluster-init 腳本內下載 Blob,請使用 命令 jetpack download (filename) 從 Blobs 目錄提取 Blob。 從 cluster-init 腳本執行此命令將會為您決定專案和基底 URL。 若要在非 cluster-init 內容中使用它,您必須指定專案 (請參閱 --help 以取得詳細資訊) 。

針對 chef 使用者, jetpack_download 已建立 LWRP:

jetpack_download "big-file1.tgz" do
  project "my-project"
  end

在 chef 中,預設下載位置為 #{node[:jetpack][:downloads]} 。 若要變更檔案目的地,請使用下列專案:

jetpack_download "foo.tgz" do
  project "my-project"
  dest "/tmp/download.tgz"
end

在 chef 中使用時,您必須指定專案。