我正在编写一个程序,该程序使用Terraform在Amazon EC2上创建VM的实例,然后在该实例上运行Ansible脚本以进行进一步的配置。该程序执行以下操作:
subprocess
模块,在准备好的json文件上运行terraform apply
,传入生成的公钥和其他信息。subprocess
运行针对该主机的Ansible剧本,并给出生成的私钥。但是,Ansible脚本无法连接到主机。错误消息表示应归咎于关键问题:
ec2-user@ec2-XX-XXX-XX-XXX.compute-1.amazonaws.com: Permission denied (publickey).
,但是在仔细检查用于生成实例的公共密钥和用于连接的私有密钥之后,我确认它们确实匹配。我觉得这个问题是一些编码问题,但是我可以借助帮助来确定问题所在。
我可以确认虚拟机创建成功-我可以在EC2控制台中看到它们。
以下方法生成密钥对:
def generate_ssh_key():
key = rsa.generate_private_key(
backend=crypto_default_backend(),
public_exponent=65537,
key_size=2048)
private_key = key.private_bytes(
crypto_serialization.Encoding.PEM,
crypto_serialization.PrivateFormat.PKCS8,
crypto_serialization.NoEncryption())
public_key = key.public_key().public_bytes(
crypto_serialization.Encoding.OpenSSH,
crypto_serialization.PublicFormat.OpenSSH)
return str(public_key, "utf-8"), str(private_key, "utf-8")
我的aws.tf.json
文件中的相关行是:
"resource": {
"aws_key_pair": {
"generated_key": {
"key_name": "aws-key-${var.id}",
"public_key": "${var.public_key}"
}
}
},
"resource": {
"aws_instance": {
"vm": {
...
"key_name": "${aws_key_pair.generated_key.key_name}",
...
}
}
}
其中id
和public_key
作为变量在命令行中传递。 aws_key_pair
不是。
subprocess
的{{1}}参数看起来像这样:
terraform apply
['terraform', 'apply', '-auto-approve', '-var', 'public_key=ssh-rsa AAAA...', '-var', 'user_id=...', '-var', 'access_key=...', '-var', 'secret_key=...']
的{{1}}参数看起来像这样(我正在使用subprocess
打印私钥。我试图将其写入模式为{{1 }}和模式ansible-playbook
,均无效)
tempfile
涉及到的许多代码(大部分是terraform的东西)是由我的队友编写的,所以我不完全了解它们的工作原理。如果还有其他需要提供的地方,我会尽力找到
答案 0 :(得分:0)
(OP)
首先发现问题是错误的。我使用了错误的用户帐户-我曾期望EC2创建amazon-linux VM,因为这是我事先手动测试系统时所做的事情,而我的队友实际上是将它们设置为创建ubuntu VM。因此,我使用的用户名ubuntu
就是问题的原因-将其更改为{{1}}并可以正常工作(我的意思是我遇到了另一个错误,但这更容易调试)。>