Kylin进阶教程
基于银河麒麟Server V10的运维环境实战
本文根据银河麒麟Server V10运维真实环境配置教程,内容涵盖Docker、Mariadb 主备、Harbor、GlusterFS、Tomcat、Haproxy、rsyslog、Ansible、PostgreSQL
一、server1 系统环境配置
1、修改主机名
hostnamectl set-hostname server1.kylin.combash2、创建多级目录并查看
mkdir -p ~/kylin/docs/notefind ~/kylin -type d3、复制文件并改名
cp /etc/passwd ~/passwd_backup4、查看文件权限并修改为 640
ls -l /root/passwd_backupchmod 640 /root/passwd_backup5、配置 YUM 仓库源
cd /etc/yum.repos.d/mv kylin_x86_64.repo kylin_x86_64.repo.bakvim local.repo[local]name=Local Kylin Repobaseurl=http://192.168.122.1:58000/kylinsrvenabled=1gpgcheck=0yum clean allyum makecache6、安装配置 vsftpd
yum install -y vsftpdvim /etc/vsftpd/vsftpd.confanonymous_enable=YESanon_upload_enable=YESanon_mkdir_write_enable=YESanon_root=/data/ftp/local_enable=YESwrite_enable=YESlisten=YESlisten_ipv6=NO
# 受限用户 chrootchroot_local_user=YESchroot_list_enable=YESchroot_list_file=/etc/vsftpd/chroot_listallow_writeable_chroot=YES
# 双份日志xferlog_enable=YESxferlog_file=/var/log/xferlogdual_log_enable=YESvsftpd_log_file=/var/log/vsftpd.log创建 ftp 用户并限制主目录:
useradd -s /sbin/nologin -d /home/kylinftp kylinftppasswd kylinftptouch /etc/vsftpd/chroot_list将
/etc/pam.d/vsftpd中的auth required pam_shells.so一行注释掉,避免nologin用户无法登录。
systemctl enable --now vsftpdsystemctl restart vsftpd7、配置 chrony 时间服务器
yum install -y chronyvim /etc/chrony.confserver 192.168.122.1 iburstallow 172.16.0.0/16systemctl restart chronydchronyc sources8、配置 DNS 正向解析
yum install -y bindsed -i '/listen-on port 53/s/127.0.0.1/any/' /etc/named.confsed -i '/allow-query/s/localhost/any/' /etc/named.confcat >> /etc/named.rfc1912.zones <<EOFzone "kylin.com" IN { type master; file "kylin.com.zone";};EOFcat > /var/named/kylin.com.zone << 'EOF'$TTL 1D@ IN SOA server1.kylin.com. rname.invalid. ( 2025010101 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS server1.kylin.com.server1 A 172.16.50.231server2 A 172.16.50.232EOFchown named:named /var/named/kylin.com.zonesystemctl enable --now namedsystemctl restart namednslookup server1.kylin.com 127.0.0.1nslookup server2.kylin.com 127.0.0.19、配置 NFS 网络共享
yum install -y nfs-utilsmkdir -p /nfsdata/KY01 /nfsdata/KY02cat > /etc/exports <<EOF/nfsdata/KY01 172.16.50.0/24(rw,sync,no_root_squash)/nfsdata/KY02 server2.kylin.com(ro,sync,no_root_squash)EOFsystemctl enable --now rpcbind nfs-serverexportfs -rshowmount -e localhost二、server1 Docker 容器集群管理
1、二进制方式部署 Docker 20.10.9
cd /opt/software/tar xf docker-20.10.9.tgzcp docker/* /usr/bin/mkdir -p /etc/dockervim /etc/docker/daemon.json{ "data-root": "/var/lib/docker", "storage-driver": "overlay2"}cat > /usr/lib/systemd/system/docker.service <<'EOF'[Unit]Description=Docker Application Container EngineAfter=network-online.targetWants=network-online.target
[Service]Type=notifyExecStart=/usr/bin/dockerdExecReload=/bin/kill -s HUP $MAINPIDLimitNOFILE=infinityLimitNPROC=infinityLimitCORE=infinityTimeoutStartSec=0Delegate=yesKillMode=processRestart=on-failureStartLimitBurst=3StartLimitInterval=60s
[Install]WantedBy=multi-user.targetEOFsystemctl daemon-reloadsystemctl enable --now dockerdocker version2、导入镜像并创建容器
docker load -i /opt/software/kylin-10-sp3.tar.xzdocker images
docker run -itd --name kylin-1 --cpus=1 -m 2g kylin:laster /bin/bashdocker run -itd --name kylin-2 --cpus=1 -m 2g kylin:laster /bin/bashdocker ps3、容器内安装配置 Mariadb
将安装包拷入容器并进入容器安装:
docker cp /opt/software/mariadb-*.tar.gz kylin-1:/tmp/docker cp /opt/software/mariadb-*.tar.gz kylin-2:/tmp/docker exec -it kylin-1 bash容器内(kylin-1、kylin-2 均执行):
useradd -M -s /sbin/nologin mysqlmkdir -p /opt/mariadb /data/mysql /var/log/mysqltar xf /tmp/mariadb-*.tar.gz -C /opt/mariadb --strip-components=1chown -R mysql:mysql /data/mysql /var/log/mysql/opt/mariadb/bin/mysqld --initialize-insecure --user=mysql --datadir=/data/mysql/opt/mariadb/bin/mysqld_safe --user=mysql --datadir=/data/mysql &登录并设置 root 密码、开放网段授权:
/opt/mariadb/bin/mysql -urootALTER USER 'root'@'localhost' IDENTIFIED BY 'you_passwd';CREATE USER 'root'@'%' IDENTIFIED BY 'you_passwd';GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.16.%' IDENTIFIED BY 'you_passwd';GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.17.%' IDENTIFIED BY 'you_passwd';FLUSH PRIVILEGES;4、Mariadb 互为主备
修改 /etc/my.cnf 配置(kylin-1 上):
[mysqld]server-id = 1log-bin = mysql-binbinlog_format = rowauto_increment_increment = 2auto_increment_offset = 1kylin-2 上 server-id = 2、auto_increment_offset = 2。
重启两容器数据库:
/opt/mariadb/bin/mysqladmin -uroot -pyou_passwd shutdown/opt/mariadb/bin/mysqld_safe --user=mysql --datadir=/data/mysql &两容器均创建备份用户:
/opt/mariadb/bin/mysql -uroot -pyou_passwdCREATE USER 'backup'@'%' IDENTIFIED BY 'you_passwd';GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'backup'@'%';FLUSH PRIVILEGES;kylin-1 上指向 kylin-2:
CHANGE MASTER TO MASTER_HOST='kylin-2', MASTER_USER='backup', MASTER_PASSWORD='you_passwd', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=4;START SLAVE;kylin-2 上指向 kylin-1:
CHANGE MASTER TO MASTER_HOST='kylin-1', MASTER_USER='backup', MASTER_PASSWORD='you_passwd', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=4;START SLAVE;验证:
SHOW SLAVE STATUS\G;5、创建数据库与表
/opt/mariadb/bin/mysql -uroot -pyou_passwdCREATE DATABASE kylin_db1;USE kylin_db1;CREATE TABLE student_info ( Id INT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(20) NOT NULL, Birthday DATE NOT NULL, Gender ENUM('male','female','x') NOT NULL DEFAULT 'x', Password VARCHAR(100) NOT NULL);INSERT INTO student_info (Name, Birthday, Gender, Password) VALUES('tom', '1990-04-12', 'male', PASSWORD('you_passwd')),('harry', '1993-07-05', 'female', PASSWORD('you_passwd')),('barry', '1992-02-23', 'male', PASSWORD('you_passwd'));SELECT * FROM student_info;三、server1 Harbor 镜像仓库
1、docker-compose 离线安装 Harbor
cp /opt/software/docker-compose /usr/local/bin/docker-composechmod +x /usr/local/bin/docker-composedocker-compose version
cd /opt/software/tar zxf harbor-offline-installer-*.gzcd harborcp harbor.yml.tmpl harbor.ymlvim harbor.ymlhostname: 172.16.50.231http: port: 8000harbor_admin_password: you_passwddatabase: password: you_passwddata_volume: /data/harbor./install.shdocker-compose ps2、API 创建用户、项目并添加成员
curl -u "admin:you_passwd" -X POST \"http://172.16.50.231:8000/api/v2.0/users" \-H "Content-Type: application/json" \-d '{"username":"kylin","email":"kylin@yourdomain.com","password":"you_passwd","realname":"Kylin User","comment":"User created via API"}'
curl -u "admin:you_passwd" -X POST \"http://172.16.50.231:8000/api/v2.0/projects" \-H "Content-Type: application/json" \-d '{"project_name":"kylin_web","metadata":{"public":"false"}}'
curl -u "admin:you_passwd" -X GET \"http://172.16.50.231:8000/api/v2.0/users?username=kylin"
curl -u "admin:you_passwd" -X POST \"http://172.16.50.231:8000/api/v2.0/projects/kylin_web/members" \-H "Content-Type: application/json" \-d '{"role_id": 4, "member_user": {"username": "kylin", "user_id": 5}}'3、上传镜像到 Harbor
docker login 172.16.50.231:8000 -u kylin -p you_passwddocker tag kylin:laster 172.16.50.231:8000/kylin_web/kylin:lasterdocker push 172.16.50.231:8000/kylin_web/kylin:laster四、GlusterFS 存储集群(两台主机执行)
yum install -y glusterfs-serversystemctl enable --now glusterd1、格式化磁盘并挂载(两台)
mkfs.xfs /dev/vdbmkfs.xfs /dev/vdcmkdir -p /data/storage/bricks01 /data/storage/bricks02mkdir -p /data/storage/bricks01/safe_pool /data/storage/bricks02/data_poolecho "/dev/vdb /data/storage/bricks01 xfs defaults 0 0" >> /etc/fstabecho "/dev/vdc /data/storage/bricks02 xfs defaults 0 0" >> /etc/fstabmount -adf -h2、添加信任存储节点
gluster peer probe server2.kylin.comgluster peer status3、创建复制卷 gv_safe
gluster volume create gv_safe replica 2 \server1.kylin.com:/data/storage/bricks01/safe_pool \server2.kylin.com:/data/storage/bricks01/safe_pool4、创建分布式卷 gv_data
gluster volume create gv_data \server1.kylin.com:/data/storage/bricks02/data_pool \server2.kylin.com:/data/storage/bricks02/data_pool5、启动卷并设置访问控制
gluster volume start gv_safegluster volume start gv_datagluster volume set gv_safe auth.allow 172.16.50.0/24gluster volume info五、server1 Java 应用环境配置
1、部署 Java 与 Tomcat
mkdir -p /opt/java /opt/tomcat1 /opt/tomcat2tar xf /opt/software/java-23.tar.gz -C /opt/java --strip-components=1tar xf /opt/software/apache-tomcat-10.1.94.tar.gz -C /opt/tomcat1 --strip-components=1cp -r /opt/tomcat1/* /opt/tomcat2/2、创建 tomcat 用户
groupadd -g 1080 tomcatuseradd -u 1080 -g tomcat -s /sbin/nologin -M tomcatchown -R tomcat:tomcat /opt/java /opt/tomcat1 /opt/tomcat23、配置 Java 环境变量
cat >> /home/tomcat/.bash_profile <<EOF
export JAVA_HOME=/opt/javaexport CLASSPATH=/opt/java/libexport PATH=$PATH:/opt/java/binEOF4、配置两套 Tomcat 端口
sed -i 's/port="8080"/port="8081"/' /opt/tomcat1/conf/server.xmlsed -i 's/port="8005"/port="8006"/' /opt/tomcat1/conf/server.xmlsed -i 's/port="8009"/port="8010"/' /opt/tomcat1/conf/server.xml
sed -i 's/port="8080"/port="8082"/' /opt/tomcat2/conf/server.xmlsed -i 's/port="8005"/port="8007"/' /opt/tomcat2/conf/server.xmlsed -i 's/port="8009"/port="8011"/' /opt/tomcat2/conf/server.xml5、配置默认首页
echo "helloJava_ps_1" > /opt/tomcat1/webapps/ROOT/index.jspecho "helloJava_ps_2" > /opt/tomcat2/webapps/ROOT/index.jsp6、tomcat.service 统一管理两套实例
cat > /etc/systemd/system/tomcat.service <<'EOF'[Unit]Description=Apache Tomcat Web Application ContainerAfter=network.target
[Service]Type=forkingUser=tomcatGroup=tomcatEnvironment=JAVA_HOME=/opt/javaExecStart=/bin/bash -c '/opt/tomcat1/bin/startup.sh && /opt/tomcat2/bin/startup.sh'ExecStop=/bin/bash -c '/opt/tomcat1/bin/shutdown.sh && /opt/tomcat2/bin/shutdown.sh'
[Install]WantedBy=multi-user.targetEOFsystemctl daemon-reloadsystemctl enable --now tomcatsystemctl start tomcatsystemctl stop tomcat验证:
curl http://172.16.50.231:8081/curl http://172.16.50.231:8082/六、server1 配置负载均衡 Haproxy
rpm -ivh /opt/software/haproxy-*.rpmvim /etc/haproxy/haproxy.cfgglobal maxconn 4096
defaults mode http timeout connect 5000ms timeout client 50000ms timeout server 50000ms
frontend http_front bind *:8088 default_backend java_servers
backend java_servers balance roundrobin server tomcat1 127.0.0.1:8081 check server tomcat2 127.0.0.1:8082 check
listen stats bind *:8009 mode http stats enable stats uri /haproxy?statssystemctl enable --now haproxysystemctl restart haproxycurl http://172.16.50.231:8088/curl "http://172.16.50.231:8009/haproxy?stats"七、server1 日志管理
1、Tomcat 日志统一存放并修改前缀
mkdir -p /var/log/tomcat/logschown tomcat:tomcat /var/log/tomcat/logs
sed -i 's|CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out|CATALINA_OUT=/var/log/tomcat/logs/tomcat_1-catalina.out|' /opt/tomcat1/bin/catalina.shsed -i 's|^1catalina.org.apache.juli.AsyncFileHandler.prefix=catalina.|1catalina.org.apache.juli.AsyncFileHandler.prefix=tomcat_1-catalina.|' /opt/tomcat1/conf/logging.properties
sed -i 's|CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out|CATALINA_OUT=/var/log/tomcat/logs/tomcat_2-catalina.out|' /opt/tomcat2/bin/catalina.shsed -i 's|^1catalina.org.apache.juli.AsyncFileHandler.prefix=catalina.|1catalina.org.apache.juli.AsyncFileHandler.prefix=tomcat_2-catalina.|' /opt/tomcat2/conf/logging.properties
systemctl restart tomcatls /var/log/tomcat/logs/2、rsyslog 发送日志到 server2
cat > /etc/rsyslog.d/10-forwards.conf <<EOF*.* @@172.16.50.232:514EOFsystemctl restart rsyslog八、server2 系统环境配置
1、修改主机名
hostnamectl set-hostname server2.kylin.combash2、配置 YUM 源(ftp)
cat > /etc/yum.repos.d/ftp.repo <<EOF[ftp]name=Server1 FTP Repobaseurl=ftp://server1.kylin.comenabled=1gpgcheck=0EOFyum clean allyum makecache3、用户组管理与密码策略
groupadd devgroupuseradd -G devgroup dev1useradd -G devgroup dev2passwd dev1cat > /etc/sudoers.d/devgroup <<EOF%devgroup ALL=(ALL) NOPASSWD: ALLEOFchage -M 90 -W 7 -m 2 dev1chage -l dev14、目录 SGID 特殊权限
mkdir /opt/projectchown root:devgroup /opt/projectchmod 2775 /opt/project5、创建 pk.sh 监控脚本
cat > /opt/pk.sh <<'EOF'#!/bin/bashCPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed 's/.*, *\([0-9.]*\)%* id.*/\1/' | awk '{print 100-$1}')MEM_TOTAL=$(free -m | awk '/^Mem:/{print $2}')MEM_USED=$(free -m | awk '/^Mem:/{print $3}')MEM_PERCENT=$(awk -v u="$MEM_USED" -v t="$MEM_TOTAL" 'BEGIN{printf "%.1f", u/t*100}')echo "CPU Usage: ${CPU_USAGE}%"echo "Memory Usage: ${MEM_USED}/${MEM_TOTAL}MB(${MEM_PERCENT}%)"EOFchmod 750 /opt/pk.sh/opt/pk.sh | tee /var/log/monitor.log6、创建 info.sh 参数脚本
cat > /opt/info.sh <<'EOF'#!/bin/bashif [ "$1" = "kylin" ] || [ "$1" = "ITAI" ]; then echo "$1"else echo "Error 99" >&2fiEOFchmod 750 /opt/info.sh/opt/info.sh kylin/opt/info.sh ITAI/opt/info.sh xx7、配置 chrony 时间同步
yum install -y chronysed -i '/^pool /d' /etc/chrony.confecho "server server1.kylin.com iburst" >> /etc/chrony.confsystemctl restart chronydchronyc sources8、指定 DNS 服务器
echo "nameserver 172.16.50.231" > /etc/resolv.confnslookup server1.kylin.comnslookup server2.kylin.com9、网络共享
yum install -y nfs-utils autofsmkdir -p /nfs/net_public /nfsdata/net_dirKY01 使用 autofs 挂载:
cat >> /etc/auto.master <<EOF/nfs/net_public /etc/auto.misc --timeout=60EOFcat >> /etc/auto.misc <<EOFKY01 -fstype=nfs,rw server1.kylin.com:/nfsdata/KY01EOFsystemctl enable --now autofssystemctl restart autofsls /nfs/net_public/KY01df -hKY02 开机自动挂载:
echo "server1.kylin.com:/nfsdata/KY02 /nfsdata/net_dir nfs ro,_netdev 0 0" >> /etc/fstabmount -adf -h九、server2 Ansible 自动化部署 nginx
1、安装 ansible 并配置清单
rpm -ivh /opt/software/ansible-*.rpmmkdir -p /etc/ansiblecat > /etc/ansible/hosts <<EOF[web]server1.kylin.comEOFssh-keygen -t rsa -N ""ssh-copy-id root@server1.kylin.com2、创建 nginx role
mkdir -p /etc/ansible/roles/nginx/{tasks,templates,files}cp /opt/software/nginx.conf /etc/ansible/roles/nginx/files/cp /opt/software/nginx.j2 /etc/ansible/roles/nginx/templates/cp /opt/software/nginx-*.rpm /etc/ansible/roles/nginx/files/nginx.rpmcat > /etc/ansible/roles/nginx/tasks/main.yml <<'EOF'---- name: 拷贝 nginx 软件包 copy: src=nginx.rpm dest=/opt/software/nginx.rpm
- name: 安装 nginx yum: name=/opt/software/nginx.rpm state=present
- name: 渲染 nginx 配置模板 template: src=nginx.j2 dest=/etc/nginx/nginx.conf notify: restart nginx
- name: 启动 nginx service: name=nginx state=started enabled=yesEOFcat > /etc/ansible/roles/nginx/handlers/main.yml <<'EOF'---- name: restart nginx service: name=nginx state=restartedEOF3、编写 playbook 并执行
cat > /etc/ansible/nginx.yml <<'EOF'---- hosts: web roles: - nginxEOFansible-playbook /etc/ansible/nginx.ymlansible web -m pingcurl http://server1.kylin.com/十、server2 PostgreSQL 数据库运维
1、安装初始化 postgresql
rpm -ivh /opt/software/postgresql-server-*.rpm/usr/bin/postgresql-setup --initdbsystemctl enable --now postgresqlvim /var/lib/pgsql/data/postgresql.conflisten_addresses = '*'port = 5432cat >> /var/lib/pgsql/data/pg_hba.conf <<EOFhost all all 172.16.50.0/24 md5EOFsystemctl restart postgresql设置 postgres 口令:
su - postgres -c "psql -c \"ALTER USER postgres WITH PASSWORD 'you_passwd';\""2、创建数据库并导入
su - postgres -c "createdb company_db"su - postgres -c "psql company_db < /opt/software/company_db.sql"3、数据库操作(按顺序执行)
查询每部门员工数量、平均薪资、最高薪资,按平均薪资降序:
su - postgres -c "psql company_db -c \"SELECT d.department_name, COUNT(e.employee_id) AS emp_count, AVG(e.salary) AS avg_salary, MAX(e.salary) AS max_salary FROM employees e JOIN departments d ON e.department_id = d.department_id GROUP BY d.department_name ORDER BY avg_salary DESC;\"" > /data/result_1.log查询参与“ERP系统升级”项目的员工信息:
su - postgres -c "psql company_db -c \"SELECT e.employee_name, d.department_name, p.role, p.work_hours FROM employees e JOIN departments d ON e.department_id = d.department_id JOIN project_members p ON e.employee_id = p.employee_id JOIN projects pr ON p.project_id = pr.project_id WHERE pr.project_name = 'ERP系统升级';\"" > /data/result_2.log查询薪资高于部门平均薪资的员工:
su - postgres -c "psql company_db -c \"SELECT e.employee_name, d.department_name, e.salary, a.avg_salary FROM employees e JOIN departments d ON e.department_id = d.department_id JOIN (SELECT department_id, AVG(salary) AS avg_salary FROM employees GROUP BY department_id) a ON e.department_id = a.department_id WHERE e.salary > a.avg_salary;\"" > /data/result_3.log技术部(部门 ID 为 1)薪资低于 12000 的员工加薪 10%,最高不超过 13000:
su - postgres -c "psql company_db -c \"UPDATE employees SET salary = LEAST(salary * 1.1, 13000) WHERE department_id = 1 AND salary < 12000;\""表名/字段名以
company_db.sql实际结构为准,如不一致按实际结构调整 SQL。
4、挂载 gv_safe 并进行完整备份
yum install -y glusterfs-clientmkdir -p /mnt/backupecho "server1.kylin.com:/gv_safe /mnt/backup glusterfs defaults,_netdev 0 0" >> /etc/fstabmount -adf -h
su - postgres -c "pg_dump company_db" > /mnt/backup/db_backup.sqlls -l /mnt/backup/5、配置 crontab 定期备份
mkdir -p /data/backup /data/scriptcat > /data/script/backup.sh <<'EOF'#!/bin/bashsu - postgres -c "pg_dump company_db" > /data/backup/db_backup_$(date +%F).sqlEOFchmod +x /data/script/backup.sh
cat > /data/script/store.sh <<'EOF'#!/bin/bashtar czf /mnt/backup/db_backup_$(date +%F).tar.gz -C /data/backup db_backup_*.sqlEOFchmod +x /data/script/store.sh
crontab -e55 23 * * 0 bash /data/script/backup.sh0 23 25 * * bash /data/script/store.shcrontab -l十一、server2 rsyslog 日志服务器
vim /etc/rsyslog.conf取消以下注释:
$ModLoad imudp$UDPServerRun 514$ModLoad imtcp$InputTCPServerRun 514创建日志收集模板:
cat > /etc/rsyslog.d/20-logs-template.conf <<'EOF'$template logs,"/var/log/remote/%HOSTNAME%/%programname%.log"*.* ?logsEOFsystemctl restart rsyslog验证:
ss -tunlp | grep 514ls /var/log/remote/ls /var/log/remote/server1/

