

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Exemplo 7: Execução de comandos e scripts
<a name="cookbooks-101-basics-commands"></a>

**Importante**  
O AWS OpsWorks Stacks serviço chegou ao fim da vida útil em 26 de maio de 2024 e foi desativado para clientes novos e existentes. É altamente recomendável que os clientes migrem suas cargas de trabalho para outras soluções o mais rápido possível. Se você tiver dúvidas sobre migração, entre em contato com a AWS Support equipe no [AWS re:POST](https://repost.aws/) ou por meio do Premium [AWS Support](https://aws.amazon.com/support).

Os recursos do Chef podem processar uma grande variedade de tarefas em uma instância, mas, às vezes, é preferível usar um comando do shell ou um script. Por exemplo, você talvez já tenha scripts que usa para realizar determinadas tarefas, e será mais fácil continuar usando eles do que implementar um código novo. Esta seção mostra como executar comandos ou scripts em uma instância. 

**Topics**
+ [Execução de comandos](#cookbooks-101-basics-commands-script)
+ [Execução de scripts](#cookbooks-101-basics-commands-execute)

## Execução de comandos
<a name="cookbooks-101-basics-commands-script"></a>

O recurso [https://docs.chef.io/chef/resources.html#script](https://docs.chef.io/chef/resources.html#script) executa um ou mais comandos. Como dá suporte a interpretadores de comando csh, bash, Perl, Python e Ruby, ele pode ser usado nos sistemas Linux ou Windows, desde que estes tenham os interpretadores apropriados instalados. Este tópico mostra como executar um comando bash simples em uma instância do Linux. O Chef também dá suporte aos recursos [powershell\$1script](https://docs.chef.io/chef/resources.html#powershell-script) e [batch](https://docs.chef.io/chef/resources.html#batch) para executar scripts no Windows. Para obter mais informações, consulte [Executando um PowerShell script do Windows](cookbooks-101-opsworks-opsworks-powershell.md). 

**Para começar**

1. No diretório `opsworks_cookbooks`, crie um diretório chamado `script` e navegue até ele.

1. Adicione um arquivo `metadata.rb` a `script`, com o seguinte conteúdo.

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

1. Inicialize e configure o Test Kitchen, conforme descrito em [Exemplo 1: Instalação de pacotes](cookbooks-101-basics-packages.md) e remova CentOS da lista `platforms`.

1. Em `script`, crie um diretório chamado `recipes`.

Você pode executar comandos usando o recurso `script` propriamente dito, mas o Chef também dá suporte a um conjunto de versões específicas do interpretador de comandos do recurso, nomeadas segundo o interpretador. A receita a seguir usa um recurso [https://docs.chef.io/chef/resources.html#bash](https://docs.chef.io/chef/resources.html#bash) para executar um script bash simples.

```
bash "install_something" do
  user "root"
  cwd "/tmp"
  code <<-EOH
    touch somefile
  EOH
  not_if do
    File.exists?("/tmp/somefile")
  end
end
```

O recurso `bash` é configurado da maneira a seguir.
+ Ele usa a ação padrão, `run`, que executa os comandos no bloco `code`.

  Este exemplo tem um comando `touch somefile`, mas um `code` bloco pode conter vários comandos.
+ O atributo `user` especifica o usuário que executa o comando.
+ O atributo `cwd` especifica o diretório de trabalho.

  Para este exemplo, `touch` cria um arquivo no diretório `/tmp`.
+ O atributo de proteção `not_if` leva o recurso a não tomar ação alguma caso o arquivo já exista.

**Para executar a receita**

1. Crie um arquivo `default.rb` que contenha o código de exemplo anterior e o salve em `recipes`.

1. Execute `kitchen converge` e faça logon na instância para verificar se o arquivo está em `/tmp`.

## Execução de scripts
<a name="cookbooks-101-basics-commands-execute"></a>

O recurso `script` é prático, especialmente caso você precise executar apenas um ou dois comandos, mas normalmente é preferível armazenar o script em um arquivo e executar o arquivo. O recurso [https://docs.chef.io/chef/resources.html#execute](https://docs.chef.io/chef/resources.html#execute) executa um arquivo executável especificado, inclusive arquivos de script, no Linux ou no Windows. Este tópico modifica o livro de receitas `script` do exemplo anterior a fim de usar `execute` para executar um script de shell simples. Você pode estender facilmente o exemplo para scripts mais complexos ou outros tipos de arquivo executável.

**Para configurar o arquivo de script**

1. Adicione um subdiretório `files` e `script` e um subdiretório `default` a `files`.

1. Crie um arquivo chamado `touchfile` que contenha o seguinte e adicione-o a `files/default`. Uma linha do interpretador do Bash comum é usada nesse exemplo, mas substitua um interpretador que funcione para o ambiente do shell, caso necessário.

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

   O arquivo de script pode conter qualquer número de comandos. Por uma questão de comodidade, esse script de exemplo tem apenas um único comando `touch`.

A receita a seguir executa o script. 

```
cookbook_file "/tmp/touchfile" do
  source "touchfile"
  mode 0755
end

execute "touchfile" do
  user "root"
  cwd "/tmp"
  command "./touchfile"
end
```

O recurso `cookbook_file` copia o arquivo de script para `/tmp` e define o modo para tornar o arquivo executável. O recurso `execute` acaba executando o arquivo da seguinte forma:
+ O atributo `user` especifica o usuário do comando (`root` neste exemplo).
+ O atributo `cwd` especifica o diretório de trabalho (`/tmp` neste exemplo).
+ O atributo `command` especifica o script a ser executado (`touchfile`, neste exemplo), localizado no diretório de trabalho.

**Para executar a receita**

1. Substitua o código em `recipes/default.rb` pelo exemplo anterior.

1. Execute `kitchen converge` e faça logon na instância para verificar se `/tmp` já contém o arquivo de script, com o modo definido como 0755 e `somefile`.

Quando terminar, execute `kitchen destroy` para desligar a instância. A próxima seção usa um livro de receitas novo.