Exemplo 8: Gerenciamento de serviços - 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 8: Gerenciamento de serviços

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.

Pacotes como servidores de aplicação normalmente têm um serviço associado que deve ser iniciado, parado, reiniciado etc. Por exemplo, você precisará iniciar o serviço Tomcat depois de instalar o pacote ou a instância terminar a inicialização e reiniciar o serviço sempre que modificar o arquivo de configuração. Este tópico aborda os conceitos básicos de como gerenciar um serviço em uma instância do Linux usando um servidor de aplicações Tomcat como um exemplo. O recurso de serviço funciona da mesma maneira que instâncias do Windows, embora haja algumas diferenças em detalhes. Para ter mais informações, consulte service.

nota

O exemplo faz uma instalação do Tomcat muito mínima, apenas o suficiente para demonstrar os conceitos básicos de como usar um recurso service. Para obter um exemplo de como implementar receitas para um servidor Tomcat mais funcional, consulte Criação de uma camada de servidor Tomcat personalizada.

Definição e inicialização de um serviço

Esta seção mostra os conceitos básicos de como definir e iniciar um serviço.

Para começar
  1. No diretório opsworks_cookbooks, crie um diretório com nome tomcat e navegue até ele.

  2. Adicione um arquivo metadata.rb a tomcat, com o seguinte conteúdo.

    name "tomcat" version "0.1.0"
  3. Inicialize e configure o Test Kitchen, conforme descrito em Exemplo 1: Instalação de pacotes e remova CentOS da lista platforms.

  4. Adicione um subdiretório recipes a tomcat.

Você usa um recurso service para gerenciar um serviço. A receita padrão a seguir instala o Tomcat e inicia o serviço.

execute "install_updates" do command "apt-get update" end package "tomcat7" do action :install end include_recipe 'tomcat::service' service 'tomcat' do action :start end

A receita faz o seguinte:

  • O recurso execute executa apt-get update para instalar as atualizações do sistema atual.

    Para a instância do Ubuntu usada neste exemplo, você deverá instalar as atualizações antes de instalar o Tomcat. Outros sistemas podem ter requisitos diferentes.

  • O recurso package instala o Tomcat 7.

  • A receitatomcat::service incluída define o serviço e será abordada depois.

  • O recurso service inicia o serviço Tomcat.

    Você também pode usar esse recurso para emitir outros comandos, como parar e reiniciar o serviço.

O exemplo a seguir mostra a receita tomcat::service.

service 'tomcat' do service_name "tomcat7" supports :restart => true, :reload => false, :status => true action :nothing end

Essa receita cria a definição do serviço Tomcat da seguinte forma:

  • O nome do recurso, tomcat, é usado por outras receitas para referenciar o serviço.

    Por exemplo, default.rb referencia tomcat para iniciar o serviço.

  • O recurso service_name especifica o nome do serviço.

    Quando você listar os serviços na instância, o serviço Tomcat será chamado de tomcat7.

  • supports especifica como o Chef gerencia os comandos restart, reloade status do serviço.

    • true indica que o Chef pode usar o script init ou outro provedor de serviços para executar o comando.

    • false indica que o Chef deve tentar executar o comando por outros meios.

Observe que action é definido como :nothing, que leva o recurso a não realizar ação alguma. O recurso de serviço não dá suporte a ações como start e restart. No entanto, esse livro de receitas segue uma prática padrão de como usar uma definição de serviço que não realiza ação alguma e iniciar ou reiniciar o serviço em outro lugar. Cada receita que inicia ou reinicia um serviço deve primeiramente defini-la. Assim, a abordagem mais simples é colocar a definição de serviço em uma receita à parte e incluí-la em outras receitas, conforme necessário.

nota

Por uma questão de simplicidade, a receita padrão deste exemplo usa um recurso service para iniciar o serviço após a execução da definição do serviço. Uma implementação de produção normalmente inicia ou reinicia um serviço usando notifies, conforme será debatido depois.

Para executar a receita
  1. Crie um arquivo default.rb que contenha o exemplo de receita padrão e o salve em recipes.

  2. Crie um arquivo service.rb que contenha o exemplo de definição do serviço e o salve em recipes.

  3. Execute kitchen converge, faça logon na instância e execute o comando a seguir para verificar se o serviço está em execução.

    sudo service tomcat7 status
