本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
範例 3:建立目錄
重要
AWS OpsWorks Stacks 此服務已於 2024 年 5 月 26 日終止,並已針對新客戶和現有客戶停用。我們強烈建議客戶盡快將其工作負載遷移至其他解決方案。如果您對遷移有任何疑問,請透過 AWS re:Post
當您在執行個體上安裝套件時,通常需要建立一些組態檔案並將它們放置在適當的目錄中。不過,這些目錄可能還不存在。您可能還需要建立資料、日誌檔等等的目錄。例如,您首先啟動用於大多數範例的 Ubuntu 系統,/srv目錄沒有子目錄。如果您要安裝應用程式伺服器,您可能希望有資料檔案、日誌等等的 /srv/www/ 目錄,可能還有一些子目錄。下列配方在執行個體上建立 /srv/www/。
directory "/srv/www/" do mode 0755 owner 'root' group 'root' action :create end
您使用 directory 資源path 屬性預設值,因此本範例會建立 /srv/www/ 並指定其 mode、owner 和 group 屬性。
執行配方
-
在
opsworks_cookbooks中建立名為createdir的目錄,導覽至它。 -
初始化及設定 Test Kitchen (如範例 1:安裝套件中所述),並在
recipes中新增createdir目錄。 -
將具有配方程式碼的
default.rb檔案新增至技術指南的recipes子目錄。 -
執行
kitchen converge以執行配方。 -
執行
kitchen login,導覽至/srv並驗證它是否有www子目錄。 -
Run
exit返回到工作站,但保持執行個體執行。
注意
在執行個體中建立主目錄的相對目錄,使用 #{ENV['HOME']} 表示主目錄。例如,下列內容會建立 ~/shared 目錄。
directory "#{ENV['HOME']}/shared" do ... end
假設您想要建立更深的巢狀目錄,例如 /srv/www/shared。您可以修改前述配方,如下所示。
directory "/srv/www/shared" do mode 0755 owner 'root' group 'root' action :create end
執行配方
-
以前述配方取代
default.rb中的程式碼。 -
從
kitchen converge目錄執行createdir。 -
若要確認已確實建立目錄,請執行
kitchen login、導覽至/srv/www,然後驗證它是否包含shared子目錄。 -
執行
kitchen destroy關閉執行個體。
您會發現 kitchen converge 命令執行速度更快了。這是因為執行個體已在執行,所以不需要開機執行個體、安裝 Chef 等等。Test Kitchen 只是將更新的技術指南複製到執行個體,並啟動 Chef 執行。
現在再次執行 kitchen converge,這會在全新的執行個體中執行配方。您現在會看到下列結果。
Chef Client failed. 0 resources updated in 1.908125788 seconds [2014-06-20T20:54:26+00:00] ERROR: directory[/srv/www/shared] (createdir::default line 1) had an error: Chef::Exceptions::EnclosingDirectoryDoesNotExist: Parent directory /srv/www does not exist, cannot create /srv/www/shared [2014-06-20T20:54:26+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1) >>>>>> Converge failed on instance <default-ubuntu-1204>. >>>>>> Please see .kitchen/logs/default-ubuntu-1204.log for more details >>>>>> ------Exception------- >>>>>> Class: Kitchen::ActionFailed >>>>>> Message: SSH exited (1) for command: [sudo -E chef-solo --config /tmp/kitchen/solo.rb --json-attributes /tmp/kitchen/dna.json --log_level info] >>>>>> ----------------------
發生了什麼? 問題是,directory 資源預設一次只能建立一個目錄,無法建立目錄鏈。此配方之前可以運作是因為您在執行個體上執行的最初配方已建立 /srv/www,因此建立 /srv/www/shared 只會建立一個子目錄。
注意
當您執行 kitchen converge 時,請確定您知道您是在新的或現有的執行個體上執行您的配方。您可能會得到不同的結果。
若要建立子目錄鏈,請將 recursive 屬性新增至 directory 並將它設為 true。下列配方會在乾淨的執行個體上建立 /srv/www/shared 目錄。
directory "/srv/www/shared" do mode 0755 owner 'root' group 'root' recursive true action :create end