Da última vez,
Da próxima vez, vou tentar criar um banco de dados e inserir a configuração inicial como uma tarefa de última hora, reescrever o arquivo de configuração do WordPress e baixar o tema do WordPress do GitHub.
No entanto, por conveniência, usei o Capistrano3 para criar uma instância AWS EC2, então gostaria de deixar as dicas. Desta vez, usei a AMI oficial das instâncias EC2 para implantação para configurar instâncias EC2 em cada área com diferentes AvailabilityZones. Como piloto, usarei o "Amazon Linux AMI 2014.03.2 (HVM)" que suporta o tipo de instância mais recente "t2.micro" para configurar um total de 4 instâncias ao mesmo tempo, duas em cada uma das AvailabilityZones da Região 1a e 1c de Tóquio.
- Como preparação preliminar, você precisa configurar as configurações mínimas necessárias para criar instâncias EC2, como VPCs e Sub-nets, na conta AWS onde deseja configurar a instância. Em particular, como desta vez você vai configurar instâncias em diferentes AvailabilityZones, precisa configurar sub-redes em cada zona.
Agora, vamos começar com o procedimento de implantação. Primeiro, edite 'config/deploy/test.rb' para configurar o ambiente de implantação (servidor). Desta vez, a instância EC2 criada dinamicamente será o ambiente de implantação, então você não pode configurar o servidor antecipadamente. Isso porque novas instâncias lançadas na AWS não têm um ElasticIP, então o PublicIP é diferente a cada vez e a URL do endpoint muda dinamicamente. Portanto, desta vez, após o lançamento da instância, configuraremos o servidor alvo na tarefa Capistorano. A configuração inicial do servidor não existe mais, então vou comentar a descrição. Além disso, apenas a opção SSH será usada em comum no final, então vou deixar isso (embora não a use nesta tarefa de implantação...).
$ vim config/deploy/test.rb
#role :app, %w{deploy@localhost}
#role :web, %w{deploy@localhost}
#role :d b, %w{deploy@localhost}
Set :ssh_options, {
chaves: %w(/home/deploy/.ssh/id_rsa),
forward_agent: verdade,
}
Nesta implantação, usaremos o "AWS SDK for Ruby", então instalaremos o SDK com antecedência.
$ Sudo Gem instalar AWS-SDK
Em seguida, defina o conteúdo de implantação em 'config/deploy.rb'.
$ vim config/deploy.rb
# configuração válida apenas para Capistrano 3.1
Trava '3.2.1'
# Carregando o AWS SDK para Ruby
Exigir 'AWS-SDK'
# Configurando para o AWS SDK
AWS.config({
:access_key_id => '<AWSアカウントのACCESS key="" id="">',
:secret_access_key => '<AWSアカウントのSECRET access="" key="">',
:region=> 'ap-northeast-1', # a região onde a Instância EC2 é criada
})
# SOU image_id
# Amazon Linux AMI 2014.03.2 (HVM)
Set: ami_image_id, 'ami-29dc9228'
# Número de Instâncias a Criar
Set :instance_count, 4
# Tipo de Instância a Criar
Set :ec2_instance_type, 'T2.Micro'
# Criar Zonas de Disponibilidade
Conjunto :availability_zones, [ 'AP-Nordeste-1A', 'AP-Nordeste-1C' ]
# Criado subnet_id
Set :subnet_ids, [ 'Subnet-********', 'Subnet-********' ]
# Exclua tarefas padrão do Capistrano
framework_tasks = [:começando, :começando, :atualizando, :atualizado, :p ublishing, :p ublished, :finalizando, :terminando]
framework_tasks.cada do |t|
Rake::Task["deploy:#{t}"].limpar
fim
Ancinho::Tarefa[:d eploy].limpar
desc 'Iniciar uma instância EC2 para cada zona de disponibilidade diferente'
Tarefa: lançar fazer
run_locally
ec2 = AWS::EC2.new
created_instances = []
Cnt = 0
enquanto não < fetch(:instance_count) do
if cnt.even? then
current_az = fetch(:availability_zones)[0]
current_sn = fetch(:subnet_ids)[0]
else
current_az = fetch(:availability_zones)[1]
current_sn = fetch(:subnet_ids)[1]
end
i = ec2.instances.create(
:image_id => pode buscar(:ami_image_id),
:availability_zone => current_az,
:subnet => current_sn,
:instance_type => buscar(:ec2_instance_type),
:count => 1
)
durma 10 enquanto eu.status == :p anding
created_instances < i.id
cnt += 1
end
execute "echo -n #{created_instances} > ~/CREATED_INSTANCES"
fim
fim
desc 'Verifique o status de ativação das novas instâncias'
tarefa :verificar fazer
created_instances_list = 'CREATED_INSTANCES'
run_locally
ec2 = AWS::EC2.new
início
If testar "[ -f ~/#{created_instances_list} ]"
created_instances = capture("cd ~; cat #{created_instances_list}").chomp
ci = created_instances.gsub(/(\[|\s|\])/, '').split(',')
target_instances = ec2.instances.select { |i| i.exists? && i.status == :executando && ci.include?( i.id) }.map(&:p rivate_ip_address)
se target_instances.comprimento == 0 então
raise "Nenhuma instância criada"
fim
target_instances.each { |var|
Server var, User: 'EC2-User', Roles: %W{Web App}
}
fim
resgate => e
info e
Saída
fim
fim
fim
Tarefa :d Eploy => :check Do
run_locally
InfoFunções(:todos)
info 'Próxima tarefa de implantação em novas instâncias'
# Início de implantação
fim
fim
De fato, lance a instância.
Lançamento de teste de $cap
INFO[10af60ae] Rodando /usr/bin/env eco -n ["i-7497be72", "i-01c31718", "i-4d94bd4b", "i-00c31719"] > ~/CREATED_INSTANCES no localhost
DEBUG[10af60ae] Comando: echo -n ["i-7497be72", "i-01c31718", "i-4d94bd4b", "i-00c31719"] > ~/CREATED_INSTANCES
INFO[10af60ae] Finalizou em 0,003 segundos com status de saída 0 (bem-sucedido).
O log acima é a saída, e o lançamento da instância parece ter sido concluído, então confira no console de gerenciamento da AWS.

