詳細検索

Implantando Instâncias EC2 no Capistrano3 desde a Nova Criação até a Configuração Inicial (Resumo)

Avatar
por maeno

Implantando Instâncias EC2 no Capistrano3 desde a Nova Criação até a Configuração Inicial (Resumo)
Traduzido do 日本語 • Ver original

Até agora, criamos uma nova instância AWS EC2 e a transformamos em uma tarefa no Capistrano3 até a configuração inicial da instância. Embora tenha sido difícil, finalmente chegamos ao ponto em que a instância EC2 estava pronta e tudo o que precisávamos fazer era instalar o middleware e as aplicações. Então, desta vez, gostaria de resumir o fluxo de implantação até agora.

Primeiro, prepare o servidor de implantação para rodar o Capistrano3. Inicie uma instância EC2, como um ambiente oficial Amazon Linux, pelo AWS Management Console, etc., faça login e instale o Capistrano31.

# Atualização delícia -y
# yum groupinstall -y "Ferramentas de Desenvolvimento" 
# Versão openssl
OpenSSL 1.0.1h-fips 5 jun 2014
# Versão OpenSSL -D
OPENSSLDIR: "/etc/pki/tls" 
# curl -L https://get.rvm.io | bash -s stable
# fonte /etc/profile.d/rvm.sh
# Lista de RVM
(※ Se os RVM Rubies forem exibidos, a instalação está concluída)
# Ruby -V
Ruby 2.0.0p451 (2014-02-24 revisão 45167) [x86_64-linux]
# Instalação RVM 2.0.0 -- --com-openssl-dir=/etc/pki/tls
# Ruby -V
Ruby 2.0.0p481 (2014-05-08 revisão 45883) [x86_64-linux]
# Trilhos de instalação gem --no-ri --no-rdoc
# Gem install capistrano
# Instalação de gemas capistrano_colors
# Instala a Gem capistrano-ext
# Instalação de GEMs sem trilhos - implantação
# Cap --v
 (※ Cap Abortado! ~ Se for exibido, a instalação está completa)
# Instalação da GEM AWS-SDK

Crie um usuário para rodar o projeto de implantação no servidor de implantação. Dependendo do conteúdo da tarefa de implantação, é mais conveniente para o usuário-alvo ter permissões de sudo. Após criar um usuário, faça login novamente com esse usuário e crie um projeto para o Capistrano3 no diretório home.

$ sudo useradd -G roda deploy-user
$ sudo passwd deploy-user
$ sudo su - usuário de implantação
$ mkdir -m 755 cap3-project
$ CD cap3-project
$ cap install STAGES=test

Em seguida, defina o projeto de implantação "cap3-project". Primeiro, edite a configuração global "cap3-project/capfile" usada pelo projeto de implantação.

Capfile

# Carregar DSL e Montar Estágios
exigir 'capistrano/setup' 

# Inclui tarefas padrão de implantação
exigir 'capistrano/implantação' 

# Inclui tarefas de outras gemas incluídas no seu Gemfile
# 
# Para documentação sobre esses, veja, por exemplo: 
# 
# https://github.com/capistrano/rvm
# https://github.com/capistrano/rbenv
# https://github.com/capistrano/chruby
# https://github.com/capistrano/bundler
# https://github.com/capistrano/rails
# 
# exigir 'capistrano/rvm' 
# Exigir 'capistrano/rbenv' 
# exigir 'capistrano/chruby' 
# exigir 'capistrano/agrupador' 
# exigir 'capistrano/trilhos/ativos' 
# exigem 'capistrano/trilhos/migrações' 

# Carrega tarefas personalizadas de 'lib/capistrano/tasks', se você tiver alguma definida. 
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }

Rake::Task[:test].invoke
invocar :teste

Nesta implantação, não usaremos RVM, Rails, etc. para a tarefa, então não há necessidade de incluir módulos opcionais. Por enquanto, especificaremos apenas que o ambiente padrão de implantação é "test".

Em seguida, configure o arquivo do ambiente de implantação 'cap3-project/config/deploy/test.rb'.

config/deploy/test.rb

