Ubuntu 16.04下AWS CloudFormation cfn-hup默认启动级别启动失败求助
先看你的错误日志,核心问题是systemd在处理cfn-hup服务时,发现/etc/init.d/里有一个无LSB标签的cfn-hup软链接,导致尝试用sysvinit方式启用时失败——Ubuntu 16.04默认用systemd,但你同时配置了sysvinit风格的链接和systemd的service文件,两种服务管理方式冲突,才触发了这个错误。
问题根源拆解
你在UserData里做了这一步:
ln -s /usr/local/bin/cfn-hup /etc/init.d/
这会让系统误以为cfn-hup是一个sysvinit脚本,但这个软链接没有标准的LSB头部(包含Default-Start等必要配置),所以执行systemctl enable时,系统会调用sysv-install工具,进而触发update-rc.d的错误。同时你在cfn-init的services里又配置了sysvinit下的cfn-hup,进一步混淆了服务管理逻辑。
具体修复步骤
1. 删除多余的sysvinit软链接
移除UserData中以下几行,因为我们已经通过cfn-init创建了systemd的service文件,不需要再链接到/etc/init.d/:
ln -s /usr/local/bin/cfn-hup /etc/init.d/ chmod 775 /etc/init.d/cfn-hup chown root:root /etc/init.d/cfn-hup
2. 修正cfn-init的服务配置
把services下的sysvinit配置改为systemd(适配Ubuntu 16.04的服务管理方式),同时可以删掉commands里手动执行systemctl enable/start的命令,让cfn-init自动处理服务的启用和启动:
修改后的AWS::CloudFormation::Init部分:
'AWS::CloudFormation::Init': configSets: SetupAppServer: - config1 config1: packages: apt: git: [] php: [] apache2: [] apt-transport-https: [] ca-certificates: [] curl: [] software-properties-common: [] # 移除手动执行systemctl的命令,交给services配置处理 files: /etc/cfn/cfn-hup.conf: content: !Join - '' - |- [main] stack= - !Ref 'AWS::StackName' - |- region= - !Ref 'AWS::Region' mode: '000400' owner: root group: root /etc/cfn/hooks.d/cfn-auto-reloader.conf: content: !Join - '' - | [cfn-auto-reloader-hook] - | triggers=post.update - > path=Resources.LaunchConfig.Metadata.AWS::CloudFormation::Init - 'action=/usr/local/bin/cfn-init -v --stack ' - !Ref 'AWS::StackName' - ' --resource AppServerInstanceLaunchConfig --region ' - !Ref 'AWS::Region' - '' - | runas=root /lib/systemd/system/cfn-hup.service: content: !Join - '' - | [Unit] - |+ Description=cfn-hup daemon - | [Service] - | Type=simple - | ExecStart=/usr/local/bin/cfn-hup - |+ Restart=always - | [Install] - WantedBy=multi-user.target services: sysvinit: apache2: enabled: true ensureRunning: true # 添加systemd下的cfn-hup配置,让cfn-init自动管理 systemd: cfn-hup: enabled: true ensureRunning: true files: - /lib/systemd/system/cfn-hup.service - /etc/cfn/cfn-hup.conf - /etc/cfn/hooks.d/cfn-auto-reloader.conf
3. 确认systemd service文件的正确性
你配置的/lib/systemd/system/cfn-hup.service是没问题的,[Install]段的WantedBy=multi-user.target已经对应了systemd的启动级别,不需要手动设置Default-Start。
为什么其他模板不需要手动修改启动级别?
那些模板要么是针对sysvinit系统(比如Ubuntu 14.04及更早)正确配置了带LSB头部的init脚本,要么是像我们上面这样,针对systemd系统纯用systemd service文件管理服务,没有混合两种服务管理方式,所以不会触发这个错误。
你的错误日志参考:
2018-01-17 11:58:36,562 P7799 [INFO] Command 01_enable_cfn_hup
2018-01-17 11:58:36,665 P7799 [INFO] -----------------------Command Output-----------------------
2018-01-17 11:58:36,665 P7799 [INFO] Synchronizing state of cfn-hup.service with SysV init with /lib/systemd/systemd-sysv-install...
2018-01-17 11:58:36,665 P7799 [INFO] Executing /lib/systemd/systemd-sysv-install enable cfn-hup
2018-01-17 11:58:36,665 P7799 [INFO] insserv: warning: script 'cfn-hup' missing LSB tags and overrides
2018-01-17 11:58:36,665 P7799 [INFO] update-rc.d: error: cfn-hup Default-Start contains no runlevels, aborting.
2018-01-17 11:58:36,665 P7799 [INFO] ------------------------------------------------------------
2018-01-17 11:58:36,665 P7799 [ERROR] Exited with error code 1
内容的提问来源于stack exchange,提问作者jasonwaiting