É verdade que quatro instâncias foram lançadas alternadamente em diferentes AvailabilityZones. Esse é um movimento ideal. Como o tempo de lançamento das instâncias AWS varia dependendo do ambiente, a tarefa de "lançamento" acima é encerrada sem verificar o status de lançamento da instância EC2. No entanto, se isso continuar, as informações da instância não poderão ser transferidas quando a próxima tarefa do Capistorano for lançada, então o ID da instância lançada na tarefa "launch" é escrito em um arquivo chamado "CREATED_INSTANCES" e terminado. Na próxima tarefa, pego o ID da instância escrito em "CREATED_INSTANCES", verifico o status de inicialização da instância e, se o status for ":running", tento defini-la como o servidor a ser implantado. Além disso, a tarefa "verificar" pega o endereço IP privado da nova instância com o status ":running" e o usa como nome de host do servidor de destino, mas se a nova instância receber um endereço IP público e o DNS público estiver configurado, não há problema em subtrair isso como '{}.map(&:d ns_name)'.
Tente executar as tarefas de acompanhamento.
$ Cap Teste de Implantação
DEBUG[79c503fb] Rodando /usr/bin/env [ -f ~/CREATED_INSTANCES ] no localhost
DEBUG[79c503fb] Comando: [ -f ~/CREATED_INSTANCES ]
DEBUG[79c503fb] Finalizado em 0,003 segundos com status de saída 0 (bem-sucedido).
DEBUG[9dd1f93d] Rodando /usr/bin/env cd ~; cat CREATED_INSTANCES no localhost
DEBUG[9dd1f93d] Comando: cd ~; cat CREATED_INSTANCES
DEPURAR[9dd1f93d] [i-7497BE72, I-01C31718, I-4d94BD4B, I-00C31719]
DEBUG[9dd1f93d] Finalizado em 0,002 segundos com status de saída 0 (bem-sucedido).
INFORMAÇÕES[#<Capistrano::Configuration::Server:0x0000000189a7c8 @user="ec2-user", @hostname="176.34.61.80", @port=nil, @properties=#<Capistrano::Configuration::Server::Properties:0x00000001899238 @properties={}, @roles=#<Set: {:web,="" :app}="">>>, #<Capistrano::Configuration::Server:0x000000018a3a08 @user="ec2-user", @hostname="176.34.62.168", @port=nil, @properties=#<Capistrano::Configuration::Server::Properties:0x000000018a3080 @properties={}, @roles=#<Set: {:web,="" :app}="">>>, #<Capistrano::Configuration::Server:0x000000018a0d58 @user="ec2-user", @hostname="176.34.62.75", @port=nil, @properties=#<Capistrano::Configuration::Server::Properties:0x000000018a6910 @properties={}, @roles=#<Set: {:web,="" :app}="">>>, #<Capistrano::Configuration::Server:0x000000018a8ee0 @user="ec2-user", @hostname="176.34.61.75", @port=nil, @properties=#<Capistrano::Configuration::Server::Properties:0x000000018b3818 @properties={}, @roles=#<Set: {:web,="" :app}="">>>]
Tarefa INFONext de implantar em novas instâncias
As informações da instância criadas na tarefa anterior foram herdadas e definidas com sucesso como servidor a ser implantado. Na próxima tarefa (neste caso, a tarefa de "deploy"), se você instalar Apache, PHP ou MySQL para cada nova instância, poderá se conectar à implantação anterior do WordPress.
No final, você pode criar um ambiente de implantação sonhador que permite criar um servidor e implantar o WordPress de uma vez só digitando comandos Capistrano 2~3 vezes.
Sites de Referência
- Estudar rapidamente AWS para 2. Criar EC2 com o AWS SDK para Ruby
- Adquirir e implantar instâncias EC2 sob ELB em Capistrano</AWSアカウントのSECRET></AWSアカウントのACCESS>