68 votes

Comment puis-je faire cloud-init scripts de démarrage d'exécuter à chaque fois que mon instance EC2 bottes?

J'ai une instance EC2 exécutant un AMI basé sur l'AMI Linux Amazon. Comme tous ces AMIs, il prend en charge le cloud-init système pour l'exécution des scripts de démarrage basé sur les Données de l'Utilisateur passé en tous les cas. Dans ce cas particulier, mes Données d'Utilisateur d'entrée se trouve être un fichier include que les sources de plusieurs autres scripts de démarrage:

#include
http://s3.amazonaws.com/path/to/script/1
http://s3.amazonaws.com/path/to/script/2

La première fois que je démarre mon exemple, le cloud-init script de démarrage s'exécute correctement. Cependant, si je fais un soft reboot de l'instance (en exécutant sudo shutdown -r now, par exemple), l'instance revient sans exécuter le script de démarrage de la deuxième fois autour. Si je vais dans les journaux système, je peux voir:

Running cloud-init user-scripts
user-scripts already ran once-per-instance
[  OK  ]

Ce n'est pas ce que je veux -- je vois l'utilité d'avoir des scripts de démarrage qui fonctionnent uniquement une fois par exemple la durée de vie, mais dans mon cas, ces doit s'exécuter chaque fois que l'instance démarre, comme les scripts de démarrage.

Je me rends compte qu'une solution possible est d'manuellement mes scripts s'insérer dans rc.local après l'exécution de la première fois. Cela semble fastidieux, cependant, depuis le cloud-init et rc.d environnements sont subtilement différent, et je suis maintenant à déboguer des scripts lors du premier lancement et de tous les lancements séparément.

Personne ne sait comment je peux cloud-init de toujours exécuter mes scripts? Certes cela sonne comme quelque chose que les concepteurs de cloud-init aurait considéré.

67voto

smoser Points 366

En 11.10, 12.04 et plus tard, vous pouvez atteindre cet objectif en faisant le 'scripts de l'utilisateur' exécuter 'toujours'. Dans /etc/nuage/cloud.cfg, vous verrez quelque chose comme:

cloud_final_modules:
 - rightscale_userdata
 - scripts-per-once
 - scripts-per-boot
 - scripts-per-instance
 - scripts-user
 - keys-to-console
 - phone-home
 - final-message

Ceci peut être modifié après le démarrage, ou le cloud-config données de substitution de cette strophe peut être introduit par l'utilisateur de données. C'est à dire, données utilisateur vous pouvez fournir:

#cloud-config
cloud_final_modules:
 - rightscale_userdata
 - scripts-per-once
 - scripts-per-boot
 - scripts-per-instance
 - [scripts-user, always]
 - keys-to-console
 - phone-home
 - final-message

Qui peut aussi être "#include " comme vous l'avez fait dans votre description. Malheureusement, à droite maintenant, vous ne pouvez pas modifier le "cloud_final_modules" mais seulement de le remplacer. J'espère pour ajouter la possibilité de modifier les sections de configuration à un certain point.

Il y a un peu plus d'informations à ce sujet dans le cloud-config doc à http://bazaar.launchpad.net/~cloud-init-dev/cloud-init/trunk/view/head:/doc/examples/cloud-config.txt

Alternativement, vous pouvez mettre des fichiers dans /var/lib/cloud/scripts/par-boot , et ils vont être exécutés par les "scripts-par-boot" chemin d'accès.

21voto

EvanG Points 131

En /etc/init.d/cloud-init-user-scripts, de modifier cette ligne:

/usr/bin/cloud-init-run-module once-per-instance user-scripts execute run-parts ${SCRIPT_DIR} >/dev/null && success || failure

pour

 /usr/bin/cloud-init-run-module always user-scripts execute run-parts ${SCRIPT_DIR} >/dev/null && success || failure

Bonne chance !

8voto

Adrian Petrescu Points 4618

Une possibilité, bien que quelque peu hackish, est de supprimer le fichier de verrouillage à ce que le cloud-init utilise pour déterminer si oui ou non l'utilisateur, le script a déjà été exécuté. Dans mon cas (AMI Amazon Linux), ce verrou fichier se trouve dans /var/lib/cloud/sem/ et est nommé d' user-scripts.i-7f3f1d11 (de la valeur de hachage de la partie à la fin de chaque démarrage). Par conséquent, l'utilisateur des données de script ajouté à la fin du fichier include fera l'affaire:

#!/bin/sh
rm /var/lib/cloud/sem/user-scripts.*

Je ne suis pas sûr si cela va avoir des effets néfastes sur quoi que ce soit d'autre, mais il a travaillé dans mes expériences.

1voto

Rodney Quillo Points 1968

C' est un vieux fil de l'ec2-ubuntu mais pourrait être utile pour l'exécution de cloud-init sur redémarrer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X