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