Como esperar que o script user_data seja executado ao iniciar instâncias do EC2 com ansible?

1

Estou usando o Ansible para iniciar e configurar instâncias do EC2 atualmente baseadas em uma AMI (ubuntu / images / hvm-ssd / ubuntu-xenial-16.04-amd64-server-20161020 (ami-40d28157)) que não ter o Python instalado desde o início.

Como a maioria dos módulos ansiosos precisa do python na máquina remota para funcionar, em vez de optar por usar uma AMI diferente, tentei instalar o python nas instâncias iniciais usando um script user_data .

funcionou (o Python está instalado corretamente), mas a tarefa ansible ec2 retorna antes do user_data O script termina de ser executado e, portanto, as tarefas na execução a seguir (aquelas que realmente configurariam a instância) falharão com o erro '/bin/sh: 1: /usr/bin/python: not found\r\n'

Já que, sem o python, não consigo executar a maioria das tarefas no host remoto. Não consigo simplesmente verificar se /usr/bin/python ou um arquivo de marcadores está lá, ou verifique a saída do syslog, por exemplo.

Eu pensei em adicionar um nc -l $SOME_PORT no final do script user_data e checá-lo com o módulo wait_for , mas parece muito um hack para mim.

Existe uma maneira de usar o módulo ec2 para iniciar uma instância para que aguarde até que o script user_data termine a execução?

Para referência:

Um livro de exercícios semelhante ao que estou usando:

- 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

O script 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
    
por Guilherme Costa 15.06.2017 / 03:21

1 resposta

2

Aqui está a resposta para sua pergunta "Como esperar que o script de dados do usuário seja executado ao iniciar instâncias do EC2 com ansible?" :

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

Isso se conectará via ssh e será bem-sucedido quando boot-finished estiver presente, o que é criado depois que cloud-init module no host concluir todos os módulos (incluindo o script user_data).

Mas sugiro criar o AMI com o Python pré-instalado ou usar o módulo raw ou script Ansible para verificar / instalar o Python (esses módulos não exigem o Python).

    
por 15.06.2017 / 09:04