O Packer não usa corretamente a chave privada para a autenticação SSH na etapa de aprovisionamento

4

Eu uso o Packer para criar imagens do VirtualBox, com o provisionador do Ansible para configurar as imagens. A etapa do construtor cria um usuário temporário ( ssh_username e ssh_password ). O provedor Ansible é executado usando esse usuário temporário. Eu, claro, quero me livrar desse usuário depois de configurar nosso usuário mais seguro somente para chaves públicas. Então eu adicionei uma segunda etapa de provisionamento Ansible que se conecta como o usuário seguro e remove o usuário inseguro. Ou pelo menos esse era o plano. No entanto, o Ansible via packer não consegue se conectar à VM usando esse método.

Aqui está a parte relevante do arquivo packer.json:

"provisioners": [
    {
        "type": "ansible",
        "playbook_file": "playbooks/image/image.yml",
        "groups": [
            "{{user 'ansible_group'}}"
        ],
        "user": "vagrant",
        "extra_arguments": [
            "--vault-password-file", "scripts/get-vault-password.sh",
            "-e", "global_configuration_user={{user 'configuration_user'}}",
            "-e", "global_deployment_user={{user 'deployment_user'}}",
            "-e", "ansible_ssh_pass=vagrant",
            "-vvvvv"
        ]
    },
    {
        "type": "ansible",
        "playbook_file": "playbooks/image/removeVagrant.yml",
        "groups": [
            "{{user 'ansible_group'}}"
        ],
        "user": "{{user 'configuration_user'}}",
        "extra_arguments": [
            "--vault-password-file", "scripts/get-vault-password.sh",
            "-e", "global_configuration_user={{user 'configuration_user'}}",
            "-e", "global_deployment_user={{user 'deployment_user'}}",
            "-e", "ansible_ssh_private_key_file=~/.ssh/id_{{user 'configuration_user'}}_rsa",
            "-vvvvv"
        ]
    }
],

A primeira etapa de provisionamento funciona sem problemas. É o segundo que falha com permissão negada. O Ansible está tentando executar o seguinte comando SSH:

ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o Port=37947 -o 'IdentityFile="/home/redacted/.ssh/id_rsa"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=redacted -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ControlPath=/home/redacted/.ansible/cp/ansible-ssh-%h-%p-%r 127.0.0.1 '/bin/sh -c '"'"'( umask 77 && mkdir -p "' echo ~/.ansible/tmp/ansible-tmp-1491233126.24-276699777493633 '" && echo ansible-tmp-1491233126.24-276699777493633="' echo ~/.ansible/tmp/ansible-tmp-1491233126.24-276699777493633 '" ) && sleep 0'"'"''

A parte relevante da saída de depuração do SSH é:

debug1: SSH2_MSG_NEWKEYS received
debug2: key: /home/redacted/.ssh/id_rsa, explicit, agent
debug2: key: redacted
debug2: key: redacted
debug2: key: redacted
debug2: key: redacted
debug2: key: redacted
debug2: key: redacted
debug2: key: redacted
debug3: send packet: type 5
debug3: receive packet: type 6
debug2: service_accept: ssh-userauth
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug3: send packet: type 50
debug3: receive packet: type 51
debug1: Authentications that can continue: publickey
debug3: start over, passed a different list publickey
debug3: preferred gssapi-with-mic,gssapi-keyex,hostbased,publickey
debug3: authmethod_lookup publickey
debug3: remaining preferred: ,gssapi-keyex,hostbased,publickey
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/redacted/.ssh/id_rsa
debug3: send_pubkey_test
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 51
debug1: Authentications that can continue: publickey
debug1: Offering RSA public key: key2
debug3: send_pubkey_test
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 51

Em seguida, ele continua tentando as chaves restantes que eu tenho no meu diretório .ssh , que todas falharam, é claro. O primeiro, aquele que foi solicitado, já falhou.

Eu rodei o Packer com -on-error=abort para que ele deixasse a VM ativa. Eu tentei SSHing com o mesmo comando, e recebo um erro de conexão recusada. A razão para isso, descobri, é que ele está tentando se conectar a uma porta de proxy SSH que o Packer configura. Então, eu uso a porta real encaminhada que está configurada na VM Virtualbox e a conexão SSH é bem-sucedida. Assim, parece que o problema está no proxy SSH. No entanto, não tenho certeza de como fazê-lo se comportar.

Eu também tentei usar a opção ssh_authorized_key_file ( link ) na minha configuração do Packer para o Ansible provisionador. Nesse caso, recebi um erro do Packer dizendo que ele não conseguiu analisar a chave autorizada (o código-fonte está aqui: link ). Não me disse qual é o problema. A documentação Go para a biblioteca SSH disse que é o formato de arquivo de chave SSH padrão. Ou essa é a minha melhor interpretação ( link ).

    
por siride 03.04.2017 / 17:56

0 respostas