Скрипты пользовательских данных не работают на моем пользовательском AMI, но работают в стандартном Amazon Linux

За эти несколько дней я много раз обыскивал тему "скрипт пользовательских данных не работает", но до сих пор я еще не получил ни малейшего представления о моем случае, пожалуйста, помогите мне выяснить, что произошло, спасибо много!

Согласно объяснения пользовательских данных , AWS

  

Когда вы запускаете экземпляр в Amazon EC2, у вас есть возможность передавать пользовательские данные в экземпляр, который можно использовать для выполнения общих задач автоматической настройки и даже запуска сценариев после запуска экземпляра.

Поэтому я попытался передать свои собственные пользовательские данные при запуске экземпляра, это мои пользовательские данные:

\#!/bin/bash

echo 'test' > /home/ec2-user/user-script-output.txt

Но в этом пути нет файла: /home/ec2-user/user-script-output.txt

Я проверил /var/lib/cloud/instance/user-data.txt, файл существует и такой же, как мой скрипт пользовательских данных.

Также я проверил журнал в /var/log/cloud-init.log, сообщения об ошибках нет.

Но скрипт пользовательских данных работает, если я запускаю новый экземпляр с Amazon linux (2014.09.01), но я не уверен, в чем разница между моим AMI (на основе Amazon linux) и Amazon linux.

Единственная другая часть, которую я видел, - это если я запускаю этот скрипт:

sudo yum list installed | grep cloud-init

Мой AMI:

  

cloud-init.noarch 0.7.2-8.33.amzn1 @ amzn-main

Amazon linux:

  

cloud-init.noarch 0.7.2-8.33.amzn1 установлен

Я не уверен, что это причина?

Если вам нужна дополнительная информация, я рад предоставить ее, пожалуйста, дайте мне знать, что произошло в моем собственном AMI и как это исправить?

большое спасибо

Обновление

Только что нашел ответ от этого пост ,

Если я добавлю # cloud-boothook в начало файла пользовательских данных, это сработает!

#cloud-boothook
#!/bin/bash
echo 'test' > /home/ec2-user/user-script-output.txt

Но все еще не уверен почему.

33 голоса | спросил Kai 23 72014vEurope/Moscow11bEurope/MoscowSun, 23 Nov 2014 10:32:57 +0300 2014, 10:32:57

6 ответов


0

User_data запускается только при первом запуске. Поскольку ваше изображение является пользовательским, я полагаю, что оно уже было запущено один раз, и поэтому user_data деактивирован.

Для окон это можно сделать, установив флажок в Сервисах Ec2. Свойства . Сейчас я смотрю, как это сделать автоматически в конце создания пользовательского изображения.

В Linux, я полагаю, механизм тот же, и user_data необходимо повторно активировать в вашем пользовательском изображении.

#cloud-boothook заставляет его работать, потому что он меняет скрипт на user_data механизм для облачного загрузочного крючка тот, который запускается при каждом запуске.


РЕДАКТИРОВАТЬ:

Вот код для повторной активации запуска в Windows с помощью powershell:

$configFile = "C:\\Program Files\\Amazon\\Ec2ConfigService\\Settings\\Config.xml"
[xml] $xdoc = get-content $configFile
$xdoc.SelectNodes("//Plugin") |?{ $_.Name -eq "Ec2HandleUserData"} |%{ $_.State = "Enabled" }
$xdoc.SelectNodes("//Plugin") |?{ $_.Name -eq "Ec2SetComputerName"} |%{ $_.State = "Enabled" }
$xdoc.OuterXml | Out-File -Encoding UTF8 $configFile

$configFile = "C:\\Program Files\\Amazon\\Ec2ConfigService\\Settings\\BundleConfig.xml"
[xml] $xdoc = get-content $configFile
$xdoc.SelectNodes("//Property") |?{ $_.Name -eq "AutoSysprep"} |%{ $_.Value = "Yes" }
$xdoc.OuterXml | Out-File -Encoding UTF8 $configFile

(я знаю вопрос фокуса linux, но это может помочь другим ...)

ответил Thibault Deheurles 1 J0000006Europe/Moscow 2016, 10:46:52
0

Как я уже проверял, в каталоге /var/lib/cloud были некоторые данные начальной загрузки. После того как я очистил этот каталог, скрипт Пользовательские данные работал нормально.

