

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

# 範例 7：執行命令和指令碼
<a name="cookbooks-101-basics-commands"></a>

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

Chef 資源可以處理執行個體上的各式任務，但有時使用 shell 命令或指令碼會更好。例如，您可能已有用以達成特定任務的指令碼，而且繼續使用它們比實作新程式碼更容易。本節示範如何在執行個體上執行命令或指令碼。

**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) 資源執行一或多個命令。它支援 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. 將 `metadata.rb` 檔案新增至具有以下內容的 `script`。

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

1. 初始化及設定 Test Kitchen (如[範例 1：安裝套件](cookbooks-101-basics-packages.md)中所述)，並從 `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` 區塊中執行命令。

  此範例有一個命令 `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` 資源很方便，尤其是當您只需要執行一或兩個命令時，但通常將指令碼存放在檔案中並執行該檔案會更好。[https://docs.chef.io/chef/resources.html#execute](https://docs.chef.io/chef/resources.html#execute) 資源在 Linux 或 Windows 上執行指定的可執行檔，包括指令碼檔案。本主題修改前述範例中的 `script` 技術指南，使用 `execute` 執行簡單的 shell 指令碼。您可以輕鬆將此範例擴展為較複雜的指令碼，或其他類型的可執行檔。

**設定指令碼檔案**

1. 將 `files` 子目錄新增至 `script`，`default` 子目錄新增至 `files`。

1. 建立包含下列內容且名為 `touchfile` 的檔案，將它新增至 `files/default`。本範例中使用常見的 Bash 解譯器程式碼，但如有需要可取代為您 shell 環境中使用的解譯器。

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

   指令碼檔案可以包含任意數目的命令。為了方便起見，此範例指令碼只有單一 `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` 關機執行個體。下一節使用新的技術指南。