

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 例 3: ディレクトリの作成
<a name="cookbooks-101-basics-directories"></a>

**重要**  
この AWS OpsWorks Stacks サービスは 2024 年 5 月 26 日にサポート終了となり、新規および既存のお客様の両方で無効になっています。できるだけ早くワークロードを他のソリューションに移行することを強くお勧めします。移行についてご質問がある場合は、[AWS re:Post](https://repost.aws/) または[AWS プレミアムサポート](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` resource](https://docs.chef.io/chef/resources.html#directory) を使用して、Linux と Windows の両方のシステムでディレクトリを作成して設定しますが、一部の属性の使用方法はシステムによって異なります。リソース名はリソースの `path` 属性のデフォルト値であるため、例では `/srv/www/` を作成し、`mode`、`owner`、および `group` プロパティを指定します。

**レシピを実行するには**

1. `opsworks_cookbooks`内に `createdir` という名前のディレクトリを作成し、そのディレクトリに移動します。

1. 「[例 1: パッケージのインストール](cookbooks-101-basics-packages.md)」の説明に従って Test Kitchen を初期化、設定し、`recipes` 内に `createdir` ディレクトリを追加します。

1.  レシピコードの `default.rb` ファイルをクックブックの `recipes` サブディレクトリに追加します。

1. `kitchen converge` を実行してレシピを実行します。

1. `kitchen login` を実行して`/srv` に移動し、`www` サブディレクトリがあることを確認します。

1. `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` リソースは一度に 1 個のディレクトリしか作成できないことです。ディレクトリのチェーンは作成できません。前のレシピがうまくいった理由は、インスタンスで最初に実行したレシピですでに `/srv/www` が作成されていたため、`/srv/www/shared` の作成ではサブディレクトリが 1 個つだけ作成されためです。

**注記**  
`kitchen converge` を実行する場合は、レシピを実行するインスタンスが新規なのか既存のものなのかを確認してください。結果が異なる場合があります。

サブディレクトリのチェーンを作成するには、`recursive` 属性を `directory` に追加して、それを `true` に設定します。以下のレシピは、新しいインスタンスに `/srv/www/shared` を直接作成します。

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