Exemplo 5: Uso de atributos - AWS OpsWorks

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 5: Uso de atributos

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 ou por meio do Premium AWS Support.

As receitas nas seções anteriores usaram valores codificados em tudo que não fosse a plataforma. Essa abordagem poderá ser incômoda se, por exemplo, você quiser usar o mesmo valor em mais de uma receita. Você pode definir valores separadamente de receitas incluindo um arquivo de atributo no livro de receitas.

Arquivo de atributo é uma aplicação do Ruby que atribui valores a um ou mais atributos. Ele deve estar na pasta attributes do livro de receitas. O Chef incorpora os atributos ao objeto nó, e qualquer receita pode usar os valores de atributo referenciando o atributo. Este tópico mostra como modificar a receita de Iteração para usar atributos. Aqui está a receita original para referência.

[ "/srv/www/config", "/srv/www/shared" ].each do |path| directory path do mode 0755 owner 'root' group 'root' recursive true action :create end end

A seguir, a definição de atributos para os valores de nome, modo, proprietário e grupo do subdiretório.

default['createdir']['shared_dir'] = 'shared' default['createdir']['config_dir'] = 'config' default['createdir']['mode'] = 0755 default['createdir']['owner'] = 'root' default['createdir']['group'] = 'root'

Observe o seguinte:

  • Toda definição começa com um tipo de atributo.

    Caso um atributo seja definido mais de uma vez, talvez em arquivos de atributo diferentes, o tipo de atributo especifica a precedência do atributo, que determina qual definição é incorporada ao objeto nó. Para ter mais informações, consulte Precedência de atributo. Todas as definições neste exemplo têm o tipo de atributo default, que é o tipo usual para essa finalidade.

  • Os atributos têm nomes aninhados.

    O nó objeto é basicamente uma tabela de hash que pode ser aninhada profundamente de maneira arbitrária, de maneira que nomes de atributo possam ser e normalmente são aninhados. Este arquivo de atributo segue uma prática padrão de usar um nome aninhado com o nome do livro de receitas, createdir, como o primeiro elemento.

A razão para usar createdir como o primeiro elemento do atributo é que, quando você faz uma execução do Chef, o Chef incorpora os atributos de todos os livros de receitas ao objeto nó. Com o AWS OpsWorks Stacks, o objeto node inclui um grande número de atributos dos livros de receitas integrados, além de quaisquer atributos que você definir. A inclusão do nome do livro de receitas no nome do atributo reduz o risco de uma colisão de nomes com atributos de outro livro de receitas, especialmente caso o atributo tenha um nome como port ou user. Não nomeie um atributo com algo como [:apache2][:user], por exemplo, a menos que você queira substituir o valor desse atributo. Para ter mais informações, consulte Usando atributos de livro de receitas personalizado.

O exemplo a seguir mostra a receita original usando atributos, em vez de valores codificados.

[ "/srv/www/#{node['createdir']['shared_dir']}", "/srv/www/#{node['createdir']['config_dir']}" ].each do |path| directory path do mode node['createdir']['mode'] owner node['createdir']['owner'] group node['createdir']['group'] recursive true action :create end end
nota

Caso você queira incorporar um valor de atributo a uma string, encapsule-o com #{}. No exemplo anterior, #{node['createdir']['shared_dir']} acrescenta "shared" a "/srv/www/".

Para executar a receita
  1. Execute kitchen destroy para começar com uma instância limpa.

  2. Substitua o código em recipes/default.rb pelo exemplo de receita anterior.

  3. Crie um subdiretório de createdir chamado attributes e adicione um arquivo chamado default.rb que contenha as definições de atributo.

  4. Edite .kitchen.yml para remover CentOS da lista de plataformas.

  5. Execute kitchen converge e faça logon na instância para verificar se os diretórios /srv/www/shared e /srv/www/config estão lá.

nota

Com o AWS OpsWorks Stacks, definir valores como atributos fornece um benefício adicional; você pode usar o JSON personalizado para substituir esses valores por pilha ou até mesmo por implantação. Isso pode ser útil em várias finalidades, inclusive a seguinte:

  • Você pode personalizar o comportamento das receitas, como definições de configuração ou nomes de usuário, sem a necessidade de modificar o livro de receitas.

    Você pode, por exemplo, usar o mesmo livro de receitas em pilhas personalizado e usar JSON personalizado a fim de especificar definições de configuração principais para uma determinada pilha. Isso economiza o tempo e o esforço necessários para modificar o livro de receitas ou usar um livro de receitas diferente para cada pilha.

  • Você não precisa colocar informações potencialmente confidenciais, como senhas de banco de dados, no repositório do livro de receitas.

    Em vez disso, você pode usar um atributo para definir um valor padrão e usar o JSON personalizado para substituir esse valor pelo real.

Para obter mais informações sobre como usar JSON personalizado para substituir atributos, consulte Sobrepor atributos.

O arquivo de atributo é chamado de default.rb porque é uma aplicação do Ruby, caso ainda seja simples. Isso significa que você pode, por exemplo, usar lógica condicional para especificar valores de atributo com base no sistema operacional. Em Lógica condicional, você especificou um nome de subdiretório diferente para famílias do Linux diferentes na receita. Com um arquivo de atributo, você pode colocar a lógica condicional no arquivo de atributo.

O arquivo de atributo a seguir usa value_for_platform para especificar um valor de atributo ['shared_dir'] diferente, dependendo do sistema operacional. Para outras condições, você pode usar a lógica if-elsif-else do Ruby ou uma instrução case.

data_dir = value_for_platform( "centos" => { "default" => "shared" }, "ubuntu" => { "default" => "data" }, "default" => "user_data" ) default['createdir']['shared_dir'] = data_dir default['createdir']['config_dir'] = "config" default['createdir']['mode'] = 0755 default['createdir']['owner'] = 'root' default['createdir']['group'] = 'root'
Para executar a receita
  1. Execute kitchen destroy para começar com uma instância nova.

  2. Substitua o código em attributes/default.rb pelo exemplo anterior.

  3. Edite .kitchen.yml para adicionar uma plataforma do CentOS à seção de plataformas, conforme descrito em Lógica condicional.

  4. Execute kitchen converge e faça logon nas instâncias para verificar se os diretórios estão lá.

Quando terminar, execute kitchen destroy para encerrar a instância. O exemplo a seguir usa um novo livro de receitas.