本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
範例 7:執行命令和指令碼
重要
所以此 AWS OpsWorks Stacks 服務於 2024 年 5 月 26 日終止使用壽命,並已針對新客戶和現有客戶停用。我們強烈建議客戶盡快將其工作負載移轉至其他解決方案。如果您對移轉有任何疑問,請聯絡 AWS Support 團隊上 AWS Re: 郵寄
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
資源很方便,尤其是當您只需要執行一或兩個命令時,但通常將指令碼存放在檔案中並執行該檔案會更好。execute
script
技術指南,使用 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
關機執行個體。下一節使用新的技術指南。