

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 6: Criação de arquivos
<a name="cookbooks-101-basics-files"></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).

Depois de ter criado diretórios, você normalmente precisa preenchê-los com arquivos de configuração, arquivos de dados etc. Este tópico mostra duas maneiras de instalar arquivos em uma instância.

**Topics**
+ [Instalação de um arquivo usando um livro de receitas](#cookbooks-101-basics-files-cookbook_file)
+ [Criação de um arquivo usando um modelo](#cookbooks-101-basics-files-template)

## Instalação de um arquivo usando um livro de receitas
<a name="cookbooks-101-basics-files-cookbook_file"></a>

A maneira mais simples de instalar um arquivo em uma instância é usando um recurso [https://docs.chef.io/chef/resources.html#cookbook-file](https://docs.chef.io/chef/resources.html#cookbook-file), que copia um arquivo do livro de receitas para um local especificado na instância para os sistemas Linux e Windows. Este exemplo estende a receita do [Exemplo 3: Criação de diretórios](cookbooks-101-basics-directories.md) para adicionar um arquivo de dados a `/srv/www/shared` após a criação do diretório. Para referência, aqui está a receita original.

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

**Para configurar o livro de receitas**

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

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

   ```
   name "createfile"
   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. Adicione um subdiretório `recipes` a `createfile`.

O arquivo a ser instalado contém os dados JSON a seguir.

```
{
  "my_name" : "myname",
  "your_name" : "yourname",
  "a_number" : 42,
  "a_boolean" : true
}
```

**Para configurar o arquivo de dados**

1. Adicione um subdiretório `files` e `createfile` e um subdiretório `default` a `files`. Qualquer arquivo instalado por você com `cookbook_file` deve estar em um subdiretório de `files`, como `files/default` neste exemplo. 
**nota**  
Caso queira especificar arquivos diferentes para sistemas distintos, você pode colocar o arquivo específico de cada sistema em uma subpasta chamada considerando o sistema, como `files/ubuntu`. O recurso `cookbook_file` copia o arquivo específico do sistema apropriado, caso ele exista, e usa o arquivo `default`. Para obter mais informações, consulte [cookbook\$1file](https://docs.chef.io/chef/resources.html#cookbook-file).

1. Crie um arquivo chamado `example_data.json` com o JSON do exemplo anterior e adicione-o a `files/default`.

A receita a seguir copia `example_data.json` para um local especificado. 

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

cookbook_file "/srv/www/shared/example_data.json" do
  source "example_data.json"
  mode 0644
  action :create_if_missing
end
```

Depois que cria `/srv/www/shared`, o recurso `cookbook_file` copia `example_data.json` para esse diretório e também define o usuário, o grupo e o modo do arquivo. 

**nota**  
O recurso `cookbook_file` apresenta uma nova ação: `create_if_missing`. Você também pode usar uma ação `create`, mas ela substitui um arquivo existente. Caso você não queira substituir nada, use `create_if_missing`, que só instala `example_data.json` caso ainda não exista.

**Para executar a receita**

1. Execute `kitchen destroy` para começar com uma instância nova.

1. Crie um arquivo `default.rb` que contenha a receita anterior e o salve em `recipes`.

1. Execute `kitchen converge` e faça logon na instância para verificar se o arquivo `/srv/www/shared` contém `example_data.json`.

## Criação de um arquivo usando um modelo
<a name="cookbooks-101-basics-files-template"></a>

O recurso `cookbook_file` é útil para algumas finalidades, mas só instala o arquivo que você tem no livro de receitas. Um recurso [https://docs.chef.io/chef/resources.html#template](https://docs.chef.io/chef/resources.html#template) oferece uma maneira mais flexível de instalar um arquivo em uma instância do Windows ou do Linux o criando dinamicamente com base em um modelo. Você pode acabar determinando os detalhes do conteúdo do arquivo no runtime e alterá-los conforme necessário. Por exemplo, você talvez queira que um arquivo de configuração tenha uma determinada configuração ao iniciar a instância e modificar a configuração depois, quando adicionar mais instâncias à pilha.

Este exemplo modifica o livro de receitas `createfile` a fim de usar um recurso `template` para instalar uma versão levemente modificada de `example_data.json`.

Aqui está como será a aparência do arquivo instalado.

```
{
  "my_name" : "myname",
  "your_name" : "yourname",
  "a_number" : 42,
  "a_boolean" : true,
  "a_string" : "some string",
  "platform" : "ubuntu"
}
```

Os recursos de modelo costumam ser usados com arquivos de atributo. Assim, o exemplo usa um para definir os valores a seguir.

```
default['createfile']['my_name'] = 'myname'
default['createfile']['your_name'] = 'yourname'
default['createfile']['install_file'] = true
```

**Para configurar o livro de receitas**

1. Exclua o diretório `createfile` e seu conteúdo do livro de receitas `files`.

1. Adicione um subdiretório `attributes` a `createfile` e um arquivo `default.rb` a `attributes` que contenha as definições de atributo anteriores.

Modelo é um arquivo `.erb` que é basicamente uma cópia do arquivo final, com alguns dos conteúdos representados por espaços reservados. Quando cria o arquivo, o recurso `template` copia o conteúdo do modelo para o arquivo especificado e substitui os espaços reservados pelos valores atribuídos. Veja o modelo de `example_data.json`.

```
{
  "my_name" : "<%= node['createfile']['my_name'] %>",
  "your_name" : "<%= node['createfile']['your_name'] %>",
  "a_number" : 42,
  "a_boolean" : <%= @a_boolean_var %>,
  "a_string" : "<%= @a_string_var %>",
  "platform" : "<%= node['platform'] %>"
}
```

Os valores `<%=...%>` são os espaços reservados.
+ `<%=node[...]%>` representa um valor de atributo do nó.

  Para este exemplo, o valor "your\$1name" é um espaço reservado que representa um dos valores de atributo do arquivo de atributo do livro de receitas.
+ `<%=@...%>` representa o valor de uma variável definido no recurso do modelo, conforme abordado resumidamente.

**Como criar o arquivo de modelo do**

1. Adicione um subdiretório `templates` ao livro de receitas `createfile` e um subdiretório `default` a `templates`.
**nota**  
O diretório `templates` funciona de maneira muito semelhante ao diretório `files`. Você pode colocar modelos específicos do sistema em um subdiretório, como `ubuntu`, nomeado por causa do sistema. O recurso `template` usa o modelo específico do sistema apropriado caso ele exista e acaba usando o modelo `default`.

1. Crie um arquivo chamado `example_data.json.erb` e coloque-o no diretório `templates/default`. O nome do modelo é arbitrário, mas você normalmente o cria acrescentando `.erb` ao nome do arquivo, inclusive extensões. 

A receita a seguir usa um recurso `template` para criar `/srv/www/shared/example_data.json`. 

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

template "/srv/www/shared/example_data.json" do
  source "example_data.json.erb"
  mode 0644
  variables(
    :a_boolean_var => true,
    :a_string_var => "some string"
  )
  only_if {node['createfile']['install_file']}
end
```

O recurso `template` cria `example_data.json` usando um modelo e o instala em `/srv/www/shared`.
+ O nome do modelo, `/srv/www/shared/example_data.json`, especifica o caminho e o nome do arquivo instalado.
+ O atributo `source` especifica o modelo usado para criar o arquivo.
+ O atributo `mode` especifica o modo do arquivo instalado.
+ O recurso define duas variáveis, `a_boolean_var` e `a_string_var`. 

  Quando cria `example_data.json`, o recurso substitui os espaços reservados da variável no modelo pelos valores correspondentes do recurso. 
+ O atributo `only_if` *guard* só leva o recurso a criar o arquivo caso `['createfile']['install_file']` esteja definido como `true`.

**Para executar a receita**

1. Execute `kitchen destroy` para começar com uma instância nova.

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 o arquivo está em `/srv/www/shared` e tem o conteúdo correto.

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