Назад | Перейти на главную страницу

Как дождаться запуска скрипта user_data при запуске экземпляров EC2 с помощью ansible?

Я использую Ansible для запуска и настройки экземпляров EC2, которые в настоящее время основаны на AMI (ubuntu / images / hvm-ssd / ubuntu-xenial-16.04-amd64-server-20161020 (ami-40d28157)), на котором не установлен Python с самого начала.

Поскольку большинству доступных модулей для работы нужен python на удаленном компьютере, вместо того, чтобы использовать другой AMI, я попытался установить python на начальных экземплярах, используя данные пользователя сценарий.

Это вроде работал (Python установлен правильно), но доступный ec2 задача возвращается перед скрипт user_data завершает работу, и поэтому задачи в следующем воспроизведении (те, которые фактически настраивают экземпляр) завершаются с ошибкой '/bin/sh: 1: /usr/bin/python: not found\r\n'

Поскольку без python я даже не могу запускать большинство задач на удаленном хосте, я не могу просто проверить, есть ли /usr/bin/python или файл маркера есть, или проверьте вывод системного журнала, например.

Я подумал о добавлении 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

Вот ответ на ваш вопрос "Как дождаться запуска сценария пользовательских данных при запуске экземпляров EC2 с помощью ansible?":

- 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 module на хосте завершает работу всех модулей (включая скрипт user_data).

Но я бы предложил создать AMI с предустановленным Python или использовать raw или script Модуль Ansible для проверки / установки Python (эти модули не требуют Python).

Оказывается, можно использовать cloud-init команду для этого, а именно:

cloud-init status --wait

Таким образом, вы должны добавить в свою книгу:

- name: Wait for cloud-init / user-data to finish
  command: cloud-init status --wait
  changed_when: false

Он выглядит немного чище по сравнению с первым ответом.