首页 > 解决方案 > ec2_ami ansible 模块导致 AWS 实例无法访问

问题描述

我正在运行 Ansible AWX 1.0.7.2 服务器,在 Ubuntu 18.04.1 LTS 上使用 Ansible 2.6.2。

我正在尝试创建一个 Ansible 剧本(在 AWX 中使用),它执行以下操作:

我的工作簿适用于大多数主机。但是,在我的两个实例上,正在创建 AMI,但之后主机显示为无法访问,并且之后的播放失败。

这是我正在使用的剧本:

---
- hosts: all
  remote_user: "{{ remote_user }}"
  tasks:
  - name: Create an AMI for backup
    ec2_ami:
      instance_id: "{{ instance_id }}"
      name: "{{ inventory_hostname }}-{{ ansible_date_time.iso8601_basic_short }}"
      tags:
        Name: "{{ inventory_hostname }}-{{ ansible_date_time.iso8601_basic_short }}"
    register: result

  - name: Pause for 120 seconds to allow instance to become reachable again
    pause: seconds=120

  - include_tasks: update-RedHat.yml
    when: (ansible_os_family == 'RedHat' and result.changed|default(false)|bool == true)

  - include_tasks: update-Debian.yml
    when: (ansible_os_family == 'Debian' and result.changed == true)

以及剧本失败的输出:

fatal: [testserver.mydomain.com]: UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: OpenSSH_7.6p1 Ubuntu-4, OpenSSL 1.0.2n  7 Dec 2017\r\ndebug1: Reading configuration data /etc/ssh/ssh_config\r\ndebug1: /etc/ssh/ssh_config line 19: Applying options for *\r\ndebug1: auto-mux: Trying existing master\r\ndebug2: fd 3 setting O_NONBLOCK\r\ndebug2: mux_client_hello_exchange: master version 4\r\ndebug3: mux_client_forwards: request forwardings: 0 local, 0 remote\r\ndebug3: mux_client_request_session: entering\r\ndebug3: mux_client_request_alive: entering\r\ndebug3: mux_client_request_alive: done pid = 3353\r\ndebug3: mux_client_request_session: session request sent\r\ndebug1: mux_client_request_session: master session id: 2\r\ndebug3: mux_client_read_packet: read header failed: Broken pipe\r\ndebug2: Control master terminated unexpectedly\r\nShared connection to testserver.mydomain.com closed.\r\n",
    "unreachable": true

}

如果失败的实例附加了大 (256GB) 卷并且在创建映像时可用 30-60 秒,我认为这就是问题所在。但是,插入延迟的多种方法似乎无济于事-无论我做什么,似乎都可以立即检查连接性。

您可以看到图像创建后的暂停。这在其他主机上有效,但在失败的主机上,它并没有走到这一步,因为它在到达之前已经显示为不可访问。

我在图像创建步骤之后尝试了这个:

  - name: wait for host to come back up
    wait_for: host={{ inventory_hostname }} port=22 delay=60 timeout=180 state=started

但得到了同样的失败和消息。

似乎错误在ec2_ami任务内,所以我也尝试插入wait

---
- hosts: all
  remote_user: "{{ remote_user }}"
  wait: yes
  tasks:
  - name: Create an AMI for backup
    ec2_ami:
      instance_id: "{{ instance_id }}"
      name: "{{ inventory_hostname }}-{{ ansible_date_time.iso8601_basic_short }}"
      tags:
        Name: "{{ inventory_hostname }}-{{ ansible_date_time.iso8601_basic_short }}"
    register: result

但这也没有什么区别,实例仍然显示为无法访问。

有什么办法可以解决这个问题吗?

标签: ansible

解决方案


推荐阅读