我正在创建一个Ansible Playbook,我已经创建了一个新的AWS EC2实例 . 我现在想要SSH到这个实例并在该实例的shell中运行一些命令 . 我该怎么做呢?有没有办法通过ansible生成密钥对,还是最好使用现有密钥对?
我在线查看了Ansible ec2的在线资源 - 创建,终止,启动或停止ec2(http://docs.ansible.com/ansible/latest/ec2_module.html)中的实例,以及在线博客 . 虽然,我无法弄清楚如何SSH到实例,或在网上看到一个例子 .
使用:
- name: Wait for SSH to come up
wait_for:
host: "{{ item.public_ip }}"
port: 22
delay: 60
timeout: 320
state: started
with_items: "{{ ec2.instances }}"
从ansible-playbook文档中生成以下错误:
“msg”:“等待时超时:22”
该实例也是在没有公共DNS的情况下创建的,用于通过CLI将SSH连接到实例 .
有关如何通过 ansible-playbook
ssh进入实例的任何帮助,或为该实例生成公共DNS名称将不胜感激 .
3 回答
您似乎对AWS实例的工作方式存在根本性的误解 . 创建实例时,它为默认用户分配了一个密钥对 . (例如,对于Amazon Linux实例,用户将是ec2-user,ubuntu图像使用ubuntu用户) .
这个密钥对可以在ec2控制台中看到它的详细信息中的实例 . 所有现有的密钥对都可以在ec2控制台的Key Pairs部分下看到 .
为了能够ssh到你刚刚创建的键的实例,你需要做一些事情:
在本地生成密钥对(使用
shell: ssh-keygen ...
)从本地生成的密钥对创建ec2密钥对(使用
ec2_key: ...
)使用指定的ec2密钥对启动实例(使用
ec2: ...
)使用步骤1中生成的密钥调用刚刚在同一个playbook中启动的实例 .
步骤1-3应该作为
hosts: 127.0.0.1
运行 .第4步需要在同一个剧本中作为单独的
hosts:
呼叫完成,并不像看起来那么容易 . 您将需要某种方式使用add_hosts
模块在hosts
文件,Ansiblegroup_vars
路径中指定新创建的实例,和/或以某种方式找到它的IP地址(可能通过使用实例标记) .找到实例后,可以使用Ansible
private_key_file
变量在步骤1中指定密钥并将ssh指定到实例中 .并不是说它无法完成,而是由于每次进入实例时为了拥有一个新的密钥对而做到这一点的困难和不切实际,除非绝对必要,否则我会建议不要这样做 . 如果是安全问题,最好只有适当的密钥轮换策略 .
Ansible使用SSH连接到实例,然后在客户端上使用python执行大部分操作 . 您可以使用raw和shell模块来引导客户端来执行诸如安装python2之类的操作,然后继续使用aws模块执行 .
但是,您需要了解的有关ansible的内容是存在在库存文件中指定的许多主机上执行,而不是单个主机 . 由于这个原因,不可能“ssh到一个带有ansible的实例”,因为这对ansible的作用没有实际意义 . 在配置100个服务器时,管理员不应该通过SSH进入它们,而是创建环境的过程,可能运行服务的容器,都应该在高级别处理 .
正如已经提到的那样,如果您的目的是使用可以ssh进入的ansible创建EC2实例,那么您应该使用ec2_key模块并在创建实例之前创建密钥 . 然后,在创建实例时,您将通过key_name字段指定SSH密钥 .
确保您指定的安全组允许来自端口22的传入连接,否则您将无法与其通信 .
如果您希望ansible自动报告PublicDNS地址,您应该查看ec2_remote_facts . 这将返回一个JSON,可以解析它以报告公共DNS .
首先使用ec2_key模块: