Jak skonfigurować cloud-init na niestandardowych AMIs w AWS? (CentOS)

Definiowanie danych użytkownika dla instancji w AWS wydaje się bardzo przydatne do wykonywania wszelkiego rodzaju akcji typu bootstrap. Niestety, muszę użyć niestandardowego CentOS AMI, który nie pochodzi z jednego z dostarczonych AMIs ze względów PCI, więc cloud-init nie jest jeszcze zainstalowany i skonfigurowany. Naprawdę chcę tylko, aby ustawić nazwę hosta i uruchomić mały skrypt bash. Jak to działa?

Author: whereswalden, 2014-05-01

3 answers

Cloud-init jest bardzo potężnym, ale bardzo nieudokumentowanym narzędziem. Nawet po zainstalowaniu, domyślnie jest wiele aktywnych modułów, które nadpisują rzeczy, które możesz już zdefiniować W AMI. Oto instrukcje dotyczące minimalnej konfiguracji od zera:

Instrukcje

  1. Zainstaluj cloud-init ze standardowego repozytorium. Jeśli martwisz się o PCI, prawdopodobnie nie chcesz używać niestandardowych repozytoriów AWS.

    # rpm -Uvh https://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
    # yum install cloud-init
    
  2. Edycja /etc/cloud/cloud.cfg, Plik yaml, aby odzwierciedlić żądaną konfigurację. Poniżej znajduje się minimalna konfiguracja z dokumentacją dla każdego modułu.

    #If this is not explicitly false, cloud-init will change things so that root
    #login via ssh is disabled. If you don't want it to do anything, set it false.
    disable_root: false
    
    #Set this if you want cloud-init to manage hostname. The current
    #/etc/hosts file will be replaced with the one in /etc/cloud/templates.
    manage_etc_hosts: true
    
    #Since cloud-init runs at multiple stages of boot, this needs to be set so
    #it can log in all of them to /var/log/cloud-init.
    syslog_fix_perms: null
    
    #This is the bit that makes userdata work. You need this to have userdata
    #scripts be run by cloud-init.
    datasource_list: [Ec2]
    datasource:
      Ec2:
        metadata_urls: ['http://169.254.169.254']
    
    #modules that run early in boot
    cloud_init_modules:
     - bootcmd  #for running commands in pre-boot. Commands can be defined in cloud-config userdata.
     - set-hostname  #These 3 make hostname setting work
     - update-hostname
     - update-etc-hosts
    
    #modules that run after boot
    cloud_config_modules:
     - runcmd  #like bootcmd, but runs after boot. Use this instead of bootcmd unless you have a good reason for doing so.
    
    #modules that run at some point after config is finished
    cloud_final_modules:
     - scripts-per-once  #all of these run scripts at specific events. Like bootcmd, can be defined in cloud-config.
     - scripts-per-boot
     - scripts-per-instance
     - scripts-user
     - phone-home  #if defined, can make a post request to a specified url when done booting
     - final-message  #if defined, can write a specified message to the log
     - power-state-change  #can trigger stuff based on power state changes
    
    system_info:
      #works because amazon's linux AMI is based on CentOS
      distro: amazon
    
  3. Jeśli w /etc/cloud/cloud.cfg.d/ znajduje się defaults.cfg, usuń go.

  4. Aby skorzystać z tej konfiguracji, zdefiniuj następujące dane użytkownika dla nowych instancji:

    #cloud-config
    hostname: myhostname
    fqdn: myhostname.mydomain.com
    runcmd:
     - echo "I did this thing post-boot"
     - echo "I did this too"
    

    Możesz również po prostu uruchomić skrypt bash, zastępując #cloud-config na #!/bin/bash i umieszczając skrypt bash w treści, ale jeśli to zrobisz, powinieneś usunąć wszystkie moduły związane z nazwą hosta z cloud_init_modules.


Uwagi Dodatkowe

Zauważ, że jest to minimalna konfiguracja, a cloud-init jest w stanie zarządzać użytkownikami, kluczami ssh, punktami montowania itp. Zapoznaj się z poniższymi referencjami, aby uzyskać więcej dokumentacji na temat tych konkretnych funkcji.

Ogólnie wydaje się, że cloud-init robi rzeczy w oparciu o określone moduły. Niektóre moduły, takie jak "disable-ec2-metadane", robią różne rzeczy po prostu poprzez ich podanie. Inne, np. "runcmd", robią rzeczy tylko wtedy, gdy ich parametry są określone, albo w chmurze.cfg, lub w Cloud-config userdata. Większość poniższej dokumentacji mówi tylko o tym, jakie parametry są możliwe dla każdego modułu, a nie o tym, jak moduł się nazywa, ale o domyślnej chmurze.cfg powinien mieć pełną listę modułów na początek. Najlepszym sposobem, jaki znalazłem, aby wyłączyć moduł, jest po prostu usunięcie go z listy.

W niektórych przypadkach "rhel "może działać lepiej dla tagu" distro "niż"amazon". Jeszcze się nie zorientowałem. kiedy.


Referencje

 48
Author: whereswalden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-21 17:30:15

