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
A ferramenta AWS OpsWorks Stacks o 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 o AWS Support Equipe em AWS Re:post
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
resourcepath
do recurso, o exemplo cria /srv/www/
e especifica as propriedades mode
, owner
e group
.
Para executar a receita
-
Crie um diretório dentro de
opsworks_cookbooks
chamadocreatedir
e navegue até ele. -
Inicialize e configure o Test Kitchen, conforme descrito em Exemplo 1: Instalação de pacotes e adicione um diretório
recipes
dentro decreatedir
. -
Adicione um arquivo
default.rb
com o código da receita ao subdiretóriorecipes
do livro de receitas. -
Execute
kitchen converge
para executar a receita. -
Execute
kitchen login
, navegue até/srv
e verifique se ele tem um subdiretóriowww
. -
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
-
Substitua o código em
default.rb
pela receita anterior. -
Execute
kitchen converge
no diretóriocreatedir
. -
Para verificar se o diretório foi mesmo criado, execute
kitchen login
, navegue até/srv/www
e verifique se ele contém um subdiretórioshared
. -
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