cloudformation-init::services 中的“支持的服务”是什么?

cloudformation-init::services 中的“支持的服务”是什么?

我正在尝试从 cloudformation::init 脚本启动自定义守护程序。/etc/init.d/myservice 功能齐全;如果我在 cfn-init 完成后登录,

sudo service myservice start

表现符合预期。

我能看到两种方法可以直接从 cloudformation 脚本启动它,但我似乎无法让其中任何一种方法工作:(1) 使用 cfn-init::services 结构 (2) 使用 cfn-init::command 手动启动脚本。

(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 服务中似乎有些东西丢失了,因为配置中的这一步从未完成,从而阻止了任何其他配置集运行。在 config1 中安装 /opt 有点不相关,我将其包括在内是为了在日志中显示完成的命令是什么样子。因此,相关配置将是:

"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

再次,从命令提示符开始,服务命令产生一个正在运行的服务和预期的输出:

bash-4.1$ sudo service myservice start
Starting MyService: STARTED MyService Thu Apr 16 06:58:27 EDT 2015
-bash-4.1$

cfn-init 寻求什么样的回报?

谢谢!

答案1

您的服务部分的语法不太正确,即

"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"
         }
    }
}

希望这能起到作用!

相关内容