#!/usr/bin/env bash
# System initialization script
# OS Centos 7
# create time 2019-10-19
# update time 2025-02-12
#
# curl -s -o init init.2yy.nl -L && sudo bash init xx xx 0
if [[ "$#" != "3" ]]; then
echo
echo 'must 1=${hostname} 2=${password} 3=${install_env}'
echo '${install_env}=0:docker:telegraf:iptables'
echo
exit 1
fi
if [[ "${UID}" != "0" ]]; then
echo "Permission denied" >&2
exit 1
fi
Lock="/etc/init_already"
if [[ -f "${Lock}" ]]; then
echo "already init, now exit"
exit 1
fi
set -x
set -e
sudo touch "${Lock}"
chattr +i "${Lock}"
unset Lock
hostname="${1}"
password="${2}"
install_env="${3}" # 0:docker:telegraf
# 主机名
hostnamectl --static set-hostname "${hostname}"
sed -i "s#localhost\ #${hostname}\ localhost\ #g" /etc/hosts
# 用户
id centos || useradd centos
echo "${password}" |passwd --stdin centos
echo "$(echo ${password}${RANDOM} |md5sum |awk '{print $1}')" |passwd --stdin root
unset password
chmod 0600 -v /etc/sudoers
sed -i '/^centos.*NOPASSWD:ALL/d' /etc/sudoers
echo 'centos ALL=(ALL) NOPASSWD:ALL' >>/etc/sudoers
chmod 0400 -v /etc/sudoers
# 优化 sshd
usermod -a -G sshd centos
echo -en '\n' >>/etc/ssh/sshd_config
sed -i '/Port/d' /etc/ssh/sshd_config
sed -i '/Protocol/d' /etc/ssh/sshd_config
sed -i '/AllowUsers/d' /etc/ssh/sshd_config
sed -i '/AllowGroups/d' /etc/ssh/sshd_config
sed -i '/PermitRootLogin/d' /etc/ssh/sshd_config
sed -i '/PasswordAuthentication/d' /etc/ssh/sshd_config
sed -i '/PermitEmptyPasswords/d' /etc/ssh/sshd_config
sed -i '/PubkeyAuthentication/d' /etc/ssh/sshd_config
sed -i '/AuthorizedKeysFile/d' /etc/ssh/sshd_config
sed -i '/AddressFamily/d' /etc/ssh/sshd_config
sed -i '/UseDNS/d' /etc/ssh/sshd_config
sed -i '/GSSAPIAuthentication/d' /etc/ssh/sshd_config
sed -i '/X11Forwarding/d' /etc/ssh/sshd_config
sed -i '/ClientAliveInterval/d' /etc/ssh/sshd_config
sed -i '/ClientAliveCountMax/d' /etc/ssh/sshd_config
sed -i '/Compression/d' /etc/ssh/sshd_config
sed -i '/AcceptEnv/d' /etc/ssh/sshd_config
cat >> /etc/ssh/sshd_config << EOF
Port 22
Protocol 2
AllowGroups sshd
PermitRootLogin no
PasswordAuthentication yes
PermitEmptyPasswords no
PubkeyAuthentication no
AuthorizedKeysFile /dev/null
AddressFamily inet
UseDNS no
GSSAPIAuthentication no
X11Forwarding no
ClientAliveInterval 100
ClientAliveCountMax 2
Compression yes
EOF
systemctl restart sshd
# 时区
ln -svf /usr/share/zoneinfo/Asia/Hong_Kong /etc/localtime
echo 'ZONE="Asia/Hong_Kong"' >/etc/sysconfig/clock
# DNS
tmp="$( find /etc/sysconfig/network-scripts -name 'ifcfg-*'|grep -v lo )"
for x in ${tmp[@]}; do
sed -i '/^DNS/d' ${x}
sed -i '/^PEERDNS/d' ${x}
echo 'PEERDNS=no' >>${x}
done
rm -vf /etc/resolv.conf
cat > /etc/resolv.conf << EOF
nameserver 1.1.1.1
nameserver 8.8.8.8
nameserver 114.114.114.114
EOF
chattr +i /etc/resolv.conf
unset tmp
# yum repo
curl -sSL "https://init.2yy.nl/centos7_CentOS-Base.repo" -o "/etc/yum.repos.d/CentOS-Base.repo"
# 时间
yum makecache
yum install -y ntpdate
cat > /etc/cron.hourly/ntpdate << EOF
#!/usr/bin/env bash
$(which ntpdate) pool.ntp.org >/var/log/ntpdate.log 2>&1
EOF
chmod +x /etc/cron.hourly/ntpdate
/etc/cron.hourly/ntpdate
cat /var/log/ntpdate.log
# 文件描述符
# 1048576 其实它等于 1024*1024 也就是 1024K个
sed -i '/fs.file-max/d' /etc/sysctl.conf
sed -i '/fs.aio-max-nr/d' /etc/sysctl.conf
sed -i '/kernel.pid_max/d' /etc/sysctl.conf
cat >> /etc/sysctl.conf << EOF
fs.file-max = 6815744
fs.aio-max-nr = 1048576
kernel.pid_max = 65535
EOF
sed -i '/* - nofile 1048576/d' /etc/security/limits.conf
sed -i '/* - nproc 1048576/d' /etc/security/limits.conf
cat >> /etc/security/limits.conf << EOF
* - nofile 1048576
* - nproc 1048576
EOF
echo "ulimit -u 1048576" >"/etc/profile.d/max_user_processes.sh"
# 防火墙
yum makecache
if [[ "$(systemctl list-units |grep firewalld |wc -l)" != "0" ]]; then
systemctl disable firewalld
systemctl stop firewalld
fi
yum install -y iptables-services
iptables -P INPUT ACCEPT
ip6tables -P INPUT ACCEPT
iptables -F
ip6tables -F
iptables -X
ip6tables -X
if [[ "$(echo ${install_env} |grep -w iptables |wc -l)" == "1" ]]; then
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -s 169.254.0.0/16 -j ACCEPT
iptables -A INPUT -s 192.168.0.0/16 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -m state --state NEW -j REJECT
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A INPUT -m state --state NEW -j REJECT
fi
service iptables save
service ip6tables save
systemctl enable iptables
systemctl enable ip6tables
# 关闭 selinux
sed -i '/SELINUX=/d' /etc/selinux/config
echo 'SELINUX=disabled' >>/etc/selinux/config
# 更新软件包/安装软件包
yum makecache
yum install -y epel-release yum-utils
yum makecache
yum update -y
yum upgrade -y
yum install -y bash-completion htop net-tools lsof iftop iotop screen wget tree xz zip unzip screen mlocate rsync bc git extundelete telnet jq
# 配置screen允许使用Shift+PageUP/PageDown和滚轮翻页,和screen的终端底部显示"[SCREEN] hostname"
cat > /etc/screenrc << EOF
bindkey "^[[5;2~" eval "stuff ^b" "copy"
bindkey "^[[6;2~" eval "stuff ^f" "copy"
hardstatus alwayslastline "[SCREEN] %H"
startup_message off
EOF
# 安装 docker
if [[ "$(echo ${install_env} |grep -w docker |wc -l)" == "1" ]]; then
yum install -y "docker-io"
systemctl enable "docker"
mkdir -vp "/root/.docker"
chmod -v 0700 "/root/.docker"
echo '{"auths":{"docker.uu1024.com":{"auth":"cHVsbDpkOThUNWJqQk5keVNUQVd0VlZEUA=="}}}' >"/root/.docker/config.json"
chmod -v 0600 "/root/.docker/config.json"
# systemctl start docker
# systemctl stop docker
# ip addr del 172.17.0.1/16 dev docker0
# ip addr add 10.1.0.1/30 dev docker0
# echo "{\"bip\": \"$3\"}" >/etc/docker/daemon.json
fi
# 常用服务客户端
cat > /etc/yum.repos.d/mysql-community.repo << EOF
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=https://repo.mysql.com/yum/mysql-5.7-community/el/7/\$basearch
enabled=1
gpgcheck=1
gpgkey=https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
https://repo.mysql.com/RPM-GPG-KEY-mysql
EOF
yum makecache
yum install -y mysql-community-client redis
# 开机启动
file="$(systemctl cat rc-local |head -n 1 |awk '{print $NF}')"
cat > /etc/rc.local << EOF
#!/bin/sh
touch /var/lock/subsys/local
EOF
chmod +x /etc/rc.d/rc.local
sed -i "/^ExecStart.*/i\ExecStartPre=$(which sleep) 2m" "${file}"
cat >> "${file}" << EOF
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable rc-local
unset file
# 安装监控客户端
if [[ "$(echo ${install_env} |grep telegraf |wc -l)" == "1" ]]; then
yum localinstall -y https://init.2yy.nl/influxdata.com/telegraf-1.21.4-1.x86_64.rpm
systemctl enable telegraf
wget -c https://init.2yy.nl/telegraf-plugins/mysql-status-linux-amd64 -O /etc/telegraf/mysql-status
chmod -v 0755 /etc/telegraf/mysql-status
cat > /etc/telegraf/mysql-status.ini << EOF
[master]
host = 127.0.0.1
port = 3306
username = status
password = FEybaC8iPMqR3cuFr3ks
EOF
cat > /etc/telegraf/telegraf.conf << EOF
[global_tags]
[agent]
interval = "10s"
round_interval = true
metric_batch_size = 1000
metric_buffer_limit = 10000
collection_jitter = "0s"
flush_interval = "10s"
flush_jitter = "0s"
precision = ""
debug = false
quiet = true
logtarget = "stderr"
hostname = ""
omit_hostname = false
[[outputs.influxdb]]
urls = ["https://uu1024.com:8086"]
database = "fbc"
timeout = "4s"
username = "flyingbird"
password = "Sp02MyvqOqfzhkECMIGtT4W11"
user_agent = "telegraf"
http_headers = {"Version" = "1.21.4"}
content_encoding = "gzip"
[[inputs.cpu]]
percpu = true
totalcpu = true
collect_cpu_time = false
report_active = false
[[inputs.disk]]
ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs", "fuse.sshfs"]
[[inputs.diskio]]
[[inputs.kernel]]
[[inputs.mem]]
[[inputs.processes]]
[[inputs.swap]]
[[inputs.system]]
fielddrop = ["uptime_format"]
[[inputs.net]]
[[inputs.netstat]]
[[inputs.file]]
files = ["/proc/sys/net/netfilter/nf_conntrack_count"]
name_suffix = "_net_netfilter_nfconntrack_count"
data_format = "value"
data_type = "integer"
[[inputs.mysql]]
servers = ["status:FEybaC8iPMqR3cuFr3ks@tcp(127.0.0.1:3306)/?tls=false"]
metric_version = 2
gather_slave_status = true
[[inputs.phpfpm]]
urls = ["http://127.0.0.1:81/phpfpm-status"]
timeout = "4s"
[[inputs.nginx]]
urls = ["http://127.0.0.1:81/nginx-status"]
response_timeout = "4s"
[[inputs.redis]]
servers = ["tcp://127.0.0.1:6379","tcp://127.0.0.1:6381","tcp://127.0.0.1:6382","tcp://127.0.0.1:6383","tcp://127.0.0.1:6384"]
[[inputs.elasticsearch]]
servers = ["http://127.0.0.1:9200"]
http_timeout = "4s"
local = true
[[inputs.exec]]
commands = ["/etc/telegraf/mysql-status"]
timeout = "4s"
name_suffix = "_mysql_status"
data_format = "json"
EOF
fi
# 其他可选
yum clean all
rm -vrf /var/cache/yum/*
cat > /etc/rc.local << EOF
#!/bin/sh
touch /var/lock/subsys/local
EOF
cat >> /etc/profile << EOF
export LC_ALL=en_US.UTF-8
export PS1='[\u@\h \W]\\$ '
EOF
find /root /home/* -type f |grep -v '/root/.docker/config.json' |xargs -n 99 rm -vf
echo "${hostname}"
shutdown -r 0
exit 0