Задача: добавить в CloudFormation шаблон установку git
и cron
-задачу.
Быстрый пример работы с UserData
в CloudFormation шаблоне.
Ресурс AWS::EC2::Instance
сейчас выглядит так:
... "EC2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "Tags" : [ {"Key" : "Name", "Value" : { "Fn::Join" : [ "-", [ {"Ref" : "AWS::StackName"}, "ec2"] ] } }, {"Key" : "Env", "Value" : {"Ref" : "AWS::StackName"} }, {"Key" : "Client", "Value" : {"Ref" : "ClientTag"} } ], "InstanceType" : { "Ref" : "EC2InstanceType" }, "SecurityGroupIds" : [ { "Ref": "EC2SecurityGroup" } ], "KeyName" : { "Ref" : "EC2KeyName" }, "ImageId" : { "Ref" : "EC2AMIID" }, "AvailabilityZone" : { "Fn::FindInMap" : [ "SubnetsAZs", "public-subnets", "EC2PublicSubnet1a" ] }, "SubnetId": { "Ref" : "EC2PublicSubnet" }, } }, ...
Содержание
Установка git
Добавляем параметр UserData
и установку git
:
... "SubnetId": { "Ref" : "EC2PublicSubnet" }, "UserData" : { "Fn::Base64" : { "Fn::Join" : ["\n", [ "#!/bin/bash -v", "apt-get update", "apt-get -y install git" ]]}} } }, ...
Запускаем, проверяем:
[simterm]
$ ssh -i ads-ec2.pem ubuntu@54.***.***.91 'git --version' git version 2.7.4
[/simterm]
Добавление cron-задачи
Аналогично – добавим crontask.
cron
задач будет несколько, поэтому добавим их из файла.
Проверяем на рабочей машине:
[simterm]
$ cd /tmp/ $ echo "* * * * * echo test" >> crontests.txt $ crontab crontests.txt $ crontab -l * * * * * echo test
[/simterm]
Добавляем её в CloudFormation шаблон:
... "UserData" : { "Fn::Base64" : { "Fn::Join" : ["\n", [ "#!/bin/bash -v", "apt-get update", "apt-get -y install git", "echo \"* * * * * /bin/echo testcrontask1\" >> /root/crontasks", "/usr/bin/crontab /root/crontasks" ]]}} ...
Пересоздаём стек, проверяем на интансе:
[simterm]
$ ssh -i ../../../credentials/aws/ads-ec2.pem ubuntu@184.***.***.64 sudo crontab -l * * * * * /bin/echo testcrontask1
[/simterm]
Повторный запуск UserData
Помните, что UserData выполняется только при создании интанса.
О том, что скрипт был выполнен – CloudInit заносит запись в каталог sem
(от semaphore):
[simterm]
root@ip-10-0-2-8:~# cat /var/lib/cloud/instances/i-0fe563bba7c0b2426/sem/config_scripts_user 1360: 1520316115.5601585
[/simterm]
Описание всех каталогов есть тут>>>.
Если интанс просто остановить, и изменить UserData, например через AWS Console – то изменения не будут применены.
Проверяем:
Запускаем, и:
[simterm]
root@ip-10-0-2-8:~# crontab -l * * * * * /bin/echo testcrontask1
[/simterm]
Задача не изменилась, семафор – тоже:
[simterm]
root@ip-10-0-2-8:~# cat /var/lib/cloud/instances/i-0fe563bba7c0b2426/sem/config_scripts_user 1360: 1520316115.5601585
[/simterm]
Хотя задача для CloudInit обновилась:
[simterm]
root@ip-10-0-2-8:~# grep -r test /var/lib/cloud/ /var/lib/cloud/instances/i-0fe563bba7c0b2426/scripts/part-001:echo "* * * * * /bin/echo testcrontask2" >> /root/crontasks /var/lib/cloud/instances/i-0fe563bba7c0b2426/user-data.txt:echo "* * * * * /bin/echo testcrontask2" >> /root/crontasks /var/lib/cloud/instances/i-0fe563bba7c0b2426/user-data.txt.i:echo "* * * * * /bin/echo testcrontask2" >> /root/crontasks
[/simterm]
ОК – удаляем файл /var/lib/cloud/instances/i-0fe563bba7c0b2426/sem/config_scripts_user
, и перезапускаем инстанс:
[simterm]
root@ip-10-0-2-8:~# rm /var/lib/cloud/instances/i-0fe563bba7c0b2426/sem/config_scripts_user root@ip-10-0-2-8:~# reboot Connection to 184.***.***.64 closed by remote host. Connection to 184.***.***.64 closed.
[/simterm]
После перезапуска – проверяем:
[simterm]
... Last login: Tue Mar 6 06:32:40 2018 from 188.***.***.114 ubuntu@ip-10-0-2-8:~$ sudo -s root@ip-10-0-2-8:~# crontab -l * * * * * /bin/echo testcrontask2
[/simterm]
Готово.