

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á.

# Implementação de receitas em pilhas do Chef 11.10
<a name="workingcookbook-chef11-10"></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).

As pilhas do Chef 11.10 apresentam as seguintes vantagens em relação às stacks do Chef 11.4:
+ As execuções do Chef usam o Ruby 2.0.0 e, portanto, suas receitam podem usar a nova sintaxe do Ruby.
+ As receitas podem usar a pesquisa e os recipientes de dados do Chef.

  As pilhas do Chef 11.10 podem usar muitos livros de receitas da comunidade sem alterá-los.
+ Você pode usar o Berkshelf para gerenciar os livros de receitas.

  O Berkshelf oferece uma maneira muito mais flexível de gerenciar os seus livros de receitas personalizados e usar os livros de receitas da comunidade em uma pilha.
+ Os livros de receitas devem ter suas dependências declaradas no `metadata.rb`.

  Se o seu livro de receitas depende de outro livro de receitas, você deve incluir essa dependência no arquivo `metadata.rb` do livro de receitas. Por exemplo, se o seu livro de receitas inclui uma receita com a instrução `include_recipe anothercookbook::somerecipe`, o arquivo `metadata.rb` do livro de receitas deve incluir a seguinte linha: `depends "anothercookbook"`.
+ OpsWorks O Stacks instala um cliente MySQL nas instâncias de uma pilha somente se a pilha incluir uma camada MySQL.
+ OpsWorks O Stacks instala um cliente Ganglia nas instâncias de uma pilha somente se a pilha incluir uma camada Ganglia.
+ Se uma implantação executar a `bundle install` e a instalação falhar, a implantação também falha.

