2011-06-25 16 views
41

Amazon Linux AMI tabanlı bir AMI çalıştıran bir EC2 örneğim var. Tüm AMI'lerde olduğu gibi, her bir örneğe iletilen Kullanıcı Verileri temelinde başlangıç ​​komut dosyalarını çalıştırmak için cloud-init sistemini destekler.EC2 örneğim her başlatıldığında bulut başlangıç ​​komut dosyalarını nasıl çalıştırırım?

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

benim örneği önyükleme ilk kez bulut init başlangıç ​​komut dosyası düzgün çalışır: Bu özel durumda, benim Kullanıcı Veri girişi bir diğer birkaç başlatma komut dosyalarını kaynaklar dosyayı ekle olur. Ben (örneğin sudo shutdown -r now çalıştırarak) örneğinin yumuşak bir yeniden başlatma Ancak, yoksa, örneğin etrafında Başlangıç ​​komut dosyasını ikinci kez çalıştırmadan geri çıkageldi. Bu ne istiyorum değil

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

- Sadece örnek ömrü başına bir kez çalıştırmak başlangıç ​​komut dosyalarını sahip yarar görebilirsiniz, ama benim durumumda bu yapmalıdır: Ben sistem günlükleri içine gidersen, ben görebiliyorum Normal başlatma komut dosyaları gibi, her yeniden başladığında örneği çalıştırın.

Ben olası bir çözüm manuel komut ilk kez çalıştırdıktan sonra rc.local kendilerini eklemesini sağlamak için olduğunu biliyoruz. Ancak bu, zorlu görünüyor, çünkü bulut-init ve rc.d ortamları oldukça farklı ve şimdi ilk lansman ve sonraki tüm lansmanlarda ayrı ayrı scriptler hata ayıklamak zorunda kalacaktı.

kimse hep komut dosyalarını çalıştırmak için bulut init söyleyebilir biliyor mu? Bu kesinlikle bulut-init tasarımcılarının düşündüğü bir şey gibi geliyor.

cevap

42
11.10 yılında

, 12.04 ve sonraki sürümlerinde, 'komut kullanıcıya' 'her zaman' koşmak yaparak bunu başarabilirsiniz.

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

Bu çizme sonra değiştirilebilir veya bu dörtlük geçersiz kılma bulut yapılandırma veri kullanıcı verilerini aracılığıyla eklenebilir: gibi bir şey göreceksiniz /etc/cloud/cloud.cfg olarak . Yani, kullanıcı verilerinde sağlayabilir: Eğer açıklamasında yaptığım gibi aynı zamanda '#include' olabilir

#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 

. Maalesef, şu anda, 'cloud_final_modules' değiştiremezsiniz, ancak sadece bunu geçersiz kılabilirsiniz. Yapılandırma bölümlerini bir noktada değiştirmeyi umuyoruz.

Orada http://bazaar.launchpad.net/~cloud-init-dev/cloud-init/trunk/view/head:/doc/examples/cloud-config.txt

de bulut yapılandırma doc bu konuda biraz daha bilgi, başına çizme// var/lib/bulut/komut dosyalarını koyabilirsiniz, Alternatif ve onlar olacak 'boot-script' yolu ile çalıştırın.

#cloud-config 

# run commands 
# default: none 
# runcmd contains a list of either lists or a string 
# each item will be executed in order at rc.local like level with 
# output to the console 
# - runcmd only runs during the first boot 
# - if the item is a list, the items will be properly executed as if 
# passed to execve(3) (with the first arg as the command). 
# - if the item is a string, it will be simply written to the file and 
# will be interpreted by 'sh' 
# 
# Note, that the list has to be proper yaml, so you have to quote 
# any characters yaml would eat (':' can be problematic) 
runcmd: 
- [ ls, -l,/] 
- [ sh, -xc, "echo $(date) ': hello world!'" ] 
- [ sh, -c, echo "=========hello world'=========" ] 
- ls -l /root 
- [ wget, "http://slashdot.org", -O, /tmp/index.html ] 

"bootcmd":

"runcmd":

+1

> bir noktada yapılandırma bölümleri değiştirme yeteneğini eklemeyi umuyoruz. Bu özellik şimdi eklenmiş mi? En son bulut başlangıçta bir "birleşme" özelliği görüyorum, ancak sadece 'komut dosyası kullanıcısı' çizgisini değiştirmek için bunu nasıl kullanacağımı anlayamadım. Geçtiğim seçeneklerden bağımsız olarak tüm listeyi geçersiz kılar. – Meta

+2

Burada satır içi modifikasyonu yapan bir tek katman var: 'sed -i'/scripts-user $/\ [scripts-user, her zaman \]/'/ etc/cloud/cloud.cfg' – wjordan

+0

'/ var/lib/bulut/komut dosyaları/önyükleme 'çok daha kolay görünüyor, [auto ec2 shutdown]' ı kurmak için kullanabilirim (http://stackoverflow.com/a/38186787/4058484). – hyip

