Я пытаюсь запустить собственный демон из сценария cloudformation :: init. /Etc/init.d/myservice полностью функционален; если я вхожу в систему после завершения cfn-init,
sudo service myservice start
ведет себя как положено.
Я вижу два способа запустить это непосредственно из сценария облачной информации, и я не могу заставить ни один из них работать: (1) Использование структуры cfn-init :: services (2) запуск сценария вручную с помощью команда cfn-init ::.
(1) это соответствующая часть config.json как службы:
"Metadata": {
"AWS::CloudFormation::Init": {
"configSets": {
"ascending": [
"config5"
],
"default": [
"config5"
]
},
"config5": {
"services": {
"myservice": {
"enabled": "true",
"ensureRunning": "true"
}
}
}
}
}
Что вызывает ошибку:
2015-04-16 06:24:25,541 [INFO] -----------------------Starting build-----------------------
2015-04-16 06:24:25,856 [INFO] Running configSets: ascending
2015-04-16 06:24:25,856 [INFO] Running configSet ascending
2015-04-16 06:24:49,942 [INFO] Running config config5
2015-04-16 06:24:49,942 [WARNING] Unsupported service manager: myservice
2015-04-16 06:24:49,945 [INFO] ConfigSets completed
2015-04-16 06:24:49,949 [INFO] -----------------------Build complete-----------------------
Это создает / не создает работающую службу - она не дает сбоев, она просто никогда не запускается. Похоже, здесь есть предварительные условия для установки, которые я не могу найти в документации. Пакеты, установленные Yum (nginx, tomcat и т. Д.), Запускаются без предупреждений.
(2) Запуск службы вручную работает в том смысле, что служба запускается. Однако служба запускается как собственный пользователь, и что-то, кажется, теряется в службе cfn, поскольку этот шаг в настройке никогда не завершается, что не позволяет запускать любые другие наборы конфигурации. Монтирование / opt в config1 немного несущественно, я включил его, чтобы показать, какие завершенные команды выглядят в журналах. Таким образом, соответствующая конфигурация будет:
"Metadata": {
"AWS::CloudFormation::Init": {
"configSets": {
"ascending": [
"config1",
"config5"
],
"default": [
"config5"
]
},
"config1": {
"commands": {
"mount1": {
"command": "umount /dev/xvdc"
},
"mount2": {
"command": "mount /dev/xvdc /opt"
}
}
},
"config5": {
"commands": {
"first_launch": {
"command": "/etc/init.d/myservice start"
}
}
}
}
}
Что производит журнал:
2015-04-16 06:24:25,541 [INFO] -----------------------Starting build-----------------------
2015-04-16 06:24:25,856 [INFO] Running configSets: ascending
2015-04-16 06:24:25,856 [INFO] Running configSet ascending
2015-04-16 06:24:25,860 [INFO] Running config config1
2015-04-16 06:24:25,876 [INFO] Command mount1 succeeded
2015-04-16 06:24:25,901 [INFO] Command mount2 succeeded
2015-04-16 06:24:49,942 [INFO] Running config config5
Опять же, из командной строки команда service создает работающую службу и ожидаемый результат:
bash-4.1$ sudo service myservice start
Starting MyService: STARTED MyService Thu Apr 16 06:58:27 EDT 2015
-bash-4.1$
Какой возврат ищет cfn-init?
Спасибо!
Синтаксис раздела ваших услуг не совсем правильный, т.е.
"services": {
"myservice": {
"enabled": "true",
"ensureRunning": "true"
}
}
Если вы посмотрите документацию http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-init.html#aws-resource-init-services Здесь утверждается ...
Вы можете использовать ключ services, чтобы определить, какие службы должны быть включены или отключены при запуске экземпляра. В системах Linux этот ключ поддерживается с помощью sysvinit
. В системах Windows это поддерживается с помощью windows
Менеджер по обслуживанию.
Поскольку вы используете систему Linux, ваша "services"
раздел должен выглядеть так ...
"services": {
"sysvinit" : {
"myservice": {
"enabled": "true",
"ensureRunning": "true"
}
}
}
Надеюсь, это поможет!