【问题标题】:How to generate a keypair and then ssh into aws instance all via ansible to run commands on that instance如何生成密钥对,然后通过 ansible SSH 进入 aws 实例以在该实例上运行命令
【发布时间】:2018-01-25 06:08:25
【问题描述】:

我正在创建一个 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 名称的帮助将不胜感激。

【问题讨论】:

    标签: amazon-web-services amazon-ec2 ansible


    【解决方案1】:

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

    关于 ansible,您需要了解的一点是,它存在于清单文件中指定的许多主机上执行,而不是单个主机。出于这个原因,不可能“使用 ansible ssh 进入实例”,因为这对于 ansible 的作用没有实际用途。在配置 100 台服务器时,管理员不必通过 SSH 连接到它们,而是创建环境的过程,可能为服务运行容器,都应该在高级别上处理。

    如前所述,如果您的意图是使用可通过 ssh 连接的 ansible 创建 EC2 实例,那么您应该使用 ec2_key 模块并在创建实例之前创建密钥。然后,当您创建实例时,您将通过 key_name 字段指定 SSH 密钥。

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

    如果您希望 ansible 自动报告 PublicDNS 地址,您应该查看ec2_remote_facts。这将返回一个 JSON,可以对其进行解析以报告公共 DNS。

    【讨论】:

    • 感谢@Erich - 最初的问题是由于想要在实例的外壳中运行命令。我已经更新了问题。
    【解决方案2】:

    您似乎对 AWS 实例的工作方式存在根本性的误解。创建实例时,会为默认用户分配一个密钥对。 (例如,对于 Amazon Linux 实例,用户将是 ec2-user,ubuntu 映像使用 ubuntu 用户)。

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

    为了能够通过 ssh 进入使用刚刚创建的密钥启动的实例,您需要做一些事情:

    1. 在本地生成密钥对(使用shell: ssh-keygen ...
    2. 从本地生成的密钥对创建 ec2 密钥对(使用 ec2_key: ...
    3. 使用命名的 ec2 密钥对启动实例(使用 ec2: ...
    4. 使用步骤 1 中生成的密钥在同一个 playbook 中调用刚刚启动的实例。

    步骤 1-3 应以hosts: 127.0.0.1 运行。

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

    找到实例后,Ansible private_key_file 变量可用于在步骤 1 中指定密钥并通过 ssh 进入实例。

    并不是说不能这样做,但由于每次进入实例时为了获得一个新的密钥对而这样做既困难又不切实际,除非绝对必要,否则我建议不要这样做。如果出于安全考虑,最好制定适当的密钥轮换策略。

    【讨论】:

    • ansible 还允许您使用 localhost 指定 127.0.0.1
    • @Erich 真的是个人喜好问题。
    【解决方案3】:

    首先使用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
    

    【讨论】:

    • 谢谢。我这样做是为了创建一个新的密钥对。如何使用它通过 ansible-playbook SSH 进入实例?
    猜你喜欢
    • 2011-09-01
    • 2014-06-17
    • 2017-08-19
    • 2018-06-18
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    相关资源
    最近更新 更多