web-dev-qa-db-ja.com

ansibleでEC2インスタンスを起動するときにuser_dataスクリプトが実行されるのを待つ方法は?

Ansibleを使用して、Python=最初からインストール。

ほとんどのansibleモジュールは、動作するリモートマシンでpythonを必要とするため、別のAMIの使用を選択するのではなく、user_dataスクリプトを使用して開始インスタンスにpythonをインストールしようとしました。

ちょっとうまくいきました(Pythonは正しくインストールされています)が、ec2タスクが返されますbefore user_dataスクリプトが実行を終了するため、次のプレイのタスク(実際にインスタンスを構成するもの)は、エラー'/bin/sh: 1: /usr/bin/python: not found\r\n'で失敗します

pythonがないため、リモートホストでほとんどのタスクを実行することさえできません。たとえば、/usr/bin/pythonまたはマーカーファイルが存在するかどうかを確認したり、syslog出力を確認したりすることはできません。

User_dataスクリプトの最後にnc -l $SOME_PORTを追加して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
1
Guilherme Costa

これがあなたの質問の答えです"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またはscript Ansibleモジュールを使用してPythonをチェック/インストールすることをお勧めします(これらのモジュールにはPythonは必要ありません)。

2