Amazon-Ec2

使用ansible啟動EC2實例時如何等待user_data腳本執行?

  • June 11, 2020

我正在使用 Ansible 啟動和配置目前基於未安裝 Python 的 AMI (ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-server-20161020 (ami-40d28157)) 中的 EC2 實例從一開始。

由於大多數 ansible 模組需要遠端機器上的 python 才能工作,而不是選擇使用不同的 AMI,我嘗試使用user_data腳本在啟動實例上安裝 python。

有點工作(Python已正確安裝),但ansible ec2任務在user_data腳本完成執行之前返回,因此接下來的任務(實際配置實例的任務)失敗並出現錯誤'/bin/sh: 1: /usr/bin/python: not found\r\n'

例如,由於沒有 python,我什至無法在遠端主機上執行大多數任務,我不能簡單地檢查是否/usr/bin/python存在標記文件或標記文件,或者檢查 syslog 輸出。

我曾考慮nc -l $SOME_PORT在 user_data 腳本的末尾添加一個並使用wait_for模組檢查它,但這對我來說聽起來太過分了。

有沒有辦法使用ec2模組來啟動一個實例,以便它等到 user_data 腳本完成執行?

以供參考:

類似於我正在使用的劇本:

- name: Create the EC2 instance
 hosts: localhost
 gather_facts: false
 vars: 
   name: myinstance
   ami: ami-40d28157
   #Other vars ommited for brevity
 tasks:
   - name: Launch Instance
     ec2:
       key_name: "{{ keypair }}"
       group: "{{ security_group }}"
       instance_type: "{{ instance_type }}"
       image: "{{ ami }}"
       user_data: "{{ lookup('file', 'user_data.sh') }}"
       wait: true
       region: "{{ region }}"
       vpc_subnet_id: "{{ subnet }}"
       assign_public_ip: no
       zone: "{{ zone }}"
       instance_tags: "{{ tag_map }}"
       exact_count: 1
       count_tag:
         Name: "{{ name }}"
     register: ec2

   - name: Add new Instance to host group
     add_host: name={{ item.private_ip }} groups={{ name }}
     with_items: "{{ ec2.instances }}"

   - name: Wait for SSH to come up
     wait_for: host={{ item.private_ip }} port=22 delay=60 timeout=320 state=started
     with_items: "{{ ec2.instances }}"

- name: Configure instance(s)
 hosts: myinstance
 tasks:
   - name: Example task
     command: touch a_file

user_data.sh 腳本:

#!/bin/bash
set -e -x
export DEBIAN_FRONTEND=noninteractive
sudo locale-gen pt_BR.UTF-8
sudo apt-get update && apt-get upgrade -y
sudo apt-get install -y python-minimal

這是您的問題*“使用 ansible 啟動 EC2 實例時如何等待使用者數據腳本執行?”的答案。*:

- raw: test -f /var/lib/cloud/instance/boot-finished
 retries: 20
 register: cmd_res
 changed_when: false
 until: cmd_res | success

這將通過 ssh 連接並在boot-finished存在時成功,這是在cloud-init主機上的模組完成所有模組(包括 user_data 腳本)後創建的。

但我建議創建預先安裝了 Python 的 AMI,或者使用rawAnsiblescript模組來檢查/安裝 Python(這些模組不需要 Python)。

引用自:https://serverfault.com/questions/855872