Jeśli ktoś próbuje stworzyć CentOS AMI, które jest włączone cloud-init (i może faktycznie wykonywać skrypty CloudFormation), może odnieść sukces wykonując następujące czynności:

  1. Uruchom marketplace CentOS AMI w / aktualizacje-upewnij się, że cloud-init jest obecny lub sudo yum install -y cloud-init
  2. rm -rf /var/lib/cloud/data
  3. rm -rf /var/lib/cloud/instance
  4. rm -rf /var/lib/cloud/instances/*
  5. zastąp /etc/cloud/cloud.cfg konfiguracją w odpowiedzi powyżej, ale upewnij się, że ustawiłeś distro: rhel
  6. Dodaj pomocników CloudFormation (http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-helper-scripts-reference.html)
  7. Utwórz obraz AMI z tej instancji

Miałem kawał czasu próbując dowiedzieć się, dlaczego moje dane użytkownika nie były wywoływane, dopóki nie zdałem sobie sprawy, że obrazy na rynku naturalnie uruchamiają Twoje dane użytkownika tylko raz na instancję i oczywiście już były uruchamiane. Usunięcie wskaźników, które miały już zostało wykonane wraz ze zmianą distro: rhel w pliku cloud.cfg załatwiło sprawę.

dla ciekawskich wartość distro: powinna odpowiadać jednemu ze skryptów Pythona w /usr/lib/python2.6/site-packages/cloudinit/distros. Okazuje się, że AMI, które uruchomiłem, nie miało amazon.py, więc musisz użyć rhel dla CentOS. W zależności od uruchomionego AMI i wersji cloud-init, YMMV.

 5
Author: bigfoot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-10 21:31:17

Oto krótki tutorial jak uruchamiać skrypty podczas uruchamiania przy użyciu cloud-init na AWS EC2 (CentOS).

Ten tutorial wyjaśnia:

  • Jak ustawić plik konfiguracyjny /etc/cloud/cloud.cfg
  • jak ścieżka chmury /var/lib/cloud/scripts wygląda jak
  • pliki skryptów Pod ścieżką chmury za pomocą przykładu i
  • Jak sprawdzić, czy pliki skryptów są wykonywane podczas uruchamiania instancji

Plik konfiguracyjny

Poniższy plik konfiguracyjny znajduje się na AWS CentOS6. Dla Amazon Linux, zobacz tutaj .

# cat /etc/cloud/cloud.cfg
manage_etc_hosts: localhost
user: root
disable_root: false
ssh_genkeytypes: [ rsa, dsa ]

cloud_init_modules:
 - resizefs
 - update_etc_hosts
 - ssh

cloud_final_modules:
 - scripts-per-once
 - scripts-per-boot
 - scripts-per-instance
 - scripts-user

Drzewo Katalogów

Oto co ścieżka chmury /var/lib/cloud/scripts wygląda jak:

# cd /var/lib/cloud/scripts
# tree `pwd`
/var/lib/cloud/scripts
├── per-boot
│     └── per-boot.sh
├── per-instance
│     └── per-instance.sh
└── per-once
       └── per-once.sh

Zawartość plików skryptów

Oto zawartość przykładowych plików skryptów.
Pliki muszą znajdować się w user root. Zobacz mój sposób na tworzenie Boota skrypt .

# cat /var/lib/cloud/scripts/per-boot/per-boot.sh
#!/bin/sh
echo per-boot: `date` >> /tmp/per-xxx.txt

# cat /var/lib/cloud/scripts/per-instance/per-instance.sh
#!/bin/sh
echo per-instance: `date` >> /tmp/per-xxx.txt

# cat /var/lib/cloud/scripts/per-once/per-once.sh   
#!/bin/sh
echo per-once: `date` >> /tmp/per-xxx.txt

Wynik wykonania

W przypadku początkowego rozruchu

# cat /tmp/per-xxx.txt
per-once: 1 January 3, 2013 Thursday 17:30:16 JST 
per-boot: 1 January 3, 2013 Thursday 17:30:16 JST 
per-instance: 1 January 3, 2013 Thursday 17:30:16 JST

W przypadku restartu

# cat /tmp/per-xxx.txt
per-once: 1 January 3, 2013 Thursday 17:30:16 JST 
per-boot: 1 January 3, 2013 Thursday 17:30:16 JST 
per-instance: 1 January 3, 2013 Thursday 17:30:16 JST 
per-boot: 1 January 3, 2013 Thursday 17:32:24 JST

W przypadku startu od W AMI

# cat /tmp/per-xxx.txt
per-once: 1 January 3, 2013 Thursday 17:30:16 JST 
per-boot: 1 January 3, 2013 Thursday 17:30:16 JST 
per-instance: 1 January 3, 2013 Thursday 17:30:16 JST 
per-boot: 1 January 3, 2013 Thursday 17:32:24 JST 
per-boot: 1 January 3, 2013 Thursday 17:44:08 JST

Bibliografia
w tym czasie skrypt jest uruchamiany w chmurze-INIT (CentOS6) został zbadany (przetłumaczony)

 4
Author: Chetabahana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-12 07:23:27