本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
範例 7:執行命令和指令碼
重要
AWS OpsWorks Stacks 此服務已於 2024 年 5 月 26 日終止,並已針對新客戶和現有客戶停用。我們強烈建議客戶盡快將其工作負載遷移至其他解決方案。如果您對遷移有任何疑問,請透過 AWS re:Post
Chef 資源可以處理執行個體上的各式任務,但有時使用 shell 命令或指令碼會更好。例如,您可能已有用以達成特定任務的指令碼,而且繼續使用它們比實作新程式碼更容易。本節示範如何在執行個體上執行命令或指令碼。
執行命令
script
開始使用
-
在
opsworks_cookbooks目錄中建立名為script的目錄,導覽至它。 -
將
metadata.rb檔案新增至具有以下內容的script。name "script" version "0.1.0" -
初始化及設定 Test Kitchen (如範例 1:安裝套件中所述),並從
platforms清單中移除 CentOS。 -
在
script中建立名為recipes的目錄。
您可以使用 script 資源本身執行命令,但 Chef 也支援資源的一組命令解譯器特定版本,以解譯器為名。下列配方使用 bash
bash "install_something" do user "root" cwd "/tmp" code <<-EOH touch somefile EOH not_if do File.exists?("/tmp/somefile") end end
bash 資源設定如下。
-
它使用預設動作
run,在code區塊中執行命令。此範例有一個命令
touch somefile,但code區塊可以包含多個命令。 -
user屬性指定執行命令的使用者。 -
cwd屬性指定工作目錄。在此範例中,
touch會在/tmp目錄中建立檔案。 -
如果檔案已存在,
not_if保護屬性指示資源不採取任何動作。
執行配方
-
建立包含前述範例程式碼的
default.rb檔案,並將它儲存至recipes。 -
執行
kitchen converge,然後登入執行個體,驗證檔案是否位於/tmp。
執行指令碼
script 資源很方便,尤其是當您只需要執行一或兩個命令時,但通常將指令碼存放在檔案中並執行該檔案會更好。executescript 技術指南,使用 execute 執行簡單的 shell 指令碼。您可以輕鬆將此範例擴展為較複雜的指令碼,或其他類型的可執行檔。
設定指令碼檔案
-
將
files子目錄新增至script,default子目錄新增至files。 -
建立包含下列內容且名為
touchfile的檔案,將它新增至files/default。本範例中使用常見的 Bash 解譯器程式碼,但如有需要可取代為您 shell 環境中使用的解譯器。#!/usr/bin/env bash touch somefile指令碼檔案可以包含任意數目的命令。為了方便起見,此範例指令碼只有單一
touch命令。
下列配方執行指令碼。
cookbook_file "/tmp/touchfile" do source "touchfile" mode 0755 end execute "touchfile" do user "root" cwd "/tmp" command "./touchfile" end
cookbook_file 資源將指令碼檔案複製到 /tmp,並設定模式讓檔案變成可執行檔。然後 execute 資源執行此檔案,如下所示:
-
user屬性指定命令的使用者 (本範例中為root)。 -
cwd屬性指定工作目錄 (本範例中為/tmp)。 -
此
command屬性指定要執行的指令碼 (本範例中為touchfile),位於工作目錄。
執行配方
-
以前述範例取代
recipes/default.rb中的程式碼。 -
執行
kitchen converge,然後登入執行個體以驗證/tmp現在包含模式設定為 0755 的指令碼檔案以及somefile。
完成後,請執行 kitchen destroy 關機執行個體。下一節使用新的技術指南。