Я использую Packer для создания образов VirtualBox, а установщик Ansible - для настройки образов. Шаг построителя создает временного пользователя (ssh_username
и ssh_password
). Поставщик Ansible работает под этим временным пользователем. Я, конечно, хочу избавиться от этого пользователя после того, как он настроит нашего более безопасного пользователя с открытым ключом. Поэтому я добавил второй шаг подготовки Ansible, который подключается как защищенный пользователь и удаляет незащищенного пользователя. По крайней мере, таков был план. Однако Ansible через упаковщик не может фактически подключиться к виртуальной машине с помощью этого метода.
Вот соответствующая часть файла 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"
]
}
],
Первый этап подготовки работает без проблем. Это второй сбой с отказом в разрешении. Ansible пытается выполнить следующую команду 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'"'"''
Соответствующая часть вывода отладки 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
Затем он продолжает пробовать оставшиеся ключи, которые есть в моем .ssh
каталог, который, конечно же, терпит неудачу. Первый, запрошенный, уже не сработал.
Я запустил Пакера с -on-error=abort
чтобы он оставил виртуальную машину. Я попробовал использовать SSHing с той же командой и получил сообщение об ошибке в соединении. Я обнаружил, что причина этого в том, что он пытается подключиться к порту прокси-сервера SSH, который настраивает Пакер. Поэтому я использую фактический перенаправленный порт, который настроен на виртуальной машине Virtualbox, и соединение SSH успешно. Таким образом, похоже, что проблема заключается в прокси-сервере SSH. Однако я не знаю, как заставить его вести себя.
Я также пробовал использовать ssh_authorized_key_file
вариант (https://www.packer.io/docs/provisioners/ansible.html) в моей конфигурации Packer для провайдера Ansible. В этом случае я получил ошибку Packer о том, что ему не удалось проанализировать авторизованный ключ (исходный код находится здесь: https://github.com/bhcleek/packer-provisioner-ansible/blob/master/provisioner/ansible/provisioner.go). Он не сказал мне, в чем проблема. В документации Go для библиотеки SSH сказано, что это стандартный формат ключевого файла SSH. Или это моя лучшая интерпретация (https://godoc.org/golang.org/x/crypto/ssh#ParseAuthorizedKey).
У меня возникла эта проблема, и я не смог заставить SSH-прокси Packer работать успешно.
Для того, чтобы упаковщик не Чтобы создать временный ключ, вам нужно либо запечь «ключ инициализации» в AMI, либо заранее разместить его на AWS.
Если вы следуете варианту 1 - вам необходимо предоставить как ssh_private_key_file
параметр в конфигурацию построителя, а также настройку ssh_agent_auth
к истине - вот так:
"ssh_username": "ubuntu",
"ssh_private_key_file": "../provision",
"ssh_agent_auth": true,
Если вы следуете варианту 2 - предоставьте ssh_keypair_name
вариант застройщику.
В обоих случаях вам потребуется предоставить пользователь к провайдеру Ansible, но вместо временной пары, которую генерирует упаковщик, следует использовать указанную пару ключей.
NB: Когда я удалил пользователя из ящика с помощью средства обеспечения Ansible, это вызвало сбой ansible. Я подозреваю, что это связано с тем, что невозможно установить доступное соединение с целевой машиной без прохождения через прокси, и невозможно указать пользователя прокси в провайдере. Мне нужно было выполнить «Удалить пользователя и выключить машину» за один асинхронный вызов.