

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

# 例 6: ファイルの作成
<a name="cookbooks-101-basics-files"></a>

**重要**  
この AWS OpsWorks Stacks サービスは 2024 年 5 月 26 日にサポート終了となり、新規および既存のお客様の両方で無効になっています。できるだけ早くワークロードを他のソリューションに移行することを強くお勧めします。移行についてご質問がある場合は、[AWS re:Post](https://repost.aws/) または[AWS プレミアムサポート](https://aws.amazon.com/support)を通じて AWS サポート チームにお問い合わせください。

ディレクトリを作成したら、多くの場合設定ファイルやデータファイルなどを配置する必要があります。このトピックでは、インスタンスにファイルをインストールする 2 とおりの方法を説明します。

**Topics**
+ [クックブックからのファイルのインストール](#cookbooks-101-basics-files-cookbook_file)
+ [テンプレートからのファイルの作成](#cookbooks-101-basics-files-template)

## クックブックからのファイルのインストール
<a name="cookbooks-101-basics-files-cookbook_file"></a>

インスタンスにファイルをインストールする最も簡単な方法は、[https://docs.chef.io/chef/resources.html#cookbook-file](https://docs.chef.io/chef/resources.html#cookbook-file) リソースを使用してクックブックから、Linux と Windows の両方のインスタンスの指定した場所にファイルをコピーすることです。この例では、「[例 3: ディレクトリの作成](cookbooks-101-basics-directories.md)」のレシピを拡張して、ディレクトリの作成後に `/srv/www/shared` にファイルを追加します。参考までに、元のレシピを以下に示します。

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

**クックブックをセットアップするには**

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

1. `createfile` に、次のコンテンツを含む `metadata.rb` ファイルを追加します。

   ```
   name "createfile"
   version "0.1.0"
   ```

1. 「[例 1: パッケージのインストール](cookbooks-101-basics-packages.md)」の説明に従って Test Kitchen を初期化し設定して、`platforms` リストから CentOS を削除します。

1. `createfile` に `recipes` サブディレクトリを追加します。

インストールするファイルには以下の JSON データが含まれます。

```
{
  "my_name" : "myname",
  "your_name" : "yourname",
  "a_number" : 42,
  "a_boolean" : true
}
```

**データファイルをセットアップするには**

1. `files` サブディレクトリを `createfile` に、`default` サブディレクトリを `files` に追加します。`cookbook_file` と一緒にインストールするファイルは `files` のサブディレクトリに置く必要があります。例えば、`files/default` などです。
**注記**  
異なるシステムに異なるファイルを指定する場合は、システム固有のファイルを `files/ubuntu` のようにシステム用に名前をつけたサブフォルダに置きます。`cookbook_file` リソースは、適切なシステム固有のファイルが存在する場合はそれをコピーし、ない場合は `default` ファイルを使用します。詳細については、「[cookbook\$1file](https://docs.chef.io/chef/resources.html#cookbook-file)」を参照してください。

1. 前の例から JSON で `example_data.json` という名前のファイルを作成し、`files/default` に追加します。

以下のレシピは `example_data.json` を指定した場所にコピーします。

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

cookbook_file "/srv/www/shared/example_data.json" do
  source "example_data.json"
  mode 0644
  action :create_if_missing
end
```

ディレクトリリソースが `/srv/www/shared` を作成した後、`cookbook_file` リソースは `example_data.json` をそのディレクトリにコピーし、またファイルのユーザー、グループ、モードを設定します。

**注記**  
`cookbook_file` リソースでは `create_if_missing` という新しいアクションが導入されています。`create` アクションも使用できますが、これは既存のファイルを上書きします。何も上書きしたくない場合は、`create_if_missing` を使用すると、`example_data.json` が存在しない場合のみこれをインストールします。

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

1. `kitchen destroy` を実行して新しいインスタンスで開始できるようにします。

1. 前述のレシピを含む `default.rb` ファイルを作成し、`recipes` に保存します。

1. `kitchen converge` を実行し、その後インスタンスにログインして`/srv/www/shared` に `example_data.json` があることを確認します。

## テンプレートからのファイルの作成
<a name="cookbooks-101-basics-files-template"></a>

`cookbook_file` リソースはさまざまな目的に役立ちますが、クックブックにあるファイルしかインストールしません。[https://docs.chef.io/chef/resources.html#template](https://docs.chef.io/chef/resources.html#template) リソースを使えば、テンプレートから動的にファイルを作成することで、より柔軟にファイルを Windows または Linux インスタンスにインストールできます。その後で実行時にファイルの内容の詳細を検討し、必要に応じて変更できます。たとえば、インスタンスを開始する際に特定の設定をするために必要な設定ファイルがあり、あとでスタックにインスタンスを追加する際にその設定を変更する必要があるかもしれません。

この例では `createfile` クックブックを変更し、`template` リソースを使用して `example_data.json` をほんの少し変更したバージョンをインストールします。

インストールされたファイルはこのようになります。

```
{
  "my_name" : "myname",
  "your_name" : "yourname",
  "a_number" : 42,
  "a_boolean" : true,
  "a_string" : "some string",
  "platform" : "ubuntu"
}
```

通常、テンプレートリソースは属性ファイルとともに使用します。例では以下の値を定義するために 1 つ使用しています。

```
default['createfile']['my_name'] = 'myname'
default['createfile']['your_name'] = 'yourname'
default['createfile']['install_file'] = true
```

**クックブックをセットアップするには**

1. `createfile` クックブックの `files` ディレクトリおよびそのコンテンツを削除します。

1. `attributes` に `createfile` サブディレクトリを追加し、`default.rb` ファイルを前述の属性定義を含む `attributes` に追加します。

テンプレートは `.erb` ファイルであり、基本的に内容の一部がプレースホルダーで表される最終ファイルのコピーです。`template` リソースがファイルを作成する場合、テンプレートの内容を指定されたファイルにコピーし、プレースホルダーを割り当てられた値で上書きします。`example_data.json` のテンプレートを次に示します。

```
{
  "my_name" : "<%= node['createfile']['my_name'] %>",
  "your_name" : "<%= node['createfile']['your_name'] %>",
  "a_number" : 42,
  "a_boolean" : <%= @a_boolean_var %>,
  "a_string" : "<%= @a_string_var %>",
  "platform" : "<%= node['platform'] %>"
}
```

`<%=...%>` の値はプレースホルダーです。
+ `<%=node[...]%>` はノード属性値を示します。

  この例では、"your\$1name" の値がクックブックの属性ファイルからの属性値の 1 つを表すプレースホルダーです。
+ `<%=@...%>` はすでに説明したようにテンプレートリソースで定義されている変数の値を示します。

**テンプレートファイルを作成するには**

1. `templates` サブディレクトリを `createfile` クックブックに、`default`サブディレクトリを `templates` に追加します。
**注記**  
`templates` ディレクトリは `files` ディレクトリと似たような機能を果たします。システム固有のテンプレートを `ubuntu` などシステム名をつけたサブディレクトリに配置できます。`template` リソースは適切なシステム固有テンプレートがある場合はそれを使用し、ない場合は `default` テンプレートを使用します。

1. `example_data.json.erb` ディレクトリに `templates/default` という名前のファイルを作成します。テンプレート名は任意ですが、通常は、拡張子を含むファイル名に `.erb` を付けて作成します。

以下のレシピでは、`template` リソースを使用して `/srv/www/shared/example_data.json` を作成します。

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

template "/srv/www/shared/example_data.json" do
  source "example_data.json.erb"
  mode 0644
  variables(
    :a_boolean_var => true,
    :a_string_var => "some string"
  )
  only_if {node['createfile']['install_file']}
end
```

`template` リソースはテンプレートから `example_data.json` を作成して `/srv/www/shared` にインストールします。
+ テンプレートの名前 `/srv/www/shared/example_data.json` は、インストールされているファイルのパスと名前を指定します。
+ `source` 属性は、ファイルの作成に使用したテンプレートを指定します。
+ `mode` 属性は、インストールされているファイルのモードを指定します。
+ リソースは、2 つの変数 `a_boolean_var` と `a_string_var` を定義します。

  リソースが `example_data.json` を作成する際、テンプレートのプレースホルダーをリソースの対応する値で上書きします。
+ `only_if` *ガード*属性は `['createfile']['install_file']` が `true` に設定されている時のみファイルを作成するようにリソースに指示します。

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

1. `kitchen destroy` を実行して新しいインスタンスで開始できるようにします。

1. `recipes/default.rb` のコードを前述の例で置き換えます。

1. `kitchen converge` を実行し、その後インスタンスにログインしてファイルが `/srv/www/shared` に存在し内容が正しいことを確認します。

完了したら、`kitchen destroy` を実行してインスタンスをシャットダウンします。以下のセクションでは新しいクックブックを使用します。