nota

Se estivesse executando service.rb separadamente de default.rb, você teria que editar .kitchen.yml para adicionar tomcat::service à lista de execuções. No entanto, quando você incluir uma receita, o código será incorporado à receita pai antes da receita ser executada. Por isso, service.rb é basicamente uma parte de default.rb e não exige uma entrada da lista de execuções à parte.

Uso de notifies para iniciar ou reiniciar um serviço

As implementações de produção normalmente não usam service para iniciar ou reiniciar um serviço. Em vez disso, elas adicionam notifies a qualquer um dos vários recursos. Por exemplo, caso queira reiniciar o serviço depois de modificar um arquivo de configuração, você inclui notifies no recurso template associado. O uso de notifies tem as vantagens a seguir em relação ao uso de um recurso service para reiniciar explicitamente o serviço.

  • O elemento notifies só reiniciará o serviço se o arquivo de configuração associado tiver sido alterado. Assim, não há risco de causar uma reinicialização desnecessária do serviço.

  • O Chef reinicia o serviço no máximo uma vez ao final de cada execução, independentemente de quantos notifies a execução contenha.

    Por exemplo, a execução do Chef pode incluir vários recursos do modelo, e cada um deles modifica um arquivo de configuração diferente e exige a reinicialização de um serviço caso o arquivo tenha sido alterado. No entanto, você normalmente só deseja reiniciar o serviço uma vez, ao final da execução do Chef. Do contrário, você pode tentar reiniciar um serviço que ainda não esteja totalmente operacional após uma reinicialização anterior, o que pode causar erros.

Este exemplo modifica tomcat::default para incluir um recurso template que usa notifies para reiniciar o serviço. Um exemplo realista usaria um recurso de modelo que cria uma versão personalizada de um dos arquivos de configuração do Tomcat, mas eles acabam sendo longos e complexos. Para simplificar, o exemplo usa apenas o recurso de modelo de Criação de um arquivo usando um modelo. Ele não tem a ver com o Tomcat, mas oferece uma maneira simples de mostrar como usar notifies. Para obter um exemplo sobre como usar modelos para criar arquivos de configuração do Tomcat, consulte Receitas de instalação.

Para configurar o livro de receitas
  1. Adicione um subdiretório templates e tomcat e um subdiretório default a templates.

  2. Copie o modelo example_data.json.erb do livro de receitas createfile para o diretório templates/default.

  3. Adicione um subdiretório attributes a tomcat.

  4. Copie o arquivo de atributo default.rb do livro de receitas createfile para o diretório attributes.

A receita a seguir usa notifies para reiniciar o serviço Tomcat.

execute "install_updates" do command "apt-get update" end package "tomcat7" do action :install end include_recipe 'tomcat::service' service 'tomcat' do action :enable end 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']} notifies :restart, resources(:service => 'tomcat') end

O exemplo mescla a receita de Criação de um arquivo usando um modelo à receita da seção anterior, com duas alterações significativas:

  • O recurso service ainda está lá, mas agora atende a uma finalidade um pouco diferente.

    A ação :enable habilita o serviço Tomcat na inicialização.

  • O recurso de modelo já inclui notifies, que reinicia o serviço Tomcat caso example_data.json tenha sido alterado.

    Isso garante que o serviço seja iniciado quando Tomcat é instalado e reiniciado inicialmente após cada alteração feita na configuração.

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

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

  3. Execute kitchen converge, faça logon na instância e verifique se o serviço está em execução.

nota

Caso queira reiniciar um serviço, mas a receita não inclua um recurso, como template que dê suporte a notifies, você pode usar um recurso execute fictício em seu lugar. Por exemplo

execute 'trigger tomcat service restart' do command 'bin/true' notifies :restart, resources(:service => 'tomcat') end

O recurso execute deve ter um atributo command, mesmo que você só esteja usando o recurso como uma maneira de executar notifies. Esse exemplo contorna esse requisito executando /bin/true, que é um comando do shell que simplesmente retorna um código de êxito.