Background:
只是尝试学习如何使用Ansible,并一直在尝试使用AWS Ec2模块在AWS-EC2上构建和部署Ubuntu实例 . 所以已经构建了一个简单的Playbook来创建和启动实例并通过 ansible-playbook -vvvv 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
Problem:
问题是当尝试等待实例启动时,使用wait_for测试,如Examples for EC-2 module中所述,它失败并显示以下错误消息:
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
Output:
虽然在我签入_1591058时命令行上出现错误消息,但密钥对和EC2实例已创建并正在运行 .
Query:
想知道
-
我还需要一些其他参数吗?
-
'key=value' msg是由?引起的错误输出是什么?
-
有关调试脚本的其他方法的任何建议,以确定失败的原因?
-
它是否需要在Ansible世界的某个地方注册主机?
Additional NOTES:
测试剧本我发现密钥对已经创建,服务器启动从AWS启动,如从AWS Web控制台看到的那样 . 似乎问题是服务器启动的时间太长而脚本超时或失败 . 令人沮丧的是,错误消息并不是那么有用,并且还想知道是否有其他调试ansible脚本的方法?
2 回答
这不是“检测服务器正在运行”的问题 . 正如错误消息所示,这是语法问题 .
此外,您还希望从中央计算机而不是远程(新)服务器运行此程序 .
当您指示其余部分正在工作时,请关注wait_for测试 .
基于我运行的作业,我认为问题在于主机名,而不是其余的代码 . 我在受保护的VPC中使用Ansible服务器,该服务器具有对服务器启动的VPC的网络访问权限,并且我的wait_for代码如下所示(变量名称已更新以匹配您的):
尝试使用DNS而不是IP地址对我来说一直被证明是不可靠的 - 如果我将DNS注册为工作的一部分,有时可能需要一分钟才能解决(有时是即时的,有时不是) . 使用IP地址当然每次都有效 - 只要网络设置正确即可 .
如果您的Ansible服务器位于不同的区域或必须使用外部IP访问新服务器,您当然需要拥有相关的安全组,并在使用wait_for之前将新服务器添加到这些服务器 .