# Sintaxe de Papéis Simples
# ==================
# Suporta adição em massa de hosts para papéis, o servidor principal de cada grupo
# é considerado o primeiro, a menos que algum hospedeiro tenha o primário
# Propriedade definida. Não declare 'papel :todos', é um papel meta. 

#role :app, %w{deploy@example.com}
#role :web, %w{deploy@example.com}
#role :d b, %w{deploy@example.com}


# Sintaxe Estendida do Servidor
# ======================
# Isso pode ser usado para inserir uma definição de servidor mais detalhada no
# lista de servidores. O segundo argumento é a, ou tipos pato, Hash e é
# usado para definir propriedades estendidas no servidor. 

#server 'example.com', usuário: 'deploy', roles: %w{web app}, my_property: :my_value


# Opções Personalizadas de SSH
# ==================
# Você pode passar qualquer opção, mas lembre-se que a net/ssh entende um
# Conjunto limitado de opções, consulte[a documentação da net/ssh](http://net-ssh.github.io/net-ssh/classes/Net/SSH.html#method-c-start). 
# 
# Opções globais
# -------------- 
# set :ssh_options, { 
# Chaves: %w(/home/rlisowski/.ssh/id_rsa), 
# forward_agent: falso, 
# auth_methods: %w(senha)
#  }
# 
# E/ou por servidor (sobrescrições globais)
# ------------------------------------ 
# servidor 'example.com', 
# Usuário: 'user_name', 
# roles: %w{web app}, 
# ssh_options: { 
# usuário: 'user_name', # sobrepõe a configuração do usuário acima
# chaves: %w(/home/user_name/.ssh/id_rsa), 
# forward_agent: falso, 
# auth_methods: %W (senha da chave pública)
# # senha: 'por favor, use as chaves' 
#   }

Nesta implantação, as configurações de função e SSH para o ambiente de implantação são executadas dinamicamente durante a tarefa real, então todas as configurações padrão foram comentadas.

Depois, defina a entidade da tarefa de implantação.

config/deploy.rb

# configuração válida apenas para Capistrano 3.1
Trava '3.2.1' 

## Configuração AWS ------------------------------------------------ 

# 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>',  
  :região => 'ap-nordeste-1', 
})

# SOU image_id
# Amazon Linux AMI 2014.03.2 (HVM)
Set: ami_image_id, 'ami-29dc9228' 

# Número de Instâncias a Criar
Conjunto :instance_count, 2

# 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, [ '**Sub-net-******', 'Sub-net-********' ]

# Nome do Par de Chaves para Conjunto
Definir :key_pair_name, 'Deploy-Test' 

# Arquivo de Chave Privada do Par de Chaves
definir :p file_chave_rivate, 'deploy-test.pem' 

# Caminho de Armazenamento de Arquivos de Chave Privada (Lado Local)
# *Faça upload de /home/deploy-user/deploy-test.pem antecipadamente.
definir :p rivate_key_local_path, '/home/deploy-user/' 

# ID de grupo de segurança a ser usado
Set :security_groups, [ 'SG-********', 'SG-********', 'SG-*****' ]

# ID do Núcleo
Set: kernel_id_name, 'Aki**-***' 

# Informações da Tag
Defina :module, 'implante' 
Definir :env, 'testar' 
Set :Version, '1.0.0' 

# Informações iniciais da conta do usuário (nova configuração de senha)
definir :d ef_account, 'ec2-user' 
defina :d ef_password, 'PalavraPassa' 

# Informações da Conta de Usuário de Manutenção
Definir :user_account, 'Deploy-User' 
Definir :user_password, 'senha' 

## Configurações Comuns para Projetos de Implantação ------------------------------------------------ 

# Nome do aplicativo para implantação
Set :Application, 'Nome da Application' 

# Valor padrão para :format é :p retty
set: format, :p retty

# Nível de saída logarítmica
Set :log_level, :info

# Valor padrão para :p ty é falso
Configurado :p Obrigado, verdade


## Inicialização de Tarefas (Excluir Tarefas Padrão de 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

## Tarefas de Implantação para Projetos