**Importante**  
Não reutilize nomes de livros de receitas integrados para livros de receitas personalizados ou da comunidade. Livros de receitas personalizados com o mesmo nome de livros de receitas integrados podem falhar. [Para obter uma lista completa dos livros de receitas integrados que estão disponíveis com as pilhas Chef 11.10, 11.4 e 0.9, consulte o repositório opsworks-cookbooks em. GitHub](https://github.com/aws/opsworks-cookbooks)  
Livros de receitas com caracteres não ASCII que são executados com êxito nas pilhas do Chef 0.9 e 11.4 podem falhar quando executados em uma pilha do Chef 11.10. Isso ocorre porque as pilhas do Chef 11.10 usam o Ruby 2.0.0 para execuções do Chef, que é muito mais rigoroso em relação à codificação do que o Ruby 1.8.7. Para garantir que os livros de receitas executem com êxito nas pilhas do Chef 11.10, todo arquivo que utiliza caracteres não ASCII deve ter um comentário na parte superior informando sobre a codificação. Por exemplo, para a codificação UTF-8, o comentário seria `# encoding: UTF-8`. Para obter mais informações sobre a codificação no Ruby 2.0.0, consulte [Codificação](http://www.ruby-doc.org/core-2.0.0/Encoding.html).

**Topics**
+ [Instalação e precedência em livros de receitas](#workingcookbook-chef11-10-override)
+ [Utilização da pesquisa do Chef](#workingcookbook-chef11-10-search)
+ [Utilização de recipientes de dados](#workingcookbook-chef11-10-databag)
+ [Utilização do Berkshelf](#workingcookbook-chef11-10-berkshelf)

## Instalação e precedência em livros de receitas
<a name="workingcookbook-chef11-10-override"></a>

O procedimento para instalar os livros de receitas do OpsWorks Stacks funciona de forma um pouco diferente para as pilhas do Chef 11.10 do que para as versões anteriores do Chef. Para pilhas do Chef 11.10, depois que o OpsWorks Stacks instala os livros de receitas integrados, personalizados e Berkshelf, ele os mescla em um diretório comum na seguinte ordem:

1. Livros de receitas integrados.

1. Livros de receitas do Berkshelf, se houver.

1. Livros de receitas personalizados, se houver. 

Quando o OpsWorks Stacks realiza essa mesclagem, ele copia todo o conteúdo dos diretórios, incluindo receitas. Se houver duplicatas, as seguintes regras se aplicam:
+ O conteúdo dos livros de receitas do Berkshelf tem preferência sobre os livros de receitas integrados.
+ O conteúdo dos livros de receitas personalizados tem preferência sobre os livros de receitas do Berkshelf.

Para ilustrar como esse processo funciona, considere o seguinte cenário, onde todos os três diretórios de livros de receitas contêm um livro de receitas chamado `mycookbook`:
+ Livros de receitas integrados: `mycookbook` inclui um arquivo de atributos chamado `someattributes.rb`, um arquivo de modelo chamado `sometemplate.erb` e uma receita chamada `somerecipe.rb`.
+ Livros de receitas do Berkshelf: `mycookbook` inclui `sometemplate.erb` e `somerecipe.rb`.
+ Livros de receitas personalizados: `mycookbook` inclui `somerecipe.rb`.

O livro de receitas mesclado contém o seguinte:
+ `someattributes.rb` do livro de receitas integrado.
+ `sometemplate.erb` do livro de receitas do Berkshelf.
+ `somerecipe.rb` do livro de receitas personalizado.

**Importante**  
Você não deve personalizar sua pilha do Chef 11.10 copiando um livro de receitas integrado inteiro para o repositório e, em seguida, modificando partes dele. Se fizer isso, você estará substituindo todo o livro de receitas integrado, incluindo as receitas. Se o OpsWorks Stacks atualizar esse livro de receitas, sua pilha não obterá os benefícios dessas atualizações, a menos que você atualize manualmente sua cópia privada. Para obter mais informações sobre como personalizar as pilhas, consulte [Personalizando pilhas OpsWorks](customizing.md).

## Utilização da pesquisa do Chef
<a name="workingcookbook-chef11-10-search"></a>

Você pode utilizar o método [http://docs.chef.io/dsl_recipe.html#search](http://docs.chef.io/dsl_recipe.html#search) do Chef em suas receitas para consultar os dados da pilha. Você usa a mesma sintaxe que usaria para o Chef Server, mas o OpsWorks Stacks obtém os dados do objeto do nó local em vez de consultar um servidor Chef. Esses dados incluem:
+ Os [atributos de configuração e implantação da pilha](workingstacks-json.md) da instância.
+ Os atributos dos arquivos de atributos dos livros de receitas integrados e personalizados da instância.
+ Os dados do sistema coletados pelo Ohai.

Os atributos de configuração e implantação da pilha contêm a maioria das informações que as receitas normalmente obtêm por meio da pesquisa, incluindo dados como nomes de host e endereços IP de cada instância on-line na pilha. OpsWorks As pilhas atualizam esses atributos para cada [evento do ciclo](workingcookbook-events.md) de vida, o que garante que eles reflitam com precisão o estado atual da pilha. Isso significa que você pode, muitas vezes, usar receitas da comunidade que sejam dependentes de pesquisa em sua pilha sem alterá-las. O método de pesquisa ainda retorna os dados apropriados; o que ocorre é que eles estão vindo dos atributos de configuração e implantação da pilha, em vez de um servidor.

A principal limitação da pesquisa de OpsWorks pilhas é que manipula somente os dados no objeto do nó local, em particular a configuração da pilha e os atributos de implantação. Por esse motivo, os seguintes tipos de dados podem não estar disponíveis por meio de pesquisa:
+ Atributos definidos localmente em outras instâncias.

  Se uma receita define um atributo localmente, essas informações não são reportadas ao serviço OpsWorks Stacks, então você não pode acessar esses dados de outras instâncias usando a pesquisa.
+ Atributos `deploy` personalizados.

  Você pode especificar um JSON personalizado quando [implanta um aplicativo](workingapps-deploying.md) e os atributos correspondentes são instalados nas instâncias da pilha para aquela implantação. No entanto, se você implantar apenas em instâncias selecionadas, os atributos são instalados apenas nessas instâncias. As consultas sobre esses atributos JSON personalizados falharão em todas as outras instâncias. Além disso, os atributos personalizados são incluídos no JSON de configuração e implantação da pilha apenas para essa implantação específica. Eles estarão acessíveis apenas até que o próximo evento de ciclo de vida instale um novo conjunto de atributos de configuração e implantação da pilha. Observe que quando você [especifica um JSON personalizado para a pilha](workingstacks-json.md), os atributos são instalados em cada instância para cada evento de ciclo de vida e estão sempre acessíveis por meio de pesquisa.
+ Dados do Ohai de outras instâncias.

  A [ferramenta Ohai](http://docs.chef.io/resource_ohai.html) do Chef obtém uma variedade de dados de sistema de uma instância e os adiciona ao objeto de nó. Esses dados são armazenados localmente e não são passados de volta ao serviço do OpsWorks Stacks, portanto a pesquisa não pode acessar os dados do Ohai a partir de outras instâncias. No entanto, alguns desses dados podem ser incluídos nos atributos de configuração e implantação da pilha.
+ Instâncias off-line.

  Os atributos de configuração e implantação da pilha somente contêm dados de instâncias online.

O trecho da receita a seguir mostra como obter o endereço IP privado de uma instância da camada de PHP usando a pesquisa. 

```
appserver = search(:node, "role:php-app").first
Chef::Log.info("The private IP is '#{appserver[:private_ip]}'")
```

**nota**  
Quando o OpsWorks Stacks adiciona os atributos de configuração e implantação da pilha ao objeto do nó, ele realmente cria dois conjuntos de atributos de camada, cada um com os mesmos dados. Um conjunto está no `layers` namespace, que é como o OpsWorks Stacks armazena os dados. O outro conjunto fica no namespace `role`, que é como o servidor Chef armazena os dados equivalentes. O objetivo do `role` namespace é permitir que o código de pesquisa que foi implementado para o Chef Server seja executado em uma instância do OpsWorks Stacks. Se você estiver escrevendo código especificamente para OpsWorks Stacks, poderá usar um `layers:php-app` ou `role:php-app` o exemplo anterior e `search` retornará o mesmo resultado.

## Utilização de recipientes de dados
<a name="workingcookbook-chef11-10-databag"></a>

Você pode usar o método [http://docs.chef.io/dsl_recipe.html#data-bag-item](http://docs.chef.io/dsl_recipe.html#data-bag-item) do Chef nas suas receitas para consultar informações em um recipiente de dados. A sintaxe usada é a mesma que você usaria para o servidor Chef, mas o OpsWorks Stacks obtém os dados dos atributos de configuração e implantação da pilha da instância. No entanto, o OpsWorks Stacks atualmente não oferece suporte aos ambientes do Chef, portanto, `node.chef_environment` sempre retorna`_default`.

Você pode criar um recipiente de dados usando um JSON personalizado para adicionar um ou mais atributos ao atributo `[:opsworks][:data_bags]`. O exemplo a seguir mostra o formato geral de criação de um recipiente de dados em um JSON personalizado.

**nota**  
Não é possível criar um recipiente de dados adicionando-o ao repositório de livros de receitas. Você deve usar um JSON personalizado.

```
{
  "opsworks": {
    "data_bags": {
      "bag_name1": {
        "item_name1: {
          "key1" : “value1”,
          "key2" : “value2”,
          ...
        }
      },
      "bag_name2": {
        "item_name1": {
          "key1" : “value1”,
          "key2" : “value2”,
          ...
        }
      },
      ...
    }
  }
}
```

Normalmente, você [especifica um JSON personalizado para a pilha](workingstacks-json.md), que instala os atributos personalizados em cada instância para cada evento de ciclo de vida subsequente. Você também pode especificar um JSON personalizado quando implanta um aplicativo, mas os atributos são instalados apenas para essa implantação e só podem ser instalados para um conjunto de instâncias selecionado. Para obter mais informações, consulte [Implementação de aplicativos](workingapps-deploying.md).

O seguinte exemplo de JSON personalizado cria um recipiente de dados chamado `myapp`. Ele possui um item `mysql` com dois pares de chave e valor.

```
{ "opsworks": {
    "data_bags": {
      "myapp": {
        "mysql": { 
          "username": "default-user",
          "password": "default-pass"
        }
      }
    }
  }
}
```

Para usar os dados em sua receita, você pode chamar o `data_bag_item` e passar para ele os nomes do recipiente de dados e do valor, como mostra o trecho a seguir.

```
mything = data_bag_item("myapp", "mysql")
Chef::Log.info("The username is '#{mything['username']}' ")
```

Para modificar os dados no recipiente de dados, basta modificar o JSON personalizado e ele será instalado nas instâncias da pilha para o próximo evento de ciclo de vida. 

## Utilização do Berkshelf
<a name="workingcookbook-chef11-10-berkshelf"></a>

Em pilhas do Chef 0.9 e Chef 11.4, você pode instalar apenas um repositório de livros de receitas personalizados. Em pilhas do Chef 11.10, você pode usar o [Berkshelf](http://berkshelf.com/) para gerenciar os livros de receitas e suas dependências, o que permite a você instalar livros de receitas de vários repositórios. (Para ter mais informações, consulte [Empacotar dependências do livro de receitas localmente](best-practices-packaging-cookbooks-locally.md).) Em particular, com o Berkshelf, você pode instalar livros de receitas da comunidade OpsWorks compatíveis com Stacks diretamente de seus repositórios, em vez de precisar copiá-los para seu repositório de livros de receitas personalizado. As versões compatíveis do Berkshelf dependem do sistema operacional. Para obter mais informações, consulte [OpsWorks Sistemas operacionais de pilha](workinginstances-os.md).

Para usar o Berkshelf, você deve habilitá-lo de forma explícita, conforme descrito em [Instalação de livros de receitas personalizados](workingcookbook-installingcustom-enable.md). Em seguida, inclua um arquivo `Berksfile` no diretório raiz do repositório do seu livro de receitas para especificar os livros de receitas a serem instalados. 

Para especificar a origem externa de um livros de receitas em um Berksfile, inclua um atributo de origem na parte superior do arquivo que especifica o URL do repositório padrão. A Berkshelf procurará os livros de receitas na fonte, a URLs menos que você especifique explicitamente um repositório. Em seguida, inclua uma linha para cada livro de receitas que você deseja instalar no seguinte formato: 

```
cookbook 'cookbook_name', ['>= cookbook_version'], [cookbook_options]
```

Os campos que vêm logo após `cookbook` especificam o livro de receitas específico.
+ *cookbook\$1name*— (Obrigatório) Especifica o nome do livro de receitas.

  Se você não incluir nenhum outro campo, a Berkshelf instala o livro de receitas a partir da fonte especificada. URLs
+ *cookbook\$1version*— (Opcional) Especifica a versão ou versões do livro de receitas.

  Você pode usar um prefixo como `=` ou `>=` para especificar uma versão específica ou um intervalo de versões aceitas. Se você não especificar uma versão, o Berkshelf instala a mais recente.
+ *cookbook\$1options*— (Opcional) O campo final é um hash contendo um ou mais pares de valores-chave que especificam opções como a localização do repositório.

  Por exemplo, você pode incluir uma chave `git` para designar um repositório Git específico e uma chave `tag` para designar uma ramificação específica do repositório. Especificar a ramificação do repositório é geralmente a melhor forma de garantir que você está instalando o livro de receitas de sua preferência.

**Importante**  
Não faça a declaração de livros de receitas incluindo uma linha de `metadata` em seu Berksfile ou incluindo a declaração das dependências do livro de receitas no `metadata.rb`. Para que isso funcione corretamente, ambos os arquivos devem estar no mesmo diretório. Com o OpsWorks Stacks, o Berksfile deve estar no diretório raiz do repositório, mas os `metadata.rb` arquivos devem estar em seus respectivos diretórios do livro de receitas. Em vez disso, você deve incluir as declarações explícitas dos livros de receitas externos no Berksfile.

Veja a seguir o exemplo de um Berksfile que mostra diferentes maneiras para especificar livros de receitas. Para obter mais informações sobre como criar um Berksfile, consulte [Berkshelf](http://berkshelf.com/).

```
source "https://supermarket.chef.io"

cookbook 'apt'
cookbook 'bluepill', '>= 2.3.1'
cookbook 'ark', git: 'git://github.com/opscode-cookbooks/ark.git'
cookbook 'build-essential', '>= 1.4.2', git: 'git://github.com/opscode-cookbooks/build-essential.git', tag: 'v1.4.2'
```

Este arquivo instala os seguintes livros de receitas:
+ A versão mais recente do `apt` do repositório de livros de receitas da comunidade.
+ A versão mais recente do `bluepill` dos livros de receitas da comunidade, desde que seja a versão 2.3.1 ou posterior.
+ A versão mais recente do `ark` de um repositório especificado.

  A URL deste exemplo é para um repositório público de livros de receitas da comunidade em GitHub, mas você pode instalar livros de receitas de outros repositórios, incluindo repositórios privados. Para obter mais informações, consulte [Berkshelf](http://berkshelf.com/).
+ O livro de receitas `build-essential` da ramificação v1.4.2 do repositório especificado.

Um repositório de livros de receitas personalizados pode conter livros de receitas personalizados, além de um Berksfile. Nesse caso, o OpsWorks Stacks instala os dois conjuntos de livros de receitas, o que significa que uma instância pode ter até três repositórios de livros de receitas. 
+ Os livros de receitas integrados são instalados em `/opt/aws/opsworks/current/cookbooks`.
+ Se o seu repositório de livros de receitas personalizados contém livros de receitas, eles estão instalados em `/opt/aws/opsworks/current/site-cookbooks`.
+ Se você habilitou o Berkshelf e seu repositório de livros de receitas personalizados contém um Berksfile, os livros de receitas especificados são instalados em `/opt/aws/opsworks/current/berkshelf-cookbooks`.

Os livros de receitas integrados e seus livros de receitas personalizados são instalados em cada instância durante a configuração e não são atualizados posteriormente, a menos que você execute manualmente o comando [**Atualizar pilha de livros de receitas personalizados**](workingstacks-commands.md). OpsWorks As pilhas são `berks install` executadas a cada execução do Chef, então seus livros de receitas da Berkshelf são atualizados para cada [evento do ciclo](workingcookbook-events.md) de vida, de acordo com as seguintes regras: 
+ Se você tiver uma nova versão de um livro de receitas no repositório, esta operação atualiza o livro de receitas do repositório.
+ Caso contrário, essa operação atualiza os livros de receitas do Berkshelf de um cache local.

**nota**  
A operação sobrescreve os livros de receitas do Berkshelf e, portanto, se você tiver modificado as cópias locais de quaisquer livros de receitas, essas alterações serão sobrescritas. Para obter mais informações, consulte [Berkshelf](http://berkshelf.com/)

Você também pode atualizar seus livros de receitas do Berkshelf executando o comando da pilha**Update Custom Cookbooks**, que atualiza ambos os livros de receitas do Berkshelf e personalizados.