配置云服务器开机自动化脚本

需求分析

  1. 云服务器有两个 docker 容器,由于服务器会停机,需要在开机的时候能够自动启动;
  2. 服务器停机,可能导致公网 ip 改变,其中一个容器是源码部署,需要配置连接宿主机即服务器上的 MySQL 服务,所以配置文件中 MySQL 的 ip 的值需要填入每次开机后的实际公网 ip;
  3. 停机或重启前,执行停机服务,优雅地停止 docker,最后再停机。

解决方案

  1. 针对需求 a、c,需要注册两个 service 服务,创建 systemd 服务单元文件,放入到/etc/systemd/system/,分别为start.servicestop-docker.service,这个两个服务分别在服务器启动后、停机前自动执行;
  2. 上述两个服务,执行特定的脚本,start.service执行的是start.shstop-docker.service执行stop.sh
  3. start.sh中,首先获取当前服务器的公网 ip,然后替换掉配置文件中的变量 HOST_IP,最后启动两个容器
  4. stop.sh 中,停止所有正在运行的容器。

具体执行

列出比较关键的两步,获取公网 ip,以及替换变量

代码语言:bash
复制
# 获取宿主机公网IP地址
IP=$(curl -s http://100.100.100.200/latest/meta-data/eipv4)

替换配置文件中 IP 为宿主机公网 IP 地址

sed -i "s/{{HOST_IP}}/IP/g" CONFIG_FILE

创建 systemd 服务单元文件,格式如下,主要分为三个部分 [Unit]、[Service]、[Install]

代码语言:vim
复制
# start.service
[Unit]
Description=Java Application
After=network.target

[Service]
Type=simple
ExecStart=/yourpath/to/start.sh
Restart=on-failure
User=YOURUSER
WorkingDirectory=/yourpath/to

[Install]
WantedBy=multi-user.target

stop-docker.service

[Unit]
Description=Stop Docker Containers
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target

[Service]
Type=oneshot
ExecStart=/opt/dataease2.0/stop.sh

[Install]
WantedBy=halt.target reboot.target shutdown.target

收获

  1. 第一次接触到自动化脚本工具,并使用其解决需求;
  2. 需要进一步熟悉 Linux 命令行,以及思考命令行背后的逻辑,对 systemctl 命令控制的那些服务都不熟悉;