namespace :d eploy do

    ## Defina funções de processamento comuns no momento da implantação

    def get_created_instances(info_type=nul) 
        # Função de recuperar informações para novas instâncias EC2 eletrificadas (retorna ID de instância por padrão)
        created_instances_list = "CREATED_INSTANCES" 
        target_instances = []

        ec2 = AWS::EC2.new
        AWS.memoize faz
            se File.existe? ( File.expand_path("~") + "/#{created_instances_list}" ) então
                created_instances = File.read(File.expand_path("~") + "/#{created_instances_list}").chomp
                ci = created_instances.gsub(/(\[|\s|\])/, "").split(",")
                se info_type == "private_ip_address" então
                    target_instances = ec2.instances.select { |i| i.exists? && i.status == :executando && ci.include?( i.id) }.map(&:p rivate_ip_address)
                elsif info_type == "dns_name" então
                    target_instances = ec2.instances.select { |i| i.exists? && i.status == :running && ci.include?( i.id) }.map(&:d ns_name)
                senão
                    target_instances = ec2.instances.select { |i| i.exists? && i.status == :executando && ci.include?( i.id) }.map(&:id)
                fim
                  retorno target_instances
            senão
                retorno zero
            fim
        fim
    fim

    def set_ssh_options(current_task="init") 
        # Definir as informações de conexão SSH para o cliente a ser implantado (o padrão é apenas primeiro acesso)
        target_instances = get_created_instances("dns_name")
        se current_task == "init" então
            key_file_path = buscar(:p chave_rivate_local_caminho) + buscar(:p arquivo_chave_rivate)
            ssh_user = fetch(:d ef_account)
            Papel :first_time, target_instances
            target_instances.each { |host| 
                servidor host, usuário: ssh_user, funções: %w{first_time}, ssh_options: { chaves: key_file_path, forward_agent: true }
            }
        senão
            key_file_path = File.expand_path("~")+"/.ssh/#{fetch(:user_account)}_rsa" 
            ssh_user = buscar(:user_account)
            Papel :Web, target_instances
            target_instances.each { |host| 
                servidor host, usuário: ssh_user, funções: %w{web}, ssh_options: { chaves: key_file_path, forward_agent: false }
            }
        fim
    fim

    ## Tarefas de Implantação

    desc "Iniciar uma instância EC2 em cada zona de disponibilidade diferente." 
    Tarefa: create_instances 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
                info ": Instances launch start."
                i = ec2.instances.create(
                    :image_id => buscar(:ami_image_id), 
                    :monitoring_enabled => falso, 
                    :availability_zone => current_az, 
                    :subnet => current_sn, 
                    :key_name => buscar(:key_pair_name), 
                    :security_group_ids => buscar(:security_groups), 
                    :d isable_api_termination => false, 
                    :instance_type => buscar(:ec2_instance_type), 
                    :count => 1, 
                    :associate_public_ip_address => verdade
                )
                durma 3 enquanto eu.status == :p encerrando
                i.tags["ModuleName"] = fetch(:module)
                i.tags["EnviromentName"] = fetch(:env)
                i.tags["Version"] = fetch(:version)
                i.tags["Name"] = [ fetch(:module), fetch(:env), format("%02d", cnt+1) ].join("-")
                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
        run_locally
            def check_instance_status(instance_ids=[]) 
                ec2 = AWS::EC2.new
                AWS.memoize faz
                    EC2INFO = ec2.client.describe_instance_status({"instance_ids" => instance_ids})
                    sys_status = ec2info.instance_status_set.map { |i| i.system_status.details[0].status }
                    ins_status = ec2info.instance_status_set.map { |i| i.instance_status.details[0].status }
                    status = sys_status + ins_status
                    status de retorno.include? ("inicializando") ? falso : verdadeiro
                fim
            fim

            início
                target_instances = get_created_instances ("id")
                raise ": Ainda não é criada todas as instâncias" se target_instances.comprimento < fetch(:instance_count)
                if target_instances.length == fetch(:instance_count) then
                    # 全インスタンス起動後
                    chk_retry = 0

                    while !check_instance_status(target_instances) do
                        # インスタンスステータスが全てOKでない場合は15秒待つ(※30回リトライ)
                        info ": In preparation of the instance: Status check " + (chk_retry > 0 ? "(retentar #{chk_retry + 1} vezes)" : "")
                        Sono 15
                        se check_instance_status(target_instances) então
                            Intervalo
                        fim
                        chk_retry += 1
                        raise ": A instância ainda não está pronta. Por favor, execute a tarefa novamente após esperar um pouco." se chk_retry >= 30
                    fim

                    info ": Concluído pronto para implantar todas as instâncias." 
                fim
            resgate => e
                info e
                Saída
            fim
        fim
    fim

    desc "Faz a configuração inicial em novas instâncias." 
    tarefa :init => :check fazer
        # Configurações de Opção SSH
        set_ssh_options("init")

        run_locally
            # Criar um par de chaves para autenticação de chave pública
            target_dir = "~/.ssh" 
            if !test "[ -f #{target_dir}/#{fetch(:user_account)}_rsa ]" 
                if !test "[ -d #{target_dir} ]" 
                    execute "mkdir -m 700 #{target_dir}" 
                fim
                execute "cd #{target_dir}; ssh-keygen -t rsa -N \"\" -f #{target_dir}/#{fetch(:user_account)}_rsa" 
            fim
            Set :p UBLIC_key_content, capture("cat #{target_dir}/#{fetch(:user_account)}_rsa.pub").chomp
            Set :new_private_key_path, "#{target_dir}/#{fetch(:user_account)}_rsa" 
        fim

        Sobre papéis(:first_time) Do
            # Configuração inicial (crie automaticamente contêineres .ssh ao criar usuários)
            if !test "[ -d /etc/skel/.ssh/ ]" 
                executar:sudo, "mkdir -m 700 /etc/skel/.ssh/; sudo touch /etc/skel/.ssh/authorized_keys; sudo chmod 600 /etc/skel/.ssh/authorized_keys" 
            fim

            # Criar um novo usuário para manutenção
            is_user = capture(:sudo, "cut -d: -f1 /etc/passwd").chomp.gsub(/(\r\n)/, ",").split(",")
            se !is_user.include? (fetch(:user_account)) então
                execute :sudo, "useradd -G wheel #{fetch(:user_account)}" 
                execute :sudo, "echo \"#{fetch(:user_account)}:#{fetch(:user_password)}\" | sudo chpasswd" 
            fim

            # Conceder privilégios SSH a novos usuários com autenticação de chave pública
            auth_keys = "/home/#{fetch(:user_account)}/.ssh/authorized_keys" 
            se capture(:sudo, "cat #{auth_keys}").chomp != fetch(:p oblic_key_content) então
                execute :sudo, "echo \"#{fetch(:p UBLIC_key_content)}\" | sudo tee #{auth_keys}" 
            fim

            # Mude o nome de host da nova instância
            ec2 = AWS::EC2.new
            AWS.memoize faz
                current_private_ip = capture(:sudo, "ifconfig | grep 'inet addr' | cut -d ':' -f 2 | awk 'NR==1 { print $1 }'").chomp
                instance_ids = ec2.instances.select { |i| i.exists? && i.status == :running && i.private_ip_address == current_private_ip }.map(&:id)
                host_basename = ec2.instances[instance_ids[0]].tags["Name"]
                se capture(:sudo, "hostname").chomp != host_basename.chomp então
                    executar:sudo, "echo \"#{host_basename}\" | sudo tee /proc/sys/kernel/hostname" 
                    execute :sudo, "sed -i 's/\\(^HOSTNAME=\\).*/\\1#{host_basename}/' /etc/sysconfig/network" 
                    execute :sudo, "nome do host #{host_basename}" 
                fim
            fim

            # Defina uma senha para o usuário padrão "ec2-user" e remova os privilégios do sudo
            # Conceder privilégios sudo a novos usuários para manutenção
            is_passwd = captura(:sudo, "corte -d: -f1,2 /etc/sombra").chomp.gsub(/(\r\n)/, ',').split(',')
            se is_passwd.include? ("ec2-user:!!") então
                execute :sudo, "echo \"ec2-user:#{fetch(:d ef_password)}\" | sudo chpasswd" 
            fim
            execute :sudo, "sed -i s/ec2-user/#{fetch(:user_account)}/g /etc/sudoers.d/cloud-init" 

            info ": Inicia tarefa concluída." 
        fim
    fim

    desc "Atualizar os pacotes yum." 
    tarefa :update_packages =>:init do
        # Configurações de Opção SSH
        set_ssh_options("update_packages")

        Sobre papéis(:web) fazer
            info ": Atualizando pacotes yum." 
            deploy_log = captura(:sudo, "yum -y atualização")
            pkg_updated = deploy_log.each_line.to_a
            info ": " + pkg_updated.first.strip
            info ": " + pkg_updated.last.strip

            info ": Missão de implantação toda concluída." 
            #info deploy_log
        fim
    fim

    depois de :create_instances, :update_packages

    desc "Implantar a aplicação." 
    tarefa :principal
        Sobre papéis(:web) fazer
            # Indefinido
        fim
    fim
