Exemplo 3: Criação de diretórios - 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 3: Criação de diretórios

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.

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

  2. Inicialize e configure o Test Kitchen, conforme descrito em Exemplo 1: Instalação de pacotes e adicione um diretório recipes dentro de createdir.

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

  4. Execute kitchen converge para executar a receita.

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

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

  2. Execute kitchen converge no diretório createdir.

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

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