

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 範例 3：建立目錄
<a name="cookbooks-101-basics-directories"></a>

**重要**  
 AWS OpsWorks Stacks 此服務已於 2024 年 5 月 26 日終止，並已針對新客戶和現有客戶停用。我們強烈建議客戶盡快將其工作負載遷移至其他解決方案。如果您對遷移有任何疑問，請透過 [AWS re：Post](https://repost.aws/) 或透過 [AWS Premium Support](https://aws.amazon.com/support) 聯絡 AWS 支援 團隊。

當您在執行個體上安裝套件時，通常需要建立一些組態檔案並將它們放置在適當的目錄中。不過，這些目錄可能還不存在。您可能還需要建立資料、日誌檔等等的目錄。例如，您首先啟動用於大多數範例的 Ubuntu 系統，`/srv`目錄沒有子目錄。如果您要安裝應用程式伺服器，您可能希望有資料檔案、日誌等等的 `/srv/www/` 目錄，可能還有一些子目錄。下列配方在執行個體上建立 `/srv/www/`。

```
directory "/srv/www/" do
  mode 0755
  owner 'root'
  group 'root'
  action :create
end
```

您使用 [`directory` 資源](https://docs.chef.io/chef/resources.html#directory)在 Linux 和 Windows 系統上建立並設定目錄，但某些屬性的用法不盡相同。資源名稱是用於將資源的 `path` 屬性預設值，因此本範例會建立 `/srv/www/` 並指定其 `mode`、`owner` 和 `group` 屬性。

**執行配方**

1. 在 `opsworks_cookbooks` 中建立名為 `createdir` 的目錄，導覽至它。

1. 初始化及設定 Test Kitchen (如[範例 1：安裝套件](cookbooks-101-basics-packages.md)中所述)，並在 `recipes` 中新增 `createdir` 目錄。

1.  將具有配方程式碼的 `default.rb` 檔案新增至技術指南的 `recipes` 子目錄。

1. 執行 `kitchen converge` 以執行配方。

1. 執行 `kitchen login`，導覽至 `/srv` 並驗證它是否有 `www` 子目錄。

1. 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
```

**執行配方**

1.  以前述配方取代 `default.rb` 中的程式碼。

1. 從 `kitchen converge` 目錄執行 `createdir`。

1. 若要確認已確實建立目錄，請執行 `kitchen login`、導覽至 `/srv/www`，然後驗證它是否包含 `shared` 子目錄。

1. 執行 `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
```