Amazon ec2 Ansible AWS EC2检测服务器正在运行失败
背景: 正在尝试学习如何使用Ansible,并一直在使用AWS Ec2模块在AWS-Ec2上构建和部署Ubuntu实例。因此,我们构建了一个简单的Playbook来创建和启动一个实例,并通过Amazon ec2 Ansible AWS EC2检测服务器正在运行失败,amazon-ec2,ansible,ansible-playbook,Amazon Ec2,Ansible,Ansible Playbook,背景: 正在尝试学习如何使用Ansible,并一直在使用AWS Ec2模块在AWS-Ec2上构建和部署Ubuntu实例。因此,我们构建了一个简单的Playbook来创建和启动一个实例,并通过ansible Playbook-vvv ic.yml 剧本是: --- - name: Create a ubuntu instance on AWS hosts: localhost connection: local gather_facts: False vars: # AWS
ansible Playbook-vvv ic.yml
剧本是:
---
- name: Create a ubuntu instance on AWS
hosts: localhost
connection: local
gather_facts: False
vars:
# AWS keys for access to the API
ec2_access_key: 'secret-key'
ec2_secret_key: 'secret-key'
region: ap-southeast-2
tasks:
- name: Create a Key-Pair necessary for connection to the remote EC2 host
ec2_key:
name=ic-key region="{{region}}"
register: keypair
- name: Write the Key-Pair to a file for re-use
copy:
dest: files/ic-key.pem
content: "{{ keypair.key.private_key }}"
mode: 0600
when: keypair.changed
- name: start the instance
ec2:
ec2_access_key: "{{ec2_access_key}}"
ec2_secret_key: "{{ec2_secret_key}}"
region: ap-southeast-2
instance_type: t2.micro
image: ami-69631053
key_name: ic-key # key we just created
instance_tags: {Name: icomplain-prod, type: web, env: production} #key-values pairs for naming etc
wait: yes
register: ec2
- name: Wait for instance to start up and be running
wait_for: host = {{item.public_dns_name}} port 22 delay=60 timeout=320 state=started
with_items: ec2.instances
问题:
问题在于,当尝试等待实例启动时,使用wait_for test(如中所述)失败,并显示以下错误消息:
msg: this module requires key=value arguments (['host', '=', 'ec2-52-64-134-61.ap-southeast-2.compute.amazonaws.com', 'port', '22', 'delay=60', 'timeout=320', 'state=started'])
FATAL: all hosts have already failed -- aborting
输出:
尽管当我在AWS控制台检查时,错误消息出现在命令行上,但密钥对和EC2实例已创建并正在运行
查询:
疑惑
在测试playbook时,我观察到密钥对已经创建,服务器启动是在AWS上启动的,从AWS web控制台可以看到这一点。问题似乎是服务器启动的时间段太长,脚本超时或失败。令人沮丧的是,错误消息并没有那么有用,而且还想知道是否有其他方法可以调试ansible脚本?当您指示其他方法正在工作时,重点关注等待测试 根据我运行的作业,我认为问题在于主机名,而不是代码的其余部分。我在受保护的VPC中使用Ansible服务器,该服务器可以通过网络访问启动服务器的VPC,我的等待代码如下所示(变量名已更新以匹配您的): 尝试使用DNS而不是IP地址对我来说总是不可靠的-如果我将DNS注册为作业的一部分,有时可能需要一分钟才能解析(有时是即时的,有时不是)。当然,只要网络设置正确,使用IP地址每次都有效 如果您的Ansible服务器位于不同的区域或必须使用外部IP访问新服务器,您当然需要拥有相关的安全组并将新服务器添加到这些安全组中,然后才能使用wait_for。这不是“检测服务器正在运行”的问题。正如错误消息所说,这是语法问题
# bad
wait_for: host = {{item.public_dns_name}} port 22 delay=60 timeout=320 state=started
# good
wait_for: host={{item.public_dns_name}} port=22 delay=60 timeout=320 state=started
此外,您将希望从中央计算机而不是远程(新)服务器上运行此操作
谢谢-我将尝试一下。是的,我认为这不是“等待服务器”的问题,而是与键值对问题有关。这个命令区域是最后一个遇到问题时执行的。我调整了代码,删除了{{item.private_ip}}周围的空格,现在得到错误:msg:This module requires key=value参数(['host=172.31.8.37','port','22','delay=360',timeout=320','state=start'])致命:所有主机都已失败--中止如果您使用的是key=value格式,那么您需要将主机IP用引号括起来,我想是吗?在使用变量时,我总是使用key:value格式来消除解析器的混淆。
# bad
wait_for: host = {{item.public_dns_name}} port 22 delay=60 timeout=320 state=started
# good
wait_for: host={{item.public_dns_name}} port=22 delay=60 timeout=320 state=started
local_action: wait_for host={{item.public_dns_name}} port=22 delay=60 timeout=320 state=started