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?
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
-
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
-
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
Jeśli w
/etc/cloud/cloud.cfg.d/
znajduje siędefaults.cfg
, usuń go.-
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 zcloud_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
- Jak zainstalować cloud-init: http://web.archive.org/web/20140925130743/http://docs.openstack.org/grizzly/openstack-image/content/centos-image.html
- odniesienie do modułów (niekompletne): http://cloudinit.readthedocs.org/en/latest/topics/examples.html
- odniesienie do modułów (niekompletne): https://github.com/number5/cloud-init/blob/master/doc/examples/cloud-config.txt
- ogólne instrukcje konfiguracji:http://web.archive.org/web/20150110200930/http://www.scalehorizontally.com/2013/02/24/introduction-to-cloud-init
- Zarządzanie nazwą hosta: http://web.archive.org/web/20140805225413/http://docs.openstack.org/user-guide/content/user-data.html
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:
- Uruchom marketplace CentOS AMI w / aktualizacje-upewnij się, że cloud-init jest obecny lub
sudo yum install -y cloud-init
rm -rf /var/lib/cloud/data
rm -rf /var/lib/cloud/instance
rm -rf /var/lib/cloud/instances/*
- zastąp
/etc/cloud/cloud.cfg
konfiguracją w odpowiedzi powyżej, ale upewnij się, że ustawiłeśdistro: rhel
- Dodaj pomocników CloudFormation (http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-helper-scripts-reference.html)
- 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.
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)
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