关于服务器自动化配置的一些操作
自动化配置服务器,其本质就是
开机自动运行脚本
开机自动运行脚本的思路
1.以某一用户身份去登陆服务器,在linux系统下会默认运行用户家目录下的
.bashrc
配置文件2.linux或unix系统下,/etc/rc.d/rc.local 用于添加开机启动命令
问题:基于 Debian 的 Linux 系统默认支持 rc-local.service
服务,这个服务主要用来在系统启动时运行用户自定义的脚本命令等。只有在centos或Ubuntu16以下的才有。
3.对于docker容器内脚本自运行的方法,是在dockerFile 中用 ENTRYPOINT[/bin/bash,脚本]
docker-compose启动容器后执行脚本或命令不退出 | 运行内部程序
知道了以上的思路,我们想开机自动执行某脚本的思路是:
1.在
.bashrc
中执行对应脚本2./etc/rc.local是/etc/rc.d/rc.local的软连接,软连接相当于windows的快捷键
研究.bashrc
让我们来看一下阿里云ubuntu20.04
的默认.bashrc
,(我把其中的英文注释都翻译的一遍)
# ~.bashrc:由 bash(1) 为非登录 shell 执行。有关别名定义的示例,请参见 usrsharedocbashexamplesstartup-files(在 bash-doc 包中)。
# 您可能希望将所有添加到一个单独的文件中,例如 ~.bash_aliases,而不是直接在此处添加它们。
# 请参阅 bash-doc 包中的 usrsharedocbash-docexamples。
# 如果不以交互方式运行,则不要执行任何操作
[ -z "$PS1" ] && return
# 不要在历史记录中放置重复的行。有关更多选项,请参见 bash(1)
# ...或强制ignoreups和ignorespace
HISTCONTROL=ignoredups:ignorespace
# 追加到历史文件,不要覆盖它
shopt -s histappend
# 要设置历史长度,请参见 bash(1) 中的 HISTSIZE 和 HISTFILESIZE
HISTSIZE=1000
HISTFILESIZE=2000
# 检查每个命令后的窗口大小,如有必要,
# 更新 LINES 和 COLUMNS 的值。
shopt -s checkwinsize
# 对非文本输入文件更友好,请参阅lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
# 设置变量标识您工作的 chroot(在下面的提示中使用)
if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi
# 设置一个花哨的提示(非颜色,除非我们知道我们“想要”颜色)
case "$TERM" in
xterm-color) color_prompt=yes;;
esac
# 如果终端有能力,取消注释彩色提示;转身
# 默认关闭以不分散用户的注意力:终端窗口中的焦点
# 应该在命令的输出上,而不是在提示符上
# 强制颜色提示=是
if [ -n "$force_color_prompt" ]; then
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
# 我们有颜色支持;假设它符合 Ecma-48
# (ISOIEC-6429)。 (缺乏这样的支持是极其罕见的,而且这样的
# 案例倾向于支持 setf 而不是 setaf。)
color_prompt=yes
else
color_prompt=
fi
fi
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt
# 如果这是一个 xterm,则将标题设置为 user@host:dir
case "$TERM" in
xterm*|rxvt*)
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
;;
*)
;;
esac
# 启用 ls 的颜色支持并添加方便的别名
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
#别名 dir='dir --color=auto'
#别名 vdir='vdir --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi
# 更多 ls 别名
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
# ~.bashrc:由 bash(1) 为非登录 shell 执行。有关别名定义的示例,
# 请参见 usrsharedocbashexamplesstartup-files(在 bash-doc 包中)。
# 您可能希望将所有添加到一个单独的文件中,例如 ~.bash_aliases,
# 而不是直接在此处添加它们。请参阅 bash-doc 包中的 usrsharedocbash-docexamples。
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
# 启用可编程完成功能(您不需要启用,如果 /etc/bash.bashrc and /etc/profile/sources /etc/bash.bashrc 已经启用
#if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
# . /etc/bash_completion
#fi
下面是一段
.bashrc
详细的说明:
如果你运行一个基于 Unix 或者类 Unix 的操作系统,bash 很有可能是作为默认终端被安装的。虽然存在很多不同的 shell,bash 却是最常见或许也是最主流的。如果你不明白那意味着什么,bash 是一个能解释你输入进终端程序的东西,并且基于你的输入来运行命令。它在一定程度上支持使用脚本来定制功能
,这时候就要用到 .bashrc
了。
为了加载你的配置,bash 在每次启动时都会加载 .bashrc
文件的内容。每个用户的 home 目录都有这个 shell 脚本。它用来存储并加载你的终端配置和环境变量。
终端配置可以包含很多不同的东西。最常见的,.bashrc 文件包含用户想要用的别名。别名允许用户通过更短的名字或替代的名字来指向命令
,对于经常在终端下工作的人来说这可是一个省时利器。
总结.bashrc
的作用
1.配置命令的一些别名
2.配置颜色支持
3.在bash终端被启动时,执行文件中的一些shell语句
一个实际的案例
对于一个把所有服务都放在一个容器中的项目,启动项目需要运行多个环境
由于有多个需要一直启动的服务,所以需要通过shell来操作tmux,来同时运行多个服务
启动每个项目的脚本
runacapp
:
#! /bin/bash
# 教程:https://blog.csdn.net/woswod/article/details/80353254
# tmux kill-session -t acapp_workspace
USER_PASSWORD=当前用户的密码
USERNAME=当前用户的用户名
#项目路径
WORKDIR=/home/$USERNAME/acapp
TMUX_SESSION_NAME=acapp_workspace
#
cd $WORKDIR || exit
#su- $USERNAME
echo $USER_PASSWORD | sudo -S /etc/init.d/nginx start
echo $USER_PASSWORD | sudo -S redis-server /etc/redis/redis.conf
result=$(tmux ls | grep $TMUX_SESSION_NAME)
echo "$result"
#tmux每开一个窗口,相当于新开了一个bash,每新开一个bash,就会执行整个脚本
#所以每次执行脚本之前,应该判断一下这个脚本之前是否执行过,即判断tmux是否被创建出来
if [[ $result = "" ]]; then
#
cd $WORKDIR || exit
#su- $USERNAME
echo $USER_PASSWORD | sudo -S /etc/init.d/nginx start
echo $USER_PASSWORD | sudo -S redis-server /etc/redis/redis.conf
PROCESS=$(ps -ef | grep uwsgi)
for i in $PROCESS; do
case "$i" in
[1-9][0-9]*)
echo "Kill the process [ $i ]"
kill -9 $i
;;
*) ;;
esac
done
# 后台新建一个session
tmux new-session -d -s $TMUX_SESSION_NAME
#向选择的窗口发送指令
tmux send-keys -t $TMUX_SESSION_NAME "uwsgi --ini scripts/uwsgi.ini" C-m
#该命令会把当前工作区域分成左右两个小窗格,光标会移动到右面的窗口
tmux split-window -h
tmux send-keys -t $TMUX_SESSION_NAME "cd $WORKDIR/scripts" C-m
tmux send-keys -t $TMUX_SESSION_NAME "./compress_game_js.sh" C-m
#启动`django_channels`服务
#该命令 -t 后参数[session]:[window].[pane]; -v表示向右分割,-h表示向下分割
tmux split-window -t $TMUX_SESSION_NAME:0.0 -v
tmux send-keys -t $TMUX_SESSION_NAME "cd $WORKDIR" C-m
tmux send-keys -t $TMUX_SESSION_NAME "daphne -b 0.0.0.0 -p 5015 acapp.asgi:application" C-m
#多次切割后每个小窗口的编号会变化
#该命令会把当前工作区域分成左右两个小窗格,光标会移动到右面的窗口
tmux split-window -t $TMUX_SESSION_NAME:0.0 -v
tmux send-keys -t $TMUX_SESSION_NAME "cd match_system/src/" C-m
tmux send-keys -t $TMUX_SESSION_NAME "chmod +x main.py" C-m
tmux send-keys -t $TMUX_SESSION_NAME "./main.py" C-m
tmux split-window -t $TMUX_SESSION_NAME:0.0 -h
tmux send-keys -t $TMUX_SESSION_NAME "python3 manage.py shell" C-m
tmux send-keys -t $TMUX_SESSION_NAME "from django.core.cache import cache" C-m
tmux send-keys -t $TMUX_SESSION_NAME "cache.keys('*')" C-m
tmux send-keys -t $TMUX_SESSION_NAME "cache.clear()" C-m
tmux send-keys -t $TMUX_SESSION_NAME "cache.has_key('')" C-m
#tmux select-pane -t 2
#tmux send-keys "mysql -uroot -p123456 --host 192.168.1.221 --sigint-ignore --auto-vertical-output" C-m
#tmux send-keys "use data" C-m
#tmux -2 attach-session -t ssh //挂载到之前运行的session上
#tmux每开一个窗口,相当于新开了一个bash,每新开一个bash,就会执行整个脚本
echo "66666666"
fi
#tmux a -t $TMUX_SESSION_NAME
想要在容器启动时自运行这个脚本,只需要在
.bashrc
中添加:
if [ -f /home/doctao/acapp/runacapp.sh ]; then
bash /home/doctao/acapp/runacapp.sh
fi
关于配置容器ssh连接的方法
想要容器可以被ssh,需要
sshd
要想在镜像构建时下载
sshd
,或其他各种软件时,会碰到如下问题:1.容器是一个极简的操作系统,容器中自带的软件源几乎没有东西可以下载
2.在运行语句时,一旦某一句下载命令失败,构建会停止,如果选择 -y,也需要输出错误日志
3.sshd要想可以连接,需要更改配置文件参数
4.由于需要copy一些配置文件,需要解决跨系统传输时文件格式的问题(行末的\n)
1.下载问题的解决
要想让容器可以下载软件,必须更换软件源
方法
1.阿里源
/etc/apt/sources.list
的文件内容
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
2.将阿里源写在文件中通过dockerfile中的COPY命令将文件传在容器中
# 更换阿里源
COPY ./db/sources.list /etc/apt/sources.list
3.要想成功使用阿里源,必须安装其共钥,具体公钥的key,需要先运行一遍看一下日志中缺少的key
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 871920D1991BC93C
#每一行最后的一串字符,就是在日志中需要你自己找的key
4.更新软件源的命令
#更新软件源
apt-get clean
apt-get update
5.下载必要软件
apt-get -y install vim
apt-get -y install openssh-server
apt-get -y install tofrodos
6.想要用户可以远程ssh登陆容器,必须修改配置文件
/etc/ssh/sshd_config
将配置信息写入文件
echo 'RSAAuthentication yes \n\
PubkeyAuthentication yes \n\
AuthorizedKeysFile .ssh/authorized_keys \n\
PermitRootLogin yes \n\
ClientAliveInterval 60'\
>> /etc/ssh/sshd_config
7.将容器运行自启后的脚本文件放入容器并修正其格式,并放入
.bashrc
配置文件
#将开机运行脚本放入容器
COPY ./db/startup_run.sh /root/startup_run.sh
#修正文件格式
RUN fromdos /root/startup_run.sh
#添加脚本的运行权限
RUN chmod +x /root/startup_run.sh
#将bashrc脚本放入容器
COPY ./db/.bashrc /root/.bashrc
#修正文件格式
RUN fromdos /root/.bashrc
8.容器的root账户是默认没有密码的,需要设置一个密码
#添加root用户的密码
RUN echo root:密码|chpasswd
zan