

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 3: Criação de diretórios
<a name="cookbooks-101-basics-directories"></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).

Ao instalar um pacote em uma instância, você normalmente precisa criar alguns arquivos de configuração e colocá-los nos diretórios indicados. No entanto, esses diretórios talvez ainda não existam. Você talvez também precise criar diretórios para arquivos de dados, log etc. Por exemplo, você inicializa primeiramente o sistema Ubuntu usado para a maioria dos exemplos, o diretório `/srv` não tem subdiretórios. Se estiver instalando um servidor de aplicativos, você provavelmente desejará um diretório `/srv/www/` e talvez alguns subdiretórios para arquivos de dados, logs etc. A receita a seguir cria `/srv/www/` em uma instância.

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

Você usa um [`directory` resource](https://docs.chef.io/chef/resources.html#directory) para criar e configurar diretórios nos sistemas Linux e Windows, embora alguns atributos sejam usados de maneira diferente. Como o nome do recurso é o valor padrão do atributo `path` do recurso, o exemplo cria `/srv/www/` e especifica as propriedades `mode`, `owner` e `group`.

**Para executar a receita**

1. Crie um diretório dentro de `opsworks_cookbooks` chamado `createdir` e navegue até ele.

1. Inicialize e configure o Test Kitchen, conforme descrito em [Exemplo 1: Instalação de pacotes](cookbooks-101-basics-packages.md) e adicione um diretório `recipes` dentro de `createdir`.

1.  Adicione um arquivo `default.rb` com o código da receita ao subdiretório `recipes` do livro de receitas. 

1. Execute `kitchen converge` para executar a receita.

1. Execute `kitchen login`, navegue até `/srv` e verifique se ele tem um subdiretório `www`.

1. Execute `exit` para retornar à estação de trabalho, mas deixe a instância em execução.

**nota**  
Para criar um diretório relativo ao diretório inicial na instância, use `#{ENV['HOME']}` para representar o diretório inicial. Por exemplo, a opção a seguir cria o diretório `~/shared`.  

```
directory "#{ENV['HOME']}/shared" do
  ...
end
```

Suponhamos que você queira criar um diretório mais aninhado, como `/srv/www/shared`. Você pode modificar a receita anterior da maneira a seguir.

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

**Para executar a receita**

1.  Substitua o código em `default.rb` pela receita anterior. 

1. Execute `kitchen converge` no diretório `createdir`.

1. Para verificar se o diretório foi mesmo criado, execute `kitchen login`, navegue até `/srv/www` e verifique se ele contém um subdiretório `shared`. 

1. Execute `kitchen destroy` para desligar a instância.

Você perceberá que o comando `kitchen converge` foi executado muito mais rapidamente. Isso porque a instância já está em execução, logo, não há necessidade de inicializar a instância, instalar o Chef e assim por diante. Teste o Kitchen apenas a fim de copiar o livro de receitas atualizado para a instância e iniciar uma execução do Chef.

Agora reexecute `kitchen converge`, que executa a receita em uma nova instância. Você já verá o resultado a seguir.

```
Chef Client failed. 0 resources updated in 1.908125788 seconds       
[2014-06-20T20:54:26+00:00] ERROR: directory[/srv/www/shared] (createdir::default line 1) had an error: Chef::Exceptions::EnclosingDirectoryDoesNotExist: Parent directory /srv/www does not exist, cannot create /srv/www/shared       
[2014-06-20T20:54:26+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)       
>>>>>> Converge failed on instance <default-ubuntu-1204>.
>>>>>> Please see .kitchen/logs/default-ubuntu-1204.log for more details
>>>>>> ------Exception-------
>>>>>> Class: Kitchen::ActionFailed
>>>>>> Message: SSH exited (1) for command: [sudo -E chef-solo --config /tmp/kitchen/solo.rb --json-attributes /tmp/kitchen/dna.json  --log_level info]
>>>>>> ----------------------
```

O que aconteceu? O problema é que, por padrão, um recurso `directory` só pode criar um diretório por vez; ele não pode criar uma cadeia de diretórios. O motivo pelo qual a receita funcionou antes é que a primeira receita que você executou na instância já tinha criado `/srv/www`, logo, a criação de `/srv/www/shared` gerou apenas um subdiretório.

**nota**  
Quando você executar `kitchen converge`, certifique-se de que saiba se está executando as receitas em uma instância nova ou existente. Você pode obter resultados diferentes.

Para criar uma cadeia de subdiretórios, adicione um atributo `recursive` a `directory` e o defina como `true`. A receita a seguir cria `/srv/www/shared` diretamente em uma instância limpa.

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