首页 文章

Ansible AWS EC2检测服务器运行失败

提问于
浏览
1

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 回答

  • 0

    这不是“检测服务器正在运行”的问题 . 正如错误消息所示,这是语法问题 .

    # 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
    
  • 1

    当您指示其余部分正在工作时,请关注wait_for测试 .

    基于我运行的作业,我认为问题在于主机名,而不是其余的代码 . 我在受保护的VPC中使用Ansible服务器,该服务器具有对服务器启动的VPC的网络访问权限,并且我的wait_for代码如下所示(变量名称已更新以匹配您的):

    - name: wait for instances to listen on port 22
      wait_for:
        delay: 10
        state: started
        host: "{{ item.private_ip }}"
        port: 22
        timeout: 300
      with_items: ec2.instances
    

    尝试使用DNS而不是IP地址对我来说一直被证明是不可靠的 - 如果我将DNS注册为工作的一部分,有时可能需要一分钟才能解决(有时是即时的,有时不是) . 使用IP地址当然每次都有效 - 只要网络设置正确即可 .

    如果您的Ansible服务器位于不同的区域或必须使用外部IP访问新服务器,您当然需要拥有相关的安全组,并在使用wait_for之前将新服务器添加到这些服务器 .

相关问题