2017-08-17 75 views
5

我创建了一个Ansible Playbook,并创建了一个新的AWS EC2实例。我现在想要SSH进入这个实例并运行一些命令。我会如何去做这件事?有没有办法通过可靠的方法来生成密钥对,还是最好使用现有的密钥对?如何生成一个密钥对,然后通过全部ssh转换成aws实例

我已经在线查看了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-剧本文档生成以下错误:

"msg": "Timeout when waiting for :22"

该实例没有公开DNS还创建用来SSH到经由CLI实例。

任何有关如何通过ansible-playbook ssh进入实例或为实例生成公有DNS名称的帮助将不胜感激。

回答

4

这似乎是你的AWS实例是如何工作的一个根本性的误解。创建实例时,它为默认用户分配了一个密钥对。 (例如,对于Amazon Linux实例,用户将是ec2用户,ubuntu映像使用ubuntu用户)。

此密钥对可以在ec2控制台中查看其详细信息中的实例。所有现有密钥对都可以在ec2控制台的密钥对部分下看到。

为了能够ssh到你开始与您刚刚创建的密钥的情况下,你需要做几件事情:

  1. 生成密钥对本地(使用shell: ssh-keygen ...
  2. 创建一个从本地生成密钥对EC2密钥对(使用ec2_key: ...
  3. 使用名为EC2密钥对启动实例(使用ec2: ...
  4. 通话使用的关键GE只是在同一剧本开始实例请参阅步骤1中的步骤。

步骤1-3应该作为hosts: 127.0.0.1运行。

步骤4将需要在同一个剧本中作为单独的hosts:调用完成,并不像看起来那么容易。您需要通过某种方式在hosts文件中指定新创建的实例,使用add_hosts模块指定Ansible group_vars路径,并/或以某种方式(可能通过使用实例标签)查找其IP地址。

一旦找到实例,就可以使用Ansible private_key_file变量来指定步骤1中的密钥,并将ssh指定到实例中。

不是说它不能完成,但是由于这样做的困难和不切实际,为了在每次进入实例时都有一个新的密钥对,我建议不要这样做,除非绝对必要。如果出于安全考虑,最好只是制定适当的关键轮换政策。

+0

ansible也允许你用'localhost'指定127.0.0.1 @ – Erich

+0

@真的,这是个人喜好的问题。 –

0

使用ec2_key模块首先:

- ec2_key: 
    name: example2 
    key_material: 'ssh-rsa AAAAxyz...== [email protected]' 
    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 
+0

谢谢。我已经这样做来创建一个新的密钥对。我怎样才能使用它通过ansible-playbook ssh进入实例? – fuzzii

1

Ansible使用SSH连接到实例,然后在客户端上使用python进行大部分的执行。 您可以使用rawshell模块引导客户端来执行诸如安装python2之类的操作,然后使用aws模块继续执行。

然而,您需要了解有关安理的一些东西,它可以在清单文件中指定的许多主机上执行,而不是单独执行。因为这个原因,不可能“以一个合理的方式进入一个实例”,因为这对于可行的事情没有实际的目的。在配置100台服务器时,管理员不应该通过SSH进入服务器,而是创建一个环境的过程,也许运行一个服务的容器,都应该在高层次上处理。如前所述,如果您的目的是使用可以被ssh进入的ansible来创建EC2实例,那么您应该使用ec2_key模块并在创建实例之前创建密钥。然后,当您创建实例时,您将通过key_name字段指定SSH密钥。

确保您指定的安全组允许来自端口22的传入连接,否则您将无法与其通信。

如果您想要自动报告PublicDNS地址,您应该看看ec2_remote_facts。这将返回一个可以解析的JSON来报告公共DNS。