rm -rf /var/lib/cloud/*
ответил jkim 12 AMpSun, 12 Apr 2015 01:01:19 +030001Sunday 2015, 01:01:19
0

Я использую CentOS, и логика для пользовательских данных проста:

  • В файле /etc/rc.local есть вызов для сценария initial.sh, но сначала он ищет флаг:

    if [ -f /var/tmp/initial ]; then
        /var/tmp/initial.sh &
    fi
    

initial.sh - это файл, который выполняет пользовательские данные, но в конце концов удаляет флаг. Итак, если вы хотите, чтобы ваш новый AMI снова выполнял пользовательские данные, просто создайте флаг снова, прежде чем создавать образ:

touch /var/tmp/initial
ответил Pedreiro 13 AMpThu, 13 Apr 2017 05:15:02 +030015Thursday 2017, 05:15:02
0

Я также столкнулся с той же проблемой в Ubuntu 16.04 hvm AMI. Я поднял вопрос о поддержке AWS, но все же не смог найти точную причину /ошибку, которая на нее влияет.

Но все же у меня есть кое-что, что может вам помочь.

  

Перед тем как взять AMI, удалите каталог /var /lib /cloud (каждый раз). Затем при создании образа установите его без перезагрузки.

Если эти вещи все еще не работают, вы можете проверить это дальше, заставив пользовательские данные запускаться вручную. Также tailf /var/log/cloud-init-output.log для статуса облачной инициализации. Он должен заканчиваться чем-то вроде модулей: final, чтобы ваши пользовательские данные запускались. Он не должен застрять на модулях: config.

sudo rm -rf /var/lib/cloud/* sudo cloud-init init sudo cloud-init modules -m final

Я понятия не имею, будут ли вышеуказанные команды работать на CentOS или нет. Я проверил это на Ubuntu.

В моем случае я также попытался удалить каталог /var /lib /cloud, но в нашем случае он не смог выполнить пользовательские данные. Но я придумал другое решение для этого. Мы создали скрипт с вышеприведенными командами и заставили его запускаться во время загрузки системы.

Я добавил строку ниже в /etc/rc.local, чтобы это произошло.

sudo bash /home/ubuntu/force-user-data.sh || exit 1

Но здесь есть одна загвоздка: он будет запускать скрипт при каждой загрузке, поэтому ваши пользовательские данные будут запускаться при каждой загрузке, как # cloud-boothook. Не беспокойтесь, вы можете просто настроить его, просто удалив сам файл force-user-data.sh в конце. Так что ваш force-user-data.sh будет выглядеть примерно так

#!/bin/bash sudo rm -rf /var/lib/cloud/* sudo cloud-init init sudo cloud-init modules -m final sudo rm -f /home/ubuntu/force-user-data.sh exit 0

Я буду признателен, если кто-то может подсказать, почему он не может выполнить пользовательские данные.

ответил Sagar Ghuge 4 Maypm17 2017, 15:40:26
0

У меня было много проблем с этим. Я предоставлю подробную прогулку.

Я добавил, что я использую terraform для создания экземпляров хостов через конфигурацию запуска и группу автоматического масштабирования.

Я НЕ смог заставить его работать, добавив скрипт в lc.tf

user_data                   = DATA <<
"
#cloud-boothook
#!/bin/bash
echo 'some crap'\'
"
DATA

Я могу получить его из пользовательских данных,

wget http://169.254.169.254/latest/user-data

но заметил, что я получаю его с кавычками в нем.

Вот как я заставил это работать: я вместо этого перешел к извлечению из шаблона, поскольку то, что вы видите, это то, что вы получаете.

user_data                   = "${data.template_file.bootscript.rendered}"

Это означает, что мне также нужно объявить мой файл шаблона следующим образом:

data "template_file" "bootscript" {
  template = "${file("bootscript.tpl")}"

}

Но я все еще получаю сообщение об ошибке в облачных журналах инициализации /var/log/cloud-init.log [ПРЕДУПРЕЖДЕНИЕ]: необработанные пользовательские данные не из нескольких частей (text /x-not-multipart): 'Content-Type: text /cloud ...'

Затем я обнаружил эту статью о пользователе, выполняющем форматирование данных пользователя Это имеет смысл, если пользовательские данные могут входить в несколько частей, возможно, cloud-init нужны команды cloud-init в одном месте, а скрипт - в другом.

Итак, мой bootscript.tpl выглядит так:

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
echo "some crap"
--//
ответил jorfus 3 FebruaryEurope/MoscowbSat, 03 Feb 2018 01:40:38 +0300000000amSat, 03 Feb 2018 01:40:38 +030018 2018, 01:40:38
0

Данные пользователя должны нормально выполняться без использования #cloud-boothook (которое используется для активации данных пользователя на как можно раньше во время процесса загрузки).

Я запустил новый Amazon Linux AMI и использовал ваши данные пользователя, а также немного больше:

#!/bin/bash

echo 'bar' > /tmp/bar
echo 'test' > /home/ec2-user/user-script-output.txt
echo 'foo' > /tmp/foo

Это успешно создало три файла.

Сценарии пользовательских данных выполняются как root, поэтому у него должно быть разрешение на создание файлов в любом месте.

Я заметил, что в предоставленном вами коде один пример относится к /home/ec2-user/user-script/output.txt (с подкаталогом), а один пример относится к /home/ec2-user/user-script-output.txt (без подкаталога). Понятно, что команда потерпит неудачу, если вы попытаетесь создать файл в несуществующем каталоге, но ваш пример «Обновления», кажется, показывает, что он действительно работает.

ответил John Rotenstein 23 72014vEurope/Moscow11bEurope/MoscowSun, 23 Nov 2014 15:05:08 +0300 2014, 15:05:08

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132