fim

Nesta implantação, funcionalizamos o processo de obter informações específicas sobre a instância EC2 criada e a definição de informações de acesso SSH, que são comuns a diferentes tarefas. A configuração das opções SSH é definida mudando o papel para o primeiro acesso e o próximo acesso subsequente2. Além disso, tentamos usar o método after da tarefa para que, quando a tarefa 'create_instances' seja executada, a implantação seja executada totalmente automaticamente até a tarefa 'update_packages'.3

Por fim, faça upload do arquivo de chave privada do par de chaves usado ao criar a instância EC2 para o diretório inicial do usuário de implantação como 'SCP'. Agora você está pronto para começar.

Agora, vamos realmente implantá-lo. Quando você inicia a tarefa de implantação, faz pelo caminho onde instalou o projeto.

$ CD ~/projeto cap3
Teste de implantação do limite $create_instances

O registro de resultados da implantação é o seguinte:

INFO: Início do lançamento das instâncias. 
INFO: Início do lançamento das instâncias. 
INFO[be335092] Rodando /usr/bin/env echo -n ["i-4dd6ec4b", "i-62ae0a7b"] > ~/CREATED_INSTANCES no localhost
INFO[be335092] Terminou em 0,003 segundos com status de saída 0 (bem-sucedido). 
INFO: Em preparação para a instância: Verificação de status
INFO: Em preparação para a instância: Verificação de status (tentar 2 vezes)
INFO: Em preparação para a instância: Verificação de status (tente 3 vezes)
INFO: Em preparação para a instância: Verificação de status (tentar 4 vezes)
INFO: Em preparação para a instância: Verificação de status (tente 5 vezes)
INFO: Em preparação para a instância: Verificação de status (tentar 6 vezes)
INFO: Em preparação para a instância: Verificação de status (tentar 7 vezes)
INFO: Em preparação para a instância: Verificação de status (tentar 8 vezes)
INFO: Em preparação para a instância: Checagem de status (tente 9 vezes)
INFO: Em preparação para a instância: Verificação de status (tentar 10 vezes)
INFO: Em preparação para a instância: Verificação de status (tentar 11 vezes)
INFO: Em preparação para a instância: Verificação de status (tente 12 vezes)
INFO: Em preparação para a instância: Verificação de status (tente 13 vezes)
INFO: Em preparação para a instância: Verificação de status (tentar 14 vezes)
INFO: Pronta para implantar todas as instâncias. 
INFO[35b9f350] Rodando /usr/bin/env sudo mkdir -m 700 /etc/skel/.ssh/; sudo touch /etc/skel/.ssh/authorized_keys; sudo chmod 600 /etc/skel/.ssh/authorized_keys em ec2-54-178-167-106.ap-northeast-1.compute.amazonaws.com
INFO[35b9f350] Terminou em 0,069 segundos com status de saída 0 (bem-sucedido). 
INFO[6443cc90] Rodando /usr/bin/env sudo useradd -G volante deploy-user no ec2-54-178-167-106.ap-northeast-1.compute.amazonaws.com
INFO[6443cc90] Terminou em 0,222 segundos com status de saída 0 (bem-sucedido). 
INFO[b74993eb] Rodando /usr/bin/env sudo echo "deploy-user:password" | sudo chpasswd no ec2-54-178-167-106.ap-northeast-1.compute.amazonaws.com
INFO[b74993eb] Terminou em 0,070 segundos com status de saída 0 (bem-sucedido). 
INFO[a3e11615] Running /usr/bin/env sudo echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDgQ31X0qXm/eHXZCIecjv57C66cZ4ikLdprDhHZs+KV5/vK0B+/47cZCXaT7UEHdI+Bm3jNTPJoRE8iPzpkWB9L5Ks13tB7yJ5DGEIbFRe8d3kTa6Uwrj1HpL+i8hSZ7Bzbc4JvF5YULj97Ks13tB7yJ5DGEIbFRe8d3kTa6Uwrj1HpL+i8hSZ7Bzbc4JvF5YULj977 NfVAmpNvAqxF1mRWeuzcmevnsVNJ1nF6ePysNjiWmboepWl+MvIJ8xXLYPzrw8mO1kg7WEB0QxqGN5OsVZjjbmEMLliJ+xbOGfxI50FEa+k2445Y3nynBD9krx/1wayurEVn2t8jKWDn6XLSUJ41Ep43QkwFibwtcVBsfDSPIHVm6S3k9RzaAQWpN6qSrUiabk0yAOp deploy-user@devlab-deploy01" | sudo tee /home/deploy-user/.ssh/authorized_keys no ec2-54-178-167-106.ap-northeast-1.compute.amazonaws.com
INFO[a3e11615] Terminou em 0,035 segundos com status de saída 0 (bem-sucedido). 
INFO[d2f6241f] Rodando /usr/bin/env sudo echo "deploy-test-02" | sudo tee /proc/sys/kernel/hostname no ec2-54-178-167-106.ap-northeast-1.compute.amazonaws.com
INFO[d2f6241f] Terminou em 0,024 segundos com status de saída 0 (bem-sucedido). 
INFO[93fa8aa7] Rodando /usr/bin/env sudo sed -i 's/\(^HOSTNAME=\).*/\1deploy-test-02/' /etc/sysconfig/network na ec2-54-178-167-106.ap-northeast-1.compute.amazonaws.com
INFO[93fa8aa7] Terminou em 0,021 segundos com status de saída 0 (bem-sucedido). 
INFO[bd5146d3] Rodando /usr/bin/env sudo nome de host deploy-test-02 no ec2-54-178-167-106.ap-northeast-1.compute.amazonaws.com
INFO[bd5146d3] Terminou em 0,018 segundos com status de saída 0 (bem-sucedido). 
INFO[e8a45be7] Rodando /usr/bin/env sudo echo "ec2-user:PassWord" | sudo chpasswd no ec2-54-178-167-106.ap-northeast-1.compute.amazonaws.com
INFO[e8a45be7] Terminou em 0,116 segundos com status de saída 0 (bem-sucedido). 
INFO[e6bbbbda] Rodando /usr/bin/env sudo sed -i s/ec2-user/deploy-user/g /etc/sudoers.d/cloud-init no ec2-54-178-167-106.ap-northeast-1.compute.amazonaws.com
INFO[e6bbbbda] Terminou em 0,019 segundos com status de saída 0 (bem-sucedido). 
INFO: Tarefa de início concluída. 
INFO[e078eb47] Rodando /usr/bin/env sudo mkdir -m 700 /etc/skel/.ssh/; sudo touch /etc/skel/.ssh/authorized_keys; sudo chmod 600 /etc/skel/.ssh/authorized_keys em ec2-54-178-145-90.ap-northeast-1.compute.amazonaws.com
INFO[e078eb47] Terminou em 0,065 segundos com status de saída 0 (bem-sucedido). 
INFO[ded515dc] Rodando /usr/bin/env sudo useradd -G wheel deploy-user no ec2-54-178-145-90.ap-northeast-1.compute.amazonaws.com
INFO[ded515dc] Terminou em 0,323 segundos com status de saída 0 (bem-sucedido). 
INFO[8927f2f0] Rodando /usr/bin/env sudo echo "deploy-user:password" | sudo chpasswd no ec2-54-178-145-90.ap-northeast-1.compute.amazonaws.com
INFO[8927f2f0] Terminou em 0,069 segundos com status de saída 0 (bem-sucedido). 
INFO[51ed8060] Running /usr/bin/env sudo echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDgQ31X0qXm/eHXZCIecjv57C66cZ4ikLdprDhHZs+KV5/vK0B+/47cZCXaT7UEHdI+Bm3jNTPJoRE8iPzkWB9L5Ks13tB7yJ5DGEIbFRe8d3kTa6Uwrj1HpL+i8hSZ7Bzbc4JvF5YULj97NNfVAmpNvAqxF1mRWeuzcmevnsVNJ1nF6ePysNjiWmboepWl+MvIJ8xXLYPzrw8mO1kg7WEB0QxqGN5OsVZjjbmEMLliJ+xbOGfxI50FEa+k2445Y3nynBD9krx/1wayurEVn2t8jKWDn6XLSUJ41Ep43QkwFibwtcVBsfDSPIHVm6S3k9RzaAQWpN6qSrUiabk0yAOp deploy-user@devlab-deploy01" | sudo tee /home/deploy-user/.ssh/authorized_keys no ec2-54-178-145-90.ap-northeast-1.compute.amazonaws.com
INFO[51ed8060] Finalizou em 0,025 segundos com status de saída 0 (bem-sucedido). 
INFO[8c5dc231] Rodando /usr/bin/env sudo echo "deploy-test-01" | sudo tee /proc/sys/kernel/hostname no ec2-54-178-145-90.ap-northeast-1.compute.amazonaws.com
INFO[8c5dc231] Terminou em 0,018 segundos com status de saída 0 (bem-sucedido). 
INFO[5fc4603c] Rodando /usr/bin/env sudo sed -i 's/\(^HOSTNAME=\).*/\1deploy-test-01/' /etc/sysconfig/network na ec2-54-178-145-90.ap-northeast-1.compute.amazonaws.com
INFO[5fc4603c] Terminou em 0,033 segundos com status de saída 0 (bem-sucedido). 
INFO[9cdfbb66] Rodando /usr/bin/env sudo nome de host deploy-test-01 no ec2-54-178-145-90.ap-northeast-1.compute.amazonaws.com
INFO[9cdfbb66] Terminou em 0,015 segundos com status de saída 0 (bem-sucedido). 
INFO[de94f658] Rodando /usr/bin/env sudo echo "ec2-user:PassWord" | sudo chpasswd no ec2-54-178-145-90.ap-northeast-1.compute.amazonaws.com
INFO[de94f658] Terminou em 0,052 segundos com status de saída 0 (bem-sucedido). 
INFO[7ae1cd6c] Rodando /usr/bin/env sudo sed -i s/ec2-user/deploy-user/g /etc/sudoers.d/cloud-init no ec2-54-178-145-90.ap-northeast-1.compute.amazonaws.com
INFO[7ae1cd6c] Finalizou em 0,046 segundos com status de saída 0 (bem-sucedido). 
INFO: Tarefa de início concluída. 
INFO: Atualizando pacotes do yum. 
INFO: Atualizando pacotes do yum. 
INFO: Plugins carregados: prioridades, update-motd, upgrade-helper
INFO: Completo! 
INFO: Missão de implantação toda concluída. 
INFO: Plugins carregados: prioridades, update-motd, upgrade-helper
INFO: Completo! 
INFO: Missão de implantação toda concluída. 

Missão concluída.

Após implantar uma nova instância EC2 com o Capistrano3, se você não a implantar regularmente, seria melhor parar a instância do servidor de implantação ou pegar uma AMI e encerrá-la. O servidor de implantação só precisa ser usado para implantação, então é inútil incorrer em custos para essa instância.


  1. Este é um exemplo de instalação via RVM. Existem muitas formas de instalar Ruby e Capistrano3, então por favor, altere conforme sua aplicação.

  2. Se você definir a opção SSH sem mudar o papel, o acesso SSH como usuário diferente será adicionado ao mesmo papel, então as informações do primeiro SSH que não podem mais ser acessadas para o segundo e subsequente SSH permanecerão, e a tarefa travará ao fazer uma conexão SSH desnecessariamente.

  3. Se o status da instância não mudar para OK por 15 segundos × 30 pesos na tarefa de verificar o lançamento da instância EC2 que você criou, a tarefa será suspensa ali. Nesse caso, você pode tentar novamente reimplantando a partir da tarefa 'deploy:update_packages'.

Related Articles