

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

# 例 7: コマンドとスクリプトの実行
<a name="cookbooks-101-basics-commands"></a>

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

Chef リソースはインスタンスのさまざまタスクを処理できますが、シェルコマンドまたはスクリプトを使用した方がいい場合もあります。たとえば、特定のタスクを実行するスクリプトをすでに使用していて、新しいコードを実装するよりもそれを使い続ける方が簡単な場合もあります。このセクションでは、インスタンスでコマンドまたはスクリプトを実行する方法を説明します。

**Topics**
+ [コマンドの実行](#cookbooks-101-basics-commands-script)
+ [スクリプトの実行](#cookbooks-101-basics-commands-execute)

## コマンドの実行
<a name="cookbooks-101-basics-commands-script"></a>

[https://docs.chef.io/chef/resources.html#script](https://docs.chef.io/chef/resources.html#script) リソースは、1 つ以上のコマンドを実行します。また、csh、bash、Perl、Python、Ruby のコマンドインタープリターがサポートされているため、適切なインタープリターがインストールされていれば、Linux または Windows のいずれかのシステムで使用できます。このトピックでは、Linux インスタンスで単純な Bash コマンドを実行する方法について説明します。Chef では、[powershell\$1script](https://docs.chef.io/chef/resources.html#powershell-script) と [batch](https://docs.chef.io/chef/resources.html#batch) もサポートされており、Windows でのスクリプトの実行に使用できます。詳細については、「[Windows PowerShell スクリプトを実行する](cookbooks-101-opsworks-opsworks-powershell.md)」を参照してください。

**開始するには、以下の手順を実行します。**

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

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

   ```
   name "script"
   version "0.1.0"
   ```

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

1. `script` 内に、`recipes`という名前のディレクトリを作成します。

`script` リソース自体を使用してコマンドを実行することもできますが、Chef はまた、インタープリタ名をつけた一連のリソースのコマンドインタープリタ固有バージョンをサポートします。以下のレシピは [https://docs.chef.io/chef/resources.html#bash](https://docs.chef.io/chef/resources.html#bash) リソースを使用して、シンプルな 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` ブロックでコマンドを実行します。

  この例では 1 個のコマンド `touch somefile` がありますが、`code`ブロックには複数のコマンドを含めることができます。
+ `user` 属性は、コマンドを実行するユーザーを指定します。
+ `cwd` 属性は、作業ディレクトリを指定します。

  この例では、`touch`は `/tmp` ディレクトリにファイルを作成します。
+ `not_if` ガード属性はファイルがすでに存在する場合はリソースにアクションを取らないよう指示します。

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

1. 前述の例のコードを含む `default.rb` ファイルを作成し、`recipes` に保存します。

1. `kitchen converge` を実行し、その後インスタンスにログインして `/tmp` にファイルがあることを確認します。

## スクリプトの実行
<a name="cookbooks-101-basics-commands-execute"></a>

`script` リソースは、特に 1 つか 2 つのコマンドのみを実行する必要がある場合に便利ですが、ファイルにスクリプトを保存してそのファイルを実行する方がいい場合も多くあります。[https://docs.chef.io/chef/resources.html#execute](https://docs.chef.io/chef/resources.html#execute) リソースによって、スクリプトファイルなど指定した実行可能ファイルが Linux または Windows で実行されます。このトピックでは、前述の例から `script` クックブックを変更し、`execute` を使用して単純なシェルスクリプトを実行します。簡単に例をより複雑なスクリプトや別のタイプの実行ファイルに拡張できます。

**スクリプトファイルを設定するには**

1. `files` サブディレクトリを `script` に、`default` サブディレクトリを `files` に追加します。

1. 以下を含む `touchfile` という名前のファイルを作成し、そのファイルを `files/default` へ追加します。この例では、一般的な Bash インタプリタラインが使用されています。必要に応じてシェル環境に対応するインタプリタを代入してください。

   ```
   #!/usr/bin/env bash
   touch somefile
   ```

   スクリプトファイルには、任意の数のコマンドを含めることができます。わかりやすいように、このスクリプトの例には 1 つの `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`) を指定します。

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

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

1. `kitchen converge` を実行し、その後インスタンスにログインして、`/tmp` にスクリプトファイルが含まれており、モードが 0755 に設定されていて、かつ `somefile` があることを確認します。

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