Amazon ec2 Ansible AWS EC2检测服务器正在运行失败

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,并一直在使用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 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实例已创建并正在运行

查询:

疑惑

  • 我还需要一些其他参数
  • “key=value”消息是由什么引起的错误输出
  • 有没有关于调试脚本以确定失败原因的其他方法的建议
  • 是否需要在Ansible世界的某个地方注册主机
  • 附加说明:


    在测试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