

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 예제 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 Support 팀에 문의하세요.

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) 리소스는 하나 이상의 명령을 실행합니다. 이 리소스는 csh, bash, Perl, Python 및 Ruby 명령 인터프리터를 지원하므로 적절한 인터프리터가 설치되어 있다면 Linux 또는 Windows 시스템에서 사용할 수 있습니다. 이 주제에서는 Linux 인스턴스에서 간단한 bash 명령을 실행하는 방법을 살펴봅니다. Chef는 Windows에서 스크립트를 실행하기 위해 [powershell\$1script](https://docs.chef.io/chef/resources.html#powershell-script) 및 [batch](https://docs.chef.io/chef/resources.html#batch) 리소스도 지원합니다. 자세한 내용은 [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` 리소스는 다음과 같이 구성됩니다.
+ bash 리소스는 `code` 블록에서 명령을 실행하는 기본 작업인 `run`을 사용합니다.

  이 예제에는 `touch somefile`이라는 명령 하나만 있지만 `code` 블록에는 여러 명령이 포함될 수 있습니다.
+ `user` 속성은 명령을 실행하는 사용자를 지정합니다.
+ `cwd` 속성은 작업 디렉터리를 지정합니다.

  이 예제에서는 `touch`가 `/tmp` 디렉터리에 파일을 생성합니다.
+ `not_if` guard 속성은 이 파일이 이미 존재하는 경우, 리소스에게 아무 작업도 하지 말라고 명령합니다.

**레시피를 실행하려면**

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` 쿡북을 수정합니다. 더 복잡한 스크립트나 다른 실행 파일 유형까지 예제를 쉽게 확장할 수 있습니다.

**스크립트 파일을 설정하려면**

1. `files` 하위 디렉터리는 `script`에, `default` 하위 디렉터리는 `files`에 추가합니다.

1. 다음 코드가 포함된 `touchfile`이라는 파일을 만들어 `files/default`에 추가합니다. 이 예제에서는 일반적인 Bash 인터프리터 라인이 사용되지만 필요한 경우 사용자의 셸 환경에서 작동하는 인터프리터를 대체합니다.

   ```
   #!/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`를 실행해 인스턴스를 종료하세요. 다음 섹션에서는 새 쿡북을 사용합니다.