7

Bir olasılık, biraz hackish rağmen, bulut init kullanıcı komut dosyası zaten tükendi olup olmadığını belirlemek için kullandığı kilit dosyasını silmektir. Benim durumumda (Amazon Linux AMI), bu kilit dosya /var/lib/cloud/sem/'da bulunur ve user-scripts.i-7f3f1d11 olarak adlandırılır (sondaki karma bölüm her önyüklemeyi değiştirir). Bu nedenle, aşağıdaki kullanıcı veri komut hile olacaktır dahil dosyanın sonuna eklenir:

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

bu başka bir şey üzerinde herhangi olumsuz etkileri olacaktır emin değilim ama çalışmıştır benim deneyler.

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

İyi şanslar

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

için: /etc/init.d/cloud-init-user-scripts yılında

+1

"karma parçası" ¿bir amazon makinesi kimliği olmamak gibi görünüyor? – theist

+1

Bir AWS örneği kimliği gibi görünüyor, bu durumda her bir örnek lansmanında değişecek, ancak aynı durumun durakları ve yeniden başlatmaları arasında aynı kalacak. Amazon Linux AMI için – froggythefrog

4

bulut init belgelerinde bootcmd komut açıklamaları vs (http://cloudinit.readthedocs.io/en/latest/topics/examples.html#run-commands-on-first-boot) runcmd bakın şimdi doğal olarak bu destekler

#cloud-config 

# boot commands 
# default: none 
# this is very similar to runcmd, but commands run very early 
# in the boot process, only slightly after a 'boothook' would run. 
# bootcmd should really only be used for things that could not be 
# done later in the boot process. bootcmd is very much like 
# boothook, but possibly with more friendly. 
# - bootcmd will run on every boot 
# - the INSTANCE_ID variable will be set to the current instance id. 
# - you can use 'cloud-init-per' command to help only run once 
bootcmd: 
- echo 192.168.1.130 us.archive.ubuntu.com >> /etc/hosts 
- [ cloud-init-per, once, mymkfs, mkfs, /dev/vdb ] 

, bootcmd'de "bulut-init-per" komut örneğine de dikkat çeker. 's yardımıyla Gönderen:

Usage: cloud-init-per frequency name cmd [ arg1 [ arg2 [ ... ] ] 
    run cmd with arguments provided. 

    This utility can make it easier to use boothooks or bootcmd 
    on a per "once" or "always" basis. 

    If frequency is: 
     * once: run only once (do not re-run for new instance-id) 
     * instance: run only the first boot for a given instance-id 
     * always: run every boot 
+0

Resmi belgelerindeki karşılık gelen atıflarla birlikte yanıtı güncelleştirin ve yalnızca referans için orijinal belgelere bağlı –

+1

Bootcmd kısmı, tam olarak başlatılmayan ve beklendiği gibi çalışmayabilen bir sistemde yürütülür. – Nico

0

Ben neredeyse iki gün boyunca bu konu ile mücadele ı bulmak ve son olarak verebilir tüm çözümleri çalıştı çok sayıda yaklaşımı birleştirerek, aşağıdaki ile geldi: Bu

MyResource: 
    Type: AWS::EC2::Instance 
    Metadata: 
    AWS::CloudFormation::Init: 
     configSets: 
     setup_process: 
      - "prepare" 
      - "run_for_instance" 
     prepare: 
     commands: 
      01_apt_update: 
      command: "apt-get update" 
      02_clone_project: 
      command: "mkdir -p /replication && rm -rf /replication/* && git clone https://github.com/awslabs/dynamodb-cross-region-library.git /replication/dynamodb-cross-region-library/" 
      03_build_project: 
      command: "mvn install -DskipTests=true" 
      cwd: "/replication/dynamodb-cross-region-library" 
      04_prepare_for_west: 
      command: "mkdir -p /replication/replication-west && rm -rf /replication/replication-west/* && cp /replication/dynamodb-cross-region-library/target/dynamodb-cross-region-replication-1.2.1.jar /replication/replication-west/replication-runner.jar" 
     run_for_instance: 
     commands: 
      01_run: 
      command: !Sub "java -jar replication-runner.jar --sourceRegion us-east-1 --sourceTable ${TableName} --destinationRegion ap-southeast-1 --destinationTable ${TableName} --taskName -us-ap >/dev/null 2>&1 &" 
      cwd: "/replication/replication-west" 
    Properties: 
    UserData: 
     Fn::Base64: 
     !Sub | 
      #cloud-config 
      cloud_final_modules: 
      - [scripts-user, always] 
      runcmd: 
      - /usr/local/bin/cfn-init -v -c setup_process --stack ${AWS::StackName} --resource MyResource --region ${AWS::Region} 
      - /usr/local/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource MyResource --region ${AWS::Region} 

DynamoDb çapraz bölge çoğaltma işlemi için kurulum.