GNU/Linux >> Tutoriels Linux >  >> Linux

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

Cloud-init n'accepte pas les scripts bash simples, comme ça. C'est une bête qui mange le fichier YAML qui définit votre instance (packages, 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

Combined-userdata.txt est le fichier que vous souhaitez y coller.

Plus d'informations 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 le cloud, donc cela s'applique. Il existe d'autres initiateurs cloud qui ne sont pas nommés cloud-init - cela pourrait être différent.


Cela fait quelques années maintenant, mais pour d'autres avantages, j'ai eu le même problème, et il s'est avéré que cloud-init fonctionnait deux fois, depuis l'intérieur de /etc/rc3.d . La suppression de ces fichiers dans le dossier a permis aux données 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

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

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

#!/bin/sh

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

Donc, ce qui se passe dans le cas de l'OP, c'est que cloud-init se comporte correctement (c'est-à-dire qu'il télécharge et essaie d'exécuter le script) mais que le système d'exploitation est incapable de l'exécuter.

Voir :Shebang (Unix) sur Wikipédia


Linux
  1. Un script peut-il être exécutable mais pas lisible ?

  2. Pourquoi Nullglob n'est-il pas par défaut ?

  3. Ssh - Script pour automatiser Scp en réseau ?

  4. La variable Curl Outfile ne fonctionne pas dans le script Bash ?

  5. La commande Rm dans le script Bash ne fonctionne pas avec la variable ?

Espaces pour les variables dans le script bash ?

Le script Init.d n'est pas exécuté au démarrage ?

4 façons d'exécuter un script shell sous UNIX / Linux

nohup :commande introuvable

file_put_contents ne crée pas de fichier txt

Variable d'environnement TERM non définie