使用ansible啟動EC2實例時如何等待user_data腳本執行?
我正在使用 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,或者使用
raw
Ansiblescript
模組來檢查/安裝 Python(這些模組不需要 Python)。