如何将Ansible EC2模块创建的EC2实例添加至~/.ssh/known_hosts?
解决方案:用Ansible自动将EC2实例添加到~/.ssh/known_hosts
好问题!我刚好处理过类似的场景,其实Ansible有专门的模块可以帮你搞定这个——known_hosts模块,搭配你已经注册的ec2_instances变量就能轻松完成。
完整Playbook示例
把下面的任务追加到你的site.yml里,放在EC2实例创建任务之后即可:
# 先创建EC2实例并注册结果 - ec2: key_name: mykey instance_type: t2.micro image: ami-123456 wait: yes group: webserver count: 3 vpc_subnet_id: subnet-29e63245 assign_public_ip: yes register: ec2_instances # 将每个新实例的主机密钥添加到known_hosts - name: Add EC2 instances to ~/.ssh/known_hosts known_hosts: path: ~/.ssh/known_hosts name: "{{ item.public_ip }}" key: "{{ lookup('pipe', 'ssh-keyscan -t rsa ' ~ item.public_ip) }}" state: present loop: "{{ ec2_instances.instances }}" delegate_to: localhost
关键细节解释
- 循环遍历实例:
loop: "{{ ec2_instances.instances }}"会逐个处理你创建的3台EC2实例,ec2_instances.instances里包含了每台实例的公网IP、私有IP等所有元数据。 - 自动获取主机密钥:用
lookup('pipe', ...)调用ssh-keyscan命令,自动抓取目标IP的RSA主机密钥,完全替代手动输入确认的步骤。 - 控制节点修改:
delegate_to: localhost确保任务在你的Ansible控制节点上执行,修改的是控制节点的~/.ssh/known_hosts文件——毕竟你是从这里SSH连接EC2实例的。
额外优化建议
- 私有IP场景:如果是在VPC内部通过私有IP访问实例,把
item.public_ip换成item.private_ip就行。 - 多密钥类型支持:想要更安全的话,可以同时获取RSA和ECDSA密钥,把命令改成
ssh-keyscan -t rsa,ecdsa {{ item.public_ip }}。 - 避免重复添加:
state: present参数会自动跳过已存在的主机记录,不会在known_hosts里生成重复条目。
这样操作后,你直接SSH连接新EC2实例时,就不会再弹出烦人的主机密钥确认提示啦!
内容的提问来源于stack exchange,提问作者Tim Stewart
相关产品推荐
相关产品推荐

