Le script user-data (cloud-init) ne s’exécute pas sur EC2

mon script de données utilisateur

#! set -e -x echo `whoami` su root yum update -y touch ~/PLEASE_WORK.txt 

qui est alimenté depuis la commande:

 ec2-run-instances ami-05355a6c -n 1 -g mongo-group -k mykey -f myscript.sh -t t1.micro -z us-east-1a 

mais quand je vérifie le fichier /var/log/cloud-init.log , la tail -n 5 est:

 [CLOUDINIT] 2013-07-22 16:02:29,566 - cloud-init-cfg[INFO]: cloud-init-cfg ['runcmd'] [CLOUDINIT] 2013-07-22 16:02:29,583 - __init__.py[DEBUG]: restored from cache type DataSourceEc2 [CLOUDINIT] 2013-07-22 16:02:29,686 - cloud-init-cfg[DEBUG]: handling runcmd with freq=None and args=[] [CLOUDINIT] 2013-07-22 16:02:33,691 - cloud-init-run-module[INFO]: cloud-init-run-module ['once-per-instance', 'user-scripts', 'execute', 'run-parts', '/var/lib/cloud/data/scripts'] [CLOUDINIT] 2013-07-22 16:02:33,699 - __init__.py[DEBUG]: restored from cache type DataSourceEc2 

J’ai également vérifié que curl http://169.254.169.254/latest/user-data renvoie mon fichier comme prévu.

et aucune autre erreur ou la sortie de mon script ne se produit. Comment puis-je obtenir le script user-data à exécuter au démarrage correctement?

Cloud-init n’accepte pas les scripts plain bash, comme ça. C’est une bête qui mange le fichier YAML qui définit votre instance (paquets, clés ssh et autres).

En utilisant MIME, vous pouvez également envoyer des scripts shell arbitraires, mais vous devez les encoder en MIME.

 $ cat my-boothook.txt #!/bin/sh echo "Hello World!" echo "This will run as soon as possible in the boot sequence" $ cat my-user-script.txt #!/usr/bin/perl print "This is a user script (rc.local)\n" $ cat my-include.txt # these urls will be read pulled in if they were part of user-data # comments are allowed. The format is one url per line http://www.ubuntu.com/robots.txt http://www.w3schools.com/html/lastpage.htm $ cat my-upstart-job.txt description "a test upstart job" start on stopped rc RUNLEVEL=[2345] console output task script echo "====BEGIN=======" echo "HELLO From an Upstart Job" echo "=====END========" end script $ cat my-cloudconfig.txt #cloud-config ssh_import_id: [smoser] apt_sources: - source: "ppa:smoser/ppa" $ ls my-boothook.txt my-include.txt my-user-script.txt my-cloudconfig.txt my-upstart-job.txt $ write-mime-multipart --output=combined-userdata.txt \ my-boothook.txt:text/cloud-boothook \ my-include.txt:text/x-include-url \ my-upstart-job.txt:text/upstart-job \ my-user-script.txt:text/x-shellscript \ my-cloudconfig.txt $ ls -l combined-userdata.txt -rw-r--r-- 1 smoser smoser 1782 2010-07-01 16:08 combined-userdata.txt 

Le fichier combine-userdata.txt est le fichier que vous voulez coller ici.

Plus d’infos ici:

https://help.ubuntu.com/community/CloudInit

Notez également que cela dépend fortement de l’image que vous utilisez. Mais vous dites que c’est vraiment une image basée sur cloud-init, cela s’applique donc. Il y a d’autres initiateurs de cloud qui ne s’appellent pas cloud-init – alors ça pourrait être différent.

En fait, cloud-init autorise un script shell unique en tant qu’entrée (bien que vous souhaitiez peut-être utiliser une archive MIME pour des configurations plus complexes).

Le problème avec le script des OP est que la première ligne est incorrecte. Vous devriez utiliser quelque chose comme ceci:

 #!/bin/sh 

La raison en est que, alors que cloud-init utilise #! pour reconnaître un script utilisateur, le système d’exploitation a besoin d’une ligne complète de shebang afin d’exécuter le script.

Donc, ce qui se passe dans le cas des OP, c’est que cloud-init se comporte correctement (c’est-à-dire qu’il télécharge et tente d’exécuter le script) mais que le système d’exploitation ne peut pas réellement l’exécuter.


Voir: Shebang (Unix) sur Wikipedia

Cela fait quelques années maintenant, mais pour d’autres, j’ai le même problème, et il s’est avéré que cloud-init fonctionnait deux fois depuis /etc/rc3.d . La suppression de ces fichiers dans le dossier permettait à l’utilisateur de s’exécuter correctement:

 lrwxrwxrwx 1 root root 22 Jun 5 02:49 S-1cloud-config -> ../init.d/cloud-config lrwxrwxrwx 1 root root 20 Jun 5 02:49 S-1cloud-init -> ../init.d/cloud-init lrwxrwxrwx 1 root root 26 Jun 5 02:49 S-1cloud-init-local -> ../init.d/cloud-init-local