Comment faire réexécuter le script de données utilisateur EC2 au démarrage?

19

Une fois que cloud-init a exécuté un script de données utilisateur au premier démarrage d'une instance EC2, un fichier d'état est vraisemblablement écrit afin que cloud-init ne réexécute pas le script lors des redémarrages ultérieurs. Il y a des cas où j'aimerais supprimer ce fichier d'état afin que le script de données utilisateur soit exécuté à nouveau. Où est-ce?

Mike
la source

Réponses:

24

rm /var/lib/cloud/instances/*/sem/config_scripts_user

Travail confirmé sur:

  • CentOS 7.4
  • Ubuntu 14.04
  • Ubuntu 16.04

Par souci d'exhaustivité, si vous avez une situation où vous souhaitez garder une trace du fait / de la possibilité que cette AMI [avait une AMI parent qui ...] et qu'ils aient tous exécuté cloud-initdes données utilisateur, vous pouvez supprimer uniquement le sémaphore actuel.

rm /var/lib/cloud/instance/sem/config_scripts_user

Mike
la source
2
Vous avez compris cela rapidement.
c24w
9
@ c24w Ces horodatages sont trompeurs. En fait, cela m'a pris quelques heures de recherche et de test, donc une fois que j'ai compris, j'ai créé cette question pour aider la prochaine personne à la recherche d'une réponse définitive.
Mike
1
Je suis tombé sur cela depuis et je ne savais pas qu'il était encouragé de publier des questions et réponses de type wiki. Je vous remercie de documenter cela!
c24w
1
Je suis content que cela ait été encouragé sur serverfault. Je l'ai vu sous-évalué plusieurs fois sur SO
Frank
1
@ flag5 Que curlpour le service de métadonnées pour obtenir l'ID d'instance en cours est inutile car il /var/lib/cloud/instanceexiste déjà un lien symbolique vers l'instance en cours sous /var/lib/cloud/instances. :-)
Mike
2

Vous pouvez placer votre script dans /etc/rc.local, qui exécutera le script à chaque redémarrage.

Pratik Singhal
la source
/etc/rc.localn'a rien à voir avec les données utilisateur EC2.
Mike
@MikeConigliaro Je voulais utiliser les données utilisateur pour exécuter quelque chose à chaque démarrage, j'ai donc ajouté le script de données utilisateur à /etc/rc.local.
user253751
0

Vous pouvez également configurer vos données utilisateur pour les réexécuter à chaque démarrage, au lieu de supprimer le fichier d'état. Vous devez utiliser cloud_final_modulesdans votre script userdata pour réexécuter le script userdata et pour cela vous devez personnaliser uderdata pour avoir plusieurs fichiers dans userdata. Un exemple de fichier de données utilisateur serait comme:

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
/bin/echo "Hello World" >> /tmp/userdata-test.txt
--//

Cela rendra le script userdata à exécuter à la dernière étape de chaque processus de démarrage. Ici, une seule ligne bin/echo "Hello World" >> /tmp/userdata-test.txtà exécuter, remplacez-la par votre script shell qui doit être exécuté à chaque démarrage d'une machine.

Hardeep Singh
la source