ansible - ec2_ami ansible 模块导致 AWS 实例无法访问
问题描述
我正在运行 Ansible AWX 1.0.7.2 服务器,在 Ubuntu 18.04.1 LTS 上使用 Ansible 2.6.2。
我正在尝试创建一个 Ansible 剧本(在 AWX 中使用),它执行以下操作:
- 创建 AWS 实例的 AMI
- 等待实例再次可用
- 将更新安装到服务器
- 删除超过一周的 AMI
我的工作簿适用于大多数主机。但是,在我的两个实例上,正在创建 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
但这也没有什么区别,实例仍然显示为无法访问。
有什么办法可以解决这个问题吗?
解决方案
推荐阅读
- html - 当前路径,{% 与这些 django 响应图像中的任何一个都不匹配
- google-app-engine - Gcloud 云构建本地组件失败并出现错误“加载配置文件时出错:cloudbuild.Build 中的未知字段“availableSecrets””
- docker - Docker 启动失败
- reactjs - 我只想在离开页面时将 React 本地状态保存到 redux
- javascript - 未在 Firestore 中创建用户
- r - 从指定的 x 值显示 geom_smooth() 趋势线
- java - Android Studio getIntent().getStringExtra() 返回 null
- android - Android 使用带有 PageAdapter 的 Binding 类?
- java - Java XML:ClassCastException 类 com.sun.org.apache.xerces.internal.dom.DeferredTextImpl 无法转换为类 javax.swing.text.Element
- libimobiledevice - 无法执行备份协议版本交换,错误代码 -1