Knife 无法通过 ssh 连接到新实例化的 EC2 服务器

Knife 无法通过 ssh 连接到新实例化的 EC2 服务器

我刚刚设置了一个新的 Chef 环境,因为我目前正在扩展我对 Chef 的了解。我在 EC2 上设置了一个密钥对,我设置了我的 Knife 配置。当我尝试生成服务器时,节点已创建,但 Knife 无法通过 ssh 进入它。

这是我的knife.rb(在仓库之外):

current_dir = File.dirname(__FILE__)
log_level                :info
log_location             STDOUT
node_name                "mynode"
client_key               "/Users/me/.chef/my.pem"
validation_client_name   "my-validator"
validation_key           "/Users/me/.chef/my-validator.pem"
chef_server_url          "https://api.opscode.com/organizations/myorg"
cache_type               'BasicFile'
cache_options( :path => "/Users/me/.chef/checksums" )
cookbook_path            ["/Users/me/git/chef/cookbooks"]

knife[:aws_access_key_id] = "yadayadyada"
knife[:aws_secret_access_key] = "blahblahblah"
knife[:identity_file] = "/Users/me/.ssh/knife.pem"
knife[:aws_ssh_key_id] = "knife"

这是我的刀命令:

knife ec2 server create -r "role[whatever]" -I ami-09470539 --subnet subnet-03e44866 -f t2.micro --ssh-user ubuntu --region us-west-2 -Z us-west-2a

我也尝试通过pem直接指定:

knife ec2 server create -r "role[whatever]" -I ami-09470539 --subnet subnet-03e44866 -f t2.micro -S knife -i ~/.ssh/knife.pem --ssh-user ubuntu --region us-west-2 -Z us-west-2a

这是 VPC 组内的 HVM 实例。

我已尝试并检查过...

  1. 是的,pem具有正确的权限(400)。
  2. 是的,EC2 安全组(“默认”)可通过端口 22 供全世界访问。
  3. knife.pem是的,我可以使用命令行上的密钥直接通过 ssh 进入。
  4. 是的,我已经在 Google 上彻底搜索过这个问题,并且阅读了三个不同的教程。我似乎已经做对了一切。

我还遗漏了什么吗?

在详细模式下,这就是我所看到的......

Waiting for sshd
.DEBUG: ssh timed out: 172.nnn.nnn.nnn
.DEBUG: ssh timed out: 172.nnn.nnn.nnn

答案1

我第一次在 EC2 上设置 chef 时就遇到了这个确切的问题。下面是我们用来knife成功启动 EC2 实例的命令:

knife ec2 server create \
--flavor m3.medium \
--image ami-****** \
--iam-profile "iam-app" \
--ebs-size 30 \
--security-group-ids sg-**** \
--subnet subnet-6de**** \
--ssh-key my-key-name \
--ssh-user ubuntu \
--ssh-port 22 \
--identity-file "/local/path/to/ssh/key/for/this/instance" \
--ssh-gateway [email protected] \ #remove this line if you're not connecting through a bastion host
--server-connect-attribute private_ip_address \ # Because we connect through a bastion host we want to explicitly connect to the the private IP address.  You may want to set this to the public IP address.  I believe these are fog attributes.
--node-name "test-play-1" \
--tags Name="test-play-1",Environment="Test" \
--run-list "role[app]" \
--environment test

请注意,最佳做法是使用堡垒主机连接到您的实例,而不是直接连接到每个 EC2 实例。此外,对于面向公众的服务器,我们使用如下行来明确分配弹性 IP 地址:

--associate-eip 54.186.***.*** 

答案2

只是想补充对我们有用的内容没有堡垒主机,因为它需要进行大量的实验:

knife ec2 server create   --image ami-xxxxx                       \
                      --flavor t2.medium                      \
                      --run-list 'recipe[recipe-name]'        \
                      --security-group-id sg-xxxxx            \
                      --region us-east-1                      \
                      --node-name $1 -T Name=$1               \
                      --subnet subnet-xxxxx                   \
                      --ssh-user ubuntu                       \
                      --ssh-key key_name                      \
                      --identity-file "~/.ssh/key_file_name"  \
                      --server-connect-attribute dns_name     \
                      --associate-eip $2                      \
                      --associate-public-ip                   \
                      --no-host-key-verify      

其中第一个参数是实例名称,第二个参数是公共弹性IP。

干杯!

答案3

当然,当我离开电脑时,我就意识到问题是什么了......

knife正在尝试使用 ssh私有 IP.哎呀!

我只能假设这--associate-public-ip可以解决这个问题。我现在不在电脑旁,稍后再测试。欢迎确认/否认/提供建议。

答案4

因为我是通过公共 IP 连接,所以这--server-connect-attribute public_ip_address对我来说是可行的。

相关内容