我正在创建一个 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 名称的任何帮助将不胜感激。
您似乎对 AWS 实例的工作方式存在根本性的误解。创建实例时,会为默认用户分配一个密钥对。(例如,对于 Amazon Linux 实例,用户将是 ec2-user,ubuntu 映像使用 ubuntu 用户(。
可以在实例的 ec2 控制台中查看此密钥对的详细信息。所有现有密钥对都可以在 ec2 控制台的密钥对部分下看到。
为了能够 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 地址。
找到实例后,可以使用 Ansibleprivate_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 的传入连接,否则您将无法与其通信。
如果您希望自动报告公共DNS地址,则应查看ec2_remote_facts
。这将返回一个 JSON,可以对其进行解析以报告公共 DNS。
首先使用ec2_key模块:
- ec2_key:
name: example2
key_material: 'ssh-rsa AAAAxyz...== me@example.com'
state: present
- ec2:
key_name: example2
instance_type: t2.micro
image: ami-123456
wait: yes
group: webserver
vpc_subnet_id: subnet-29e63245
assign_public_ip: yes