首页 文章 精选 留言 我的

精选列表

搜索[AI运维],共10000篇文章
优秀的个人博客,低调大师

数据一致性校验及数据同步,运维必看

主从数据不一致对DBA来说是一个比较头疼的事情,刚接触MySQL时,遇到这种问题我一般采用重新还原备库的方式恢复数据,这对我来说是个很痛苦的过程。今天就来介绍两款pt工具,通过这两款工具可以针对数据不一致的情况进行快速检测和修复。 pt-table-checksum pt-table-checksum可以在线校验主从数据库的一致性,他可以在主库上执行检查语句,在线检查MySQL复制的一致性,然后生成replace语句,通过复制传递到从库,再更新master_crc的值。最后 通过检测从服务器的this_crc和master_crc的值判断主从数据是否一致。 如 果复制有延迟,在从库的checksum会暂停直到赶上主库的计算时间点。 注意事项: 1. 主从数据库必须是同步状态。 2. 表中要有主键或者唯一索引。 使用示例 1.首先我们先创建一个校验用户 mysql> grant select,insert,update,delete,create,drop,super,process,replication slave on *.* to 'syncuser'@'%' identified by 'Syncuser@123'; 2. 通过pt-table-checksum命令对主从数据进行校验。 [root@node1 ~]# pt-table-checksum -usyncuser -pSyncuser@123 --nocheck-replication-filters --no-check-binlog-format --databases=test --replicate=test.checksums --create-replicate-tableChecking if all tables can be checksummed ...Starting checksum ... TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE09-04T21:36:43 0 0 0 0 1 0 0.089 test.efs_sys_loginfo409-04T21:36:43 0 0 1006 0 1 0 0.089 test.groupby09-04T21:36:43 0 0 0 0 1 0 0.030 test.groupby109-04T21:36:43 0 1 1006 0 1 0 0.030 test.groupby209-04T21:36:43 0 0 7 0 1 0 0.030 test.student09-04T21:36:43 0 0 7 0 1 0 0.032 test.student109-04T21:36:43 0 1 0 8 1 0 0.034 test.t09-04T21:36:43 0 0 57344 0 4 0 0.328 test.t109-04T21:36:43 0 1 1 0 1 0 0.028 test.test09-04T21:36:430080100.036test.tuser 3.参数详解 --nocheck-replication-filters:不检查复制的过滤规则,比如replicate-ignore-db、replicate-wild-do-table。 --no-check-binlog-format:不检查复制的binlog模式,如果binlog模式是row模式,需要启用该参数。 --create-replicate-table:第一次进行checksum需要启用该参数,会进行checksum表的创建,用于存放结果。 --replicate=test.checksums:存放checksum结果的表。 --databases:表示要检查的库。 --tables(-t):表示要检查的表。 --replicate-check-only:表示只显示不同步的表。 --recursion-method:正常情况下工具会自动识别从库,如果识别失败,可以用该参数 指定查找slave的方法,参数有四种,分别是processlist、hosts、dsn=DSN、no四种,用来决定查找slave的方式是通过show processlist、show slave hosts还是通过dsn=DSN的方式。 采用dsn=DSN方式时需要先创建dsn表,建表语句如下: CREATE TABLE `dsns` (`id` int(11) NOT NULL AUTO_INCREMENT,`parent_id` int(11) DEFAULT NULL,`dsn` varchar(255) NOT NULL,PRIMARY KEY (`id`)); 然后插入主从复制关系: insert into dsns(dsn) values('h=36.30.39.176,u=syncuser,p=Syncuser@123,P=3306'); 这样就可以采用dsn方式了,--recursion-method dsn=D=test,t=dsns。 4.结果分析 TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE09-04T22:29:52 0 0 1 0 1 0 0.029 test.dsnsTS:完成检查的时间ERRORS:错误和告警的数量。DIFFS:是否一致,0代表一致,1代表不一致。ROWS:表的行数DIFF_ROWS:CHUNKS:划分的块的数目SKIPPED:跳过的块的数目TIME:执行时长TABLE:表名 pt-table-sync 我们上面介绍了pt-table-checksum可以检查主从数据的一致性,接下来我们就来说一下如何进行主从数据的同步。参考官方文档时就已经晕了,写出来之后难免有纰漏之处,还请读者朋友多多批评指正。 该工具采用replace into的方式同步数据,建议同步的表上要有主键或者唯一索引,否则replace into就和普通的insert语句一样了,会导致主库出现数据重复的情况。如果表上没有主键,变更需要再从库执行命令,并且指定--no-check-slave。 该工具可以以两种方式运行,当使用--replicate参数时,会使用由pt-table-checksum命令检测的结果进行同步,否则它会自动检测不一致并且修复。 当你使用了--replicate时,说明已经通过checksum工具检测出差异并保存在数据表里了,需要确定是否使--sync-to-master选项,如果使用该选项,则表示在使用pt-table-sync时仅接受一个DSN主机,并且是slave的DSN。工具会自动找出它的主库,找出差异进行同步。 如果你没有指定--sync-to-master参数,则DSN代表的是主库,工具会自动它的从库进行数据同步。 如果不使用--replicate,则分为以下几种情况: 当只有一个DSN信息时,并且指定了--sync-to-master,那么DSN信息必须是从库,否则会报错。 当有多个DSN主机时,第一个DSN是源端数据库,这时候并不区分主库或者从库,它会按照顺序向后面的DSN主机同步数据。 使用示例: 1.在上面的例子中,我们已经通过pt-table-checksum检测出主从的不一致的表,接下来我 们开始进行同步。下面的命令中指定了--replicate,并且未指定--sync-to-master,则-h代表主库。 pt-table-sync h=36.30.39.117,P=3306,u=syncuser,p=Syncuser@123 --database=test --replicate='test.checksums' --execute 2. 同时指定--replicate和--sync-to-master,DSN只能有一个,且为从库。 pt-table-sync h=36.30.39.176,P=3306,u=syncuser,p=Syncuser@123 --database=test --tables=t1 --replicate='test.checksums' --sync-to-master --execute 3. 如果只指定一个DSN,那么必须使用--replicate或者--sync-to-master中的一个,否则报错: Atleastone DSN is required, and at least two are required unless --sync-to-master or --replicate is specified。 这里我们指定了--sync-to-master,那么DSN信息就代表了从库。 pt-table-sync h=36.30.39.176,u=syncuser,p=Syncuser@123,D=test,t=t1 --sync-to-master --execute 4. 当有多个DSN时,如果指定了--sync-to-master,那么所有的主机均为从库。否则报错: Can'tdeterminemasterofD=test,h=…..,p=...,t=t1,u=syncuserat/usr/bin/pt-table-syncline10020. pt-table-sync h=36.30.39.176,u=syncuser,p=Syncuser@123,D=test,t=t1 h=36.30.39.213,u=syncuser,p=Syncuser@123,D=test,t=t1 --sync-to-master --execute 5.多个DSN,不指定--sync-to-master和--replicate,如果需要修复从库的数据需要指定 --no-check-slave。 pt-table-sync h=36.30.39.117,u=syncuser,p=Syncuser@123,D=test,t=t1 h=36.30.39.176,u=syncuser,p=Syncuser@123 h=36.30.39.213,u=syncuser,p=Syncuser@123 --no-check-slave –execute 参数详解: --ask-pass: 连接MySQL时提示输入密码。 --[no]bin-log: 指定是否记录二进制日志,如果是--no-bin-log相当于执行了set sql_log_bin=0. --[no]check-slave: 检测目标服务器是否是从库。如果目标服务器是从库的话,直接对其变更是不安全的,但是有时候必须要这么做,所以此时需要指定参数--no-check-slave。 --chunk-size: 指定表分块的chunk大小。 --dry-run: 分析同步的过程,并打印出信息退出,并不实际执行。 --execute: 指定工具执行变更操作,使表数据达成一致。 --print: 打印出工具需要执行哪些语句来变更表。 --wait: 如果存在主从延迟,从库可以等待多长时间追上主库,等待的时间由该参数设置,超时会终止退出。 DSN选项: DSN syntax is key=value[,key=value...] Allowable DSN keys: KEY MEANING === ============================================= A 指定字符集 D 同步的数据库 P 端口 S Socket文件 h 要连接的host p 数据库密码 t 要同步的表 u 数据库用户 注意事项及建议 1. 当出现主从不一致时,我们需要判断哪个库的数据是正确的,大多数情况我们希望在主库执行变更并且同步到从库。 2. 建议要同步的表要有主键,避免出现数据重复的问题。 3. 执行变更命令前先通过--print或者--dry-run进行检查。 4. 使用多个DSN选项时,按照数据同步方向填写主机信息,如果有从库需要配合--no-check-slave参数使用。 5. 该工具在进行校验分析时会对表执行for update操作,避免在业务高峰期进行。 本文分享自微信公众号 - MySQL数据库技术栈(Mysqltechnology)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

自动化运维工具Ansible-playbook详解和案例实战(四)

1、playbook-剧本介绍 playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。 1.1、核心元素 hosts:执行的远程主机列表 tasks:任务,由模板定义的操作列表 variables:变量,内置变量或者自定义变量在playboook中调用 templates:模板,即 使用模板语法的文件;可替换模板中的变量并实现一些简单逻辑的而文件 handlers:处理器,和notify结合使用 ;当某条件满足时,触发执行的操作 tags:标签,指定某条件下,用于选择运行playbook中的部分代码。Ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常的长。此时,如果确信其没有变化,就可以通过tags跳过这些代码片段 roles:角色 1.2、基础组件 hosts:playbook中的每个play的目的都是为了让某个或者某些主机在某个指定的用户身份执行任务。hosts用于指定任务的主机,须事先定义在主机清单中形式如下: hosts: websrvs remote_user:可用于hosts和tasks中,也可以通过指定sudo的方式在远程主机上执行,其可用于paly全局或某任务;此外甚至可以在sudo时使用sudo_user指定sudo时切换的用户形式如下: hosts: 192.168.16.10 remote_user: root tasks:name: test connectionping:remote_user: rootsudo: yessudo_user: root 3. tasks:任务列表;格式有两种: action: module argument module: argument 建议使用 注意:shell和command模块后面跟命令,而非key=value 某任务的状态在运行后changed时,可通过‘notify’通知给相应的handlers 任务可以通过‘tags’打标签,而后可在absible-playbook命令上使用-t指定进行调用 示例: ```bash tasks: - name: disable selinux command: /sbin/setenforce 0 如果命令或者脚本的退出码不为零,可以使用一下方式替代 tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand || /bin/true 或者 tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand ignore_errors: True 1.3、yaml语法 YAML的语法和其他高阶语言类似并且可以简单表达清单、散列表、标量等数据结构,其结构通过空格来展示。(列表用横杆表示,键值对用冒号分割,键值对里又可以嵌套另外的键值对)YAML文件扩展名通常为.yaml或者.yml。下面为示例一定要对齐,只能使用空格 name: wkx #冒号后有空格 age: 28 gender: male spouse: name: rlt age: 27 gender: female children: - name: dabao #横杠后有空格 age: 4 gender: femle - name: xiaobao age: 1 gender: male 1.4、playbook的运行方式 ansible-playbook <filename.yaml> ... [options]常用选项:--check 只检测可能会发生的改变,但不真正执行操作--list-hosts 列出运行任务的主机--limit 主机列表,只针对主机列表中的主机执行-v 显示过程 -vv -vvv 更详细ansible-playbook file.yaml --check 只检测Ansible-playbook file.yaml 执行Ansible-playbook file.yaml --limit websevs 仅websevs主机执行 1.5、Playbook VS shellscript Shell脚本 #!/bin/bash # install apache yum -y install httpd #copy conf file cp /tmp/http.conf /etc/httpd/conf/httpd.conf #start service systemctl enable httpd systemctl start httpd Palybook - hosts: wensevs remote_user: root tasks: - name: install apache yum: name=httpd - name: copy conf file copy: src=/tmp/http.conf dest=/etc/httpd/conf/httpd.conf - name: start service service: name=httpd state=started enabled=yes 2、handles和notify结合条件使用 Handlers:是task列表,这些task与前述的task并没有本质的区别,用于当关注的资源发生变化时,才会采取一定的操作Notify:此action被用于每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,尽在所有变化发生后完成一次性的执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。示例:Handles和notify的使用: - hosts: websrvs remote_user: root tasks: - name: add group nginx tags: user user: name=nginx state=present - name: add user nginx group: name=nginx state=present group=nginx - name: install nginx yum: name=nginx state=present - name: copy file copy: src=/tmp/nginx.conf dest=/etc/nginx/nginx.conf notify: - restart nginx - check nginx process handlers: - name: restart nginx #必须和notify中定义的名字一致 service: name=nginx status=restarted enabled=yes - check nginx process shell: killall -0 nginx > /tmp/nginx.log Tags的使用 1. hosts: wensrvs remote_user: root tasks: 2. name: install httpd yum: name=httpd status=present 3. name: copy conf file copy: src=files/httpd.conf dest=/etc/httpd/conf/httpd.conf tags: conf 4. name: start service tags: service service: name=httpd state=started enabled=yes 3、playbook中变量使用 3.1、变量 变量名:仅能由字母、数字和下划线组成,且只能以字母开头变量来源: ansible setup 模块下的变量都可以使用 /etc/ansible/hosts中定义的普通变量:主机组中主机单独定义,优先级高于公共变量公共组变量:针对主机组中所有的主机定义统一变量 通过命令行指定变量,优先级最好ansible-playbook -e varname=value 在playbook中定义var:var1: value1var2: value2 在role中定义 3.2、变量的调用方式 通过{{ variable_name }}调用变量,且变量名前后必须有空格,有时候使用”{{ variable_name }}”才能生效 anible-playbook -e 选项指定ansible-playbook -e "hosts=www user=wkx" test.yaml 3.3、使用变量 使用变量文件 cat vars.yaml var1: httpd var2: nginx cat var.yaml - hosts: 192.168.16.115 remote_user: root vars_files: - vars.yaml tasks: - name: touch httpd.txt file: name={{var1}}.txt state=touch #默认创建在当前用户下 - name: touch nginx.log file: name={{var2}}.log state=touch 使用setup变量 cat var.yaml - hosts: 192.168.16.115 remote_user: root tasks: - name: create log file file: name=/root/ansible-test/{{ ansible_fqdn }} state=touch #{{ ansible_fqdn }}为setup模块中域名的一个内置变量 命令行使用变量 cat var.yaml - hosts: 192.168.16.115 remote_user: root tasks: - name: create log file file: name=/root/ansible-test/{{ pkg }} state=touch ansible-playbook -e pkg=haha var.yaml hosts中的变量(/etc/asible/hosts) [websrvs:vars] #公共(组)变量 mark="-" [websrvs] #普通变量 192.168.16.115 hname=wg sname=115 192.168.16.118 hname=wg sname=118 ansible websrvs -m hostname -a 'name= {{ hname }}{{ mark }}16{{ mark }}{{sname}}' 3.4、模板文件templetes 文本文件,嵌套有脚本(使用模板编程语言编写)Jinja2语音,使用 字面量,有下面形式字符串:使用单引号或者双引号数字:整数、浮点数列表:[haha,xixi,hehe,lele]元组:(haha,xixi,hehe,lele)字典:{name:wkx,gender:male}布尔型:true、false算术运算:+、-、*、/、//、%、** 分别是加减乘除整除求余幂比较操作:==,!=,>,<,>=,<=逻辑运算:and,or,not流表达式:for,if,when When条件测试:如果需要根据变量、facts或此前任务的执行结果来作为某task执行与否的前提时要用到条件测试,通过when语句实现,在task中使用,jinja2的语法格式示例: cat var.yaml - hosts: 192.168.16.115 remote_user: root tasks: - name: "create file" file: name="/root/ansible-test/xixi" state=touch when: ansible_os_family == "RedHat" 迭代嵌套自变量示例1: - hosts: 192.168.16.115 remote_user: root tasks: - name: "create some file" file: name=/root/ansible-test/{{ item }} state=touch #创建文件,嵌套变量在下面 when: ansible_distribution_major_version == "7" #匹配条件,条件满足时执行 with_items: - haha - xixi - lele - name: install some packages yum: name={{ item }} with_items: - lrzsz - net-tools 示例2: cat user.yaml - hosts: 192.168.16.115 remote_user: root tasks: - name: "create some group" group: name={{ item }} when: ansible_distribution_major_version == "7" with_items: - g1 - g2 - g3 - name: cerate user user: name={{ item.name }} group={{ item.group }} with_items: - { name: "user1",group: "g1"} - { name: "user2",group: "g2"} - { name: "user3",group: "g3"} Playbook中template for if {% for vhost in nginx_vhosts %} server{ listen {{ vhost.listen | default(‘80 default_server’)}}; {% if vhost.server_name is defined %} Server_name{{ vhost.server_name }}; {% endif %} {% if vhost.root is defined %} root {{ vhost.root }} {% endif %} 示例1: cat temnginx.yaml --- - hosts: websrvs remote_user: root vars: nginx_hosts: - 80 - 8088 - tasks: - name: templete config template: src=/root/ansible-test/nginx.conf.j2 dest=/root/nginx.conf cat nginx.conf.j2 {% for vhost in nginx_hosts %} server { listen {{ vhost }} } {% endfor %} 生成为文件为 cat /root/nginx.conf server { listen 80 } server { listen 8088 } 示例2: cat temnginx.yaml --- - hosts: websrvs remote_user: root vars: nginx_hosts: - web1: listen: 8080 root: "/var/www/nginx/web1/" - web2: listen: 8080 server_name: "www.wkx.com" root: "/var/www/nginx/web2/" tasks: - name: templete config template: src=/root/ansible-test/nginx.conf.j2 dest=/root/nginx.conf cat nginx.conf.j2 {% for vhost in nginx_hosts %} server { listen {{ vhost.listen }} {% if vhost.server_name is defined %} server_name {{ vhost.server_name }} {% endif %} root {{ vhost.root }} } {% endfor %} 4、通过ansible-playbook实现对zabbix-agent批量安装 cat zabbix-agent.yml - hosts: agent remote_user: root tasks: - name: copy zabbix-agent copy: src=/mnt/zabbix-agent-4.4.0-1.el7.x86_64.rpm dest=/tmp - name: install zabbix-agent yum: name=/tmp/zabbix-agent-4.4.0-1.el7.x86_64.rpm - name: copy config copy: src=/etc/zabbix/zabbix_agentd.conf dest=/etc/zabbix/zabbix_agentd.conf - name: modify conf hostname lineinfile: path: /etc/zabbix/zabbix_agentd.conf regexp: "^Hostname" line: "Hostname={{ansible_hostname}}" - name: start zabbix-agent service: name=zabbix-agent state=started enabled=yes 5、role ansible自1.2版本后引入的新特性。用于层次性、结构性的组织playbook。Roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来说,roles就是通过分别将变量、文件、任务、模板以及处理器放置于单独的目录中,并可以便捷的include他们的一种机制。角色一般基于主机结构构建服务的场景中,但也可以是用于构建守护进程等场景中。 复杂场景:建议使用roles,代码复用度高变更主机及主机组如命名不规范维护或传承成本高某些功能需要多个playbook,通过include实现Ansible的roles目录结构每个角色,以特定的层级目录结构进行组织 Roles目录结构: playbook.yaml roles/ project/ 项目名称,有以下子目录 tasks/ 定义task、role的基本元素,至少包含一个名为main.yaml的文件;其他需要的文件在此通过include进行包含 files/ 存放由copy或者script模块调用的文件 vars/ 不常用,定义变量;至少包含一个名为main.yaml的文件;其他需要的文件在此通过include进行包含 default/ 不常用,设定默认变量时使用此目录中的main.yaml templates/ template模块查找所需要的模板问文件的目录 handlers/ meta/ 不常用,定义当前角色的特殊设定以及依赖关系;至少包含一个名为main.yaml的文件;其他需要的文件在此通过include进行包含

优秀的个人博客,低调大师

大神带你飞--Linux运维实战

【第一题】系统环境:我们操作的系统为RHEL7.0系统,其中Hostname:station.rhce.cc,IP address:192.168.122.100,Netmask:255.255.255.0,Gateway:192.168.122.1,NameServer:192.168.122.10,Root密码:redhat操作步骤:(1)由于发现使用系统给定的密码'redhat'无法登陆系统,所以首先需要重置系统的root密码,按照下图点击强制复位后重新启动系统后,点击按键:e(2)将光标调整到'rhgb quiet'后面并将其删除,然后写上:# init=/bin/sh,然后按:Ctrl+x组合键。(3)接着写上如下内容:# mount -o remount,rw /,然后回车;然后重新设置密码:# echo redhat | passwd --stdin root,接着回车;接着写:# touch /.autorelabel,创建一个隐藏文件并回车;最后写:# exec /sbin/init,直接回车运行,此时重置密码任务完成。(4)给系统重新设置主机名:# hostnamectl set-hostname station.rhce.cc(5)进入到如下目录:# cd /etc/sysconfig/network-scripts,并且编辑:# vim ifcfg-eth0,并添加如下的信息:DEVICE=eth0NAME=eth0BOOTPROTO=noneONBOOT=yesIPADDR=192.168.122.100NETMASK=255.255.255.0GATEWAY=192.168.122.1DNS1=192.168.122.10(6)接着将网络重启一下:# systemctl restart network(7)使用ssh方式连接虚拟机:# ssh root@192.168.122.100 -X,此时便连接到station的机器上了。验证:# ping station.rhce.cc能够正常的ping通,说明网络信息已经配置成功。 【第二题】SELinux必须运行在Enforcing模式下。操作步骤:(1)首先查看系统的SELinux的设置情况:# getenforce(2)同时设置SELinux的模式在当前为Enforcing模式:# setenforce 1(3)需要确保重新启动系统后仍然运行在Enforcing模式,进入配置文件进行设置:# vim /etc/selinux/config(4)修改配置文件,将原来的'SELINUX=permissive'修改为'SELINUX=enforcing',最后':wq'保存退出。 【第三题】配置YUM源,使用地址ftp://server.rhce.cc/dvd 作为默认的源。操作步骤:(1)进入目录# cd /etc/yum.repos.d/(2)编辑:# vim aa.repo(3)在数据仓库repo文件中写下配置信息:[aa]name=aabaseurl=ftp://server.rhce.cc/dvdenabled=1gpgcheck=0验证:在系统中安装bc计算器的软件包,如果能够正常的安装成功,说明YUM源配置是正确的,# yum inStall bc -y 【第四题】调整逻辑卷vo的大小,它的文件系统应该为290M。确保这个文件系统的内容仍然完整。注意:分区很少能精确到和要求的大小相同,因此范围在260M到320之间都是可接受的。操作步骤:(1)首先查看逻辑卷的大小:# lvscan(2)计算缺少的逻辑卷空间大小:# echo 290-192 | bc(3)在逻辑卷中扩展缺少的空间大小:# lvextend -L +98M /dev/vg0/vo(4)此时需要确定文件系统的类型:# df -hT(5)需要将文件系统的逻辑卷进行扩展:# xfs_growfs /home/注意:如果文件系统显示的是ext4类型,则操作:# resize2fs /dev/mapper/vg0-vo 【第五题】创建下面的用户、组合组成员关系:(a)名字为adminuser的组;(b)用户natasha,使用adminuser作为附属组;(c)用户harry,也使用adminuser作为附属组;(d)用户sarah,在系统上不能访问可交互的shell,且不是adminuser的成员,natasha,harry,sarah密码都是redhat操作步骤:(1)首先创建用户组:# groupadd adminuser(2)创建用户natasha:# useradd -G adminuser natasha(3)创建用户harry:# useradd -G adminuser harry(4))创建用户sarah:# useradd -s /sbin/nologin sarah(5)给natasha用户设置密码:# echo redhat | passwd --stdin natasha(6)给harry用户设置密码:# echo redhat | passwd --stdin harry(7)给sarah用户设置密码:#echo redhat | passwd --stdin sarah 【第六题】复制文件/etc/fstab到/var/tmp/fstab,配置/var/tmp/fstab的权限如下:(a)文件/var/tmp/fstab所有者是root;(b)文件/var/tmp/fstab属于root组;(c)文件/var/tmp/fstab不能被任何用户执行;(d)用户natasha可读和可写/var/tmp/fstab;(e)用户harry既不能读也不能写/var/tmp/fstab;(f)所有其他用户(现在和将来)具有读/var/tmp/fstab的能力。操作步骤:(1)首先复制文件:# cp /etc/fstab /var/tmp/fstab(2)查看文件的属主和属组:# ls -l /var/tmp/fstab(3)系统默认为不能被任何用户执行,没有'x'执行权限。(4)由于对用户单独设置权限,所以使用ACL访问控制列表实现:# setfacl -m u:natasha:rw- /var/tmp/fstab(5)对harry用户单独设置权限:# setfacl -m u:harry:--- /var/tmp/fstab(6)其他用户具有读的能力:# ls -l /var/tmp/fstab,发现其他用户具有'r'的权限。 【第七题】用户natasha必须配置一个corn.job,当地时间每天14:23运行,执行:/bin/echo hiya操作步骤:(1)首先给natasha创建一个计划任务:# crontab -e -u natasha(2)配置计划任务的“分、时、日、月、星期、命令”等信息:23 14 * * * /bin/echo hiya(3)输入':wq'保存退出。验证:检查刚刚的配置信息:# crontab -l -u natasha 【第八题】创建一个目录/home/adminS,使之具有下面的特性:(a)/home/adminS所属组为adminuser;(b)这个目录对组adminuser的成员具有可读、可写和可执行,但是不是对其他任何用户。(root可以访问系统上所有的文件和目录);(c)在/home/adminS下创建的任何文件所属组自动设置为adminuser操作步骤:(1)首先创建目录:# mkdir /home/adminS(2)/home/adminS所属组为adminuser:# chgrp adminuser /home/adminS(3)接着查询目录/home/adminS的权限情况:#ls -ld /home/adminS(4)发现对组adminuser的成员缺少写的权限,因此需要添加:# chmod g+w /home/adminS(5)不对其他任何用户:# chmod o-rx /home/adminS(6)在/home/adminS下创建的任何文件所属组自动设置为adminuser,可以如下操作:# chmod g+s /home/adminS 【第九题】从http://rhgls.rhce.cc/pub/updates 安装合适的内核更新。下面的要求必须满足:更新的内核作为系统启动的默认内核;原来的内核在系统启动的时候仍然有效和可引导。操作步骤:(1)首先用浏览器下载内核:# firefox http://rhgls.rhce.cc/pub/updates &,并且保存在系统桌面。(如图9-1和9-2)(2)升级下载好的内核:# rpm -ivh kernel-3.10.0-299.el7.x86_64.rpm,后续启动系统后会默认使用升级的了内核的系统。(如图9-3和9-4) 【第十题】系统host.rhce.cc提供了一个LDAP验证服务,你的系统应该按下面的要求绑定到这个服务:(a)验证服务的基准DN是dc=rhce,dc=cc;(b)LDAP用于提供账户信息和验证信息连接应该使用位于http://host.rhce.cc/pub/domain11.crt 的证书加密;(c)当正确的配置后,ldapuser11可以登录你的系统,但没有家目录,直到你完成autofs题目ldapuser11的密码是:redhat操作步骤:(1)由于需要绑定LDAP服务,首先查询需要安装的软件包:# yum list auth*(2)将查询的到的软件包安装起来:# yum inStall authconfig-gtk.x86_64 -y(3)运行这个安装完毕的软件:# authconfig-gtk &,使其在后台运行。(4)然后在“身份&验证”下的“用户帐户数据库”中,选择LDAP(5)按照系统要求安装缺少的软件包:# yum inStall nss-pam-ldapd -y(6)认证方法选择LDAP密码,在LDAP搜索基础DN中,填写dc=rhce,dc=cc;在LDAP服务器中,填写host.rhce.cc(7)勾选“用TLS加密连接”,在“下载CA证书”中填写:http://host.rhce.cc/pub/domain11.crt验证:此时输入:# id ldapuser11,可以验证已经存在ldapuser11这个用户。 【第十一题】配置你的系统使它是rhgls.rhce.cc的一个NTP客户。操作步骤:(1)因为需要创建一个时间服务器,所以首先安装软件包:# yum inStall system-config-date -y(2)执行命令:# system-config-date &,将窗口中示例的信息删除,并添加时间服务器:rhgls.rhce.cc,最后点击“确定”启动时间服务器即可。 【第十二题】配置autofs自动挂载LDAP用户的家目录,如下要求:host.rhce.cc(192.168.122.10)使用NFS共享了/home/guests给你的系统。(a)这个文件系统包含了预先设置好的用户ldapuser11的家目录;(b)ldapuser11的家目录是host.rhce.cc:/home/guests/ldapuser11;(c)ldapuser11的家目录应该自动挂载到本地/home/guests下面的/home/guests/ldapuser11;(d)家目录必须对用户具有可写权限,ldapuser11的密码是:redhat操作步骤:(1)首先安装自动挂载的软件包:# yum inStall autofs -y(2)然后编辑:# vim /etc/auto.master,并在auto.master文件中添加一行:/home/guests /etc/auto.aa(3)同时提供系统所需的auto.aa文件:# cp /etc/auto.misc /etc/auto.aa(4)在新生成的auto.aa文件中添加一行:ldapuser11 -fstype=nfs,rw,vers=3 host.rhce.cc:/home/guests/ldapuser11,使得ldapuser11的家目录自动挂载到本地/home/guests下面的/home/guests/ldapuser11(5)将自动挂载autofs服务启动:# systemctl start autofs(6)并加入开机自动启动项中:# systemctl enable autofs验证:# su - ldapuser11,可以发现用户ldapuser11自动生成了家目录,说明自动挂载成功。 【第十三题】创建一个用户alex,uid为3400。这个用户的密码为:redhat操作步骤:(1)首先创建alex用户:# useradd -u 3400 alex(2)设置用户的密码:# echo redhat | passwd --stdin alex 【第十四题】为你的系统上额外添加一个大小为512M的交换分区,这个交换分区在系统启动的时候应该能自动挂载。不要移除和更改你系统上现存的交换分区。操作步骤:(1)首先查询系统的分区情况:# lsblk,由于系统已经有了3个分区,所以第四个建议创建扩展分区,并在扩展分区上创建逻辑分区。(2)首先进入分区创建:# fdisk /dev/sda,然后输入:p -----------(打印)n -----------(创建一个新的扩展分区)e -----------(选择为扩展分区,并两次回车选择默认设置)n -----------(创建一个新的逻辑分区)+512M ----(分区大小为512M)t ------------(改变分区的类型)5 -----------(选择需要修改的分区号)82 ----------(改变为Swap类型)w------------(保存退出)(3)接着需要将系统分区表的变化通知内核:# partprobe /dev/vda(4)然后需要将分区设置为交换分区类型:# mkswap /dev/vda5(5)接着需要开机能够自动启动,进入配置文件:# vim /etc/fstab,并且写上如下一行:/dev/vda5 swap swap defaults 0 0(6)最后需要将swap分区手动启动一下:# swapon -a验证:在命令行输入:# swapon -s,如果有出现/dev/vda5则说明512M的交换分区挂载成功。 【第十五题】找出所有所有者是ira的文件,并把它们拷贝到/root/findresults目录。操作步骤:(1)首先将题目要求的文件夹创建出来:# mkdir /root/findresults(2)将需要查找出的文件放入文件夹中,注意使用分号结束:# find / -user ira -exec cp -a {} /root/findresults/ \;验证:输入命令:# ls -l /root/findresults,看到属主为ira,即说明已经将所有者为ira的文件拷贝到了对应的目录下了。 【第十六题】在/usr/share/dict/words中找出所有包含seismic的行。复制所有这些行并按照原来的顺序放在文件/root/lines中。/root/lines应该没有空白行,所有的行必须是/usr/share/dict/words中原有的行的精确复制。操作步骤:(1)首先将符合条件的行找出来并且重定向到对应的文件中:# grep seismic /usr/share/dict/words > /root/lines验证:# cat /root/lines即可发现都是包含seismic的行。 【第十七题】创建名为/root/backup.tar.bz2的备份文件,其中包含/usr/local的内容,tar必须使用bzip2压缩。操作步骤:(1)首先进入需要将其压缩备份的文件夹内:# cd /usr/local(2)如果没有bzip2类型的压缩格式,那么安装起来即可:# yum inStall bzip2 -y(3)因为需要创建的文件是bzip2类型,所以将文件夹内的文件全部压缩:# tar jcvf /root/backup.tar.bz2 *验证:此时在家目录中便可以看到一个:backup.tar.bz2的文件,说明创建备份文件成功。 【第十八题】按照下面的要求创建一个新的逻辑卷:(a)逻辑卷命名为database,属于卷组datastore,且大小为50个扩展;(b)在卷组datastore的逻辑卷每个扩展的大小为16MiB;(c)使用vfat格式化这个新的逻辑卷,此逻辑卷在系统启动的时候应该能自动挂载到/mnt/database。操作步骤:(1)首先需要查看一下当前的分区状况:# lsblk,发现创建逻辑分区比较合适,逻辑卷的大小至少为50*16=800M,所以卷组的大小设置为1G比较合适。(2)输入如下的命令进入分区创建状态:# fdisk /dev/vda,然后键入:p --------(打印当前分区的情况)n --------(创建一个新的分区)+1G ----(分区大小设为1G)t ---------(转换分区类型)6 --------(选择第六个分区)8e ------(设置为LVM逻辑卷类型)w --------(保存退出)(3)最后将系统分区表的变化通知内核:# partprobe /dev/vda(4)首先创建物理卷:# pvcreate /dev/vda6(5)然后创建卷组:# vgcreate -s 16 datastore /dev/vda6,创建的卷组大小为16M,卷组名为datastore(6)最后创建逻辑卷:# lvcreate -l 50 -n database datastore,卷组是50个扩展,并且逻辑卷名为database,由卷组datastore创建而来。(7)此时还需要格式化这个新的逻辑卷,并且需要确保vfat格式可用:# yum whatprovides */mkfs.vfat(8)将对应格式的软件包安装起来:# yum inStall dosfstools-3.0.20-9.el7.x86_64 -y(9)最后格式化这个新的逻辑卷:# mkfs.vfat /dev/datastore/database(10)因为需要在开机的时候能够自动挂载,所以先创建对应的文件目录:# mkdir /mnt/database(11)编辑开机自动挂载文件:# vim /etc/fstab,然后在配置文件中写上:/dev/datastore/database /mnt/database vfat defaults 0 0一行即可。验证:首先输入:# mount -a重新挂载一下文件系统,然后查询挂载情况:# df -hT,发现已经挂载成功了。 【第十九题】系统环境:我们操作的系统为RHEL7.0系统,其中第一台机器主机名:system1,IP address:192.168.122.100,Netmask:255.255.255.0,第二台机器主机名:system2,IP address:192.168.122.200,Netmask:255.255.255.0,Gateway:192.168.122.1,NameServer:192.168.122.10,Root密码:redhat(a)配置SELinux,SELinux必须在两个系统system1和system2中运行于Enforcing模式。操作步骤:(1)由于系统的yum源没有配置,所以先进入system1机器上的yum文件夹下:# cd /etc/yum.repos.d(2)然后创建yum配置文件:# vim aa.repo[aa]name=aabaseurl=ftp://server.rhce.cc/dvdenabled=1gpgcheck=0(3)把system1上配置好的yum源文件拷贝到system2系统上:# scp /etc/yum.repos.d/aa.repo system2:/etc/yum.repos.d/(4)打开SELinux配置文件:vim /etc/selinux/config(5)然后更改配置文件:SELINUX=enforcing(6)修改当前系统的SELinux配置为enforcing模式:# setenforce 1,如上所有的配置同样都在system1和system2上都操作一遍即可。 【第二十题】配置SSH访问,按以下要求配置SSh访问:(a)用户能够从域rhce.cc的客户端通过SSH远程访问您的两个虚拟机系统;(b)在域my133.org内的客户端不能访问您的两个虚拟机系统。操作步骤:(1)首先在system1机器上编辑允许远程访问的配置文件:# vim /etc/hosts.allow(2)由于需要用户能够从rhce,cc的客户端通过SSH远程访问系统,故添加如下一行:sshd : 192.168.122.0/255.255.255.0(3)接着在system1机器上编辑禁止远程访问的配置文件:# vim /etc/hosts.deny(4)由于在域my133.org内的客户端不能访问系统,故添加如下一行:sshd : .my133.org(5)将system1上配置的文件拷贝到system2机器上:# scp /etc/hosts.allow /etc/hosts.deny system2:/etc/注意:添加的一行信息为域名解析的IP地址,同时子网掩码需要写全:255.255.255.0,不能用数字24替代。 【第二十一题】自定义用户环境,在系统system1和system2上创建自定义命令名为qstat此自定义命令将执行以下命令:/bin/ps-Ao pid,tt,user,fname,rsz此命令对系统中所有 用户有效。操作步骤:(1)首先在system1机器上编辑配置文件:# vim /etc/bashrc(2)可以在配置文件的末行加上一句:alias qstat='/bin/ps-Ao pid,tt,user,fname,rsz'(3)然后将文件立即生效:# source /etc/bashrc(4)最后在system2机器上做相同的配置即可。验证:在命令行执行如下命令:# qstat,可以查看到命令正常执行,说明自定义用户环境的任务完成了。 【第二十二题】配置端口转发,在系统system1配置端口转发,要求如下:在192.168.122.0/24网络中的系统,访问system1的本地端口5423将被转发到80,此设置必须永久有效。操作步骤:(1)因为需要配置端口转发,即配置防火墙的富规则,可以通过找模板的方式处理:# man -k firewall(2)然后找到firewalld.richlanguage这一项:# man firewalld.richlanguage,然后进行搜索查找:/EXAMPLES,找到模板Example 3和Example 5(3)然后写防火墙的富规则,当访问system1的本地端口5423将被转发到80:# firewall-cmd --add-rich-rule ' rule family="ipv4" source address="192.168.122.0/24" forward-port to-port="80" protocol="tcp" port="5423" '(4)此设置必须永久有效:# firewall-cmd --add-rich-rule ' rule family="ipv4" source address="192.168.122.0/24" forward-port to-port="80" protocol="tcp" port="5423" ' --permanent 【第二十三题】配置聚合链路,在system1.rhce.cc和system2.rhce.cc之间按以下要求配置一个链路:(a)此链路使用eth1和eth2;(b)此链路在一个接口失效时仍然能工作;(c)此链路在system1使用下面的地址172.16.11.25/255.255.255.0;(d)此链路在system2使用下面的地址172.16.11.35/255.255.255.0;(e)此链路在系统重启之后依然保持正常状态。操作步骤:(1)因为需要配置聚合链路,所以首先可以去system1机器上找模板:# cd /usr/share/doc/teamd-1.9/example_ifcfgs/1/(2)将如下文件夹中的3个文件拷贝到网络配置的文件夹中:# cp * /etc/sysconfig/network-scripts/(3)进入到网络配置文件夹中:# cd /etc/sysconfig/network-scripts/(4)在system1机器上编辑第一个配置文件:# vim ifcfg-team_test0DEVICE="team_tset0"NAME=team_test0DEVICETYPE="Team"ONBOOT="yes"BOOTPROTO=noneNETMASK=255.255.255.0IPADDR=172.16.11.25TEAM_CONFIG='{"runner":{"name":"activebackup"}}'(4)在system1机器上编辑第二个配置文件:# vim ifcfg-eth1DEVICE="eth1"NAME=eth1DEVICETYPE="TeamPort"ONBOOT="yes"TEAM_MASTER="team_test0"(5)在system1机器上编辑第三个配置文件:# vim ifcfg-eth2DEVICE="eth2"NAME=eth2DEVICETYPE="TeamPort"ONBOOT="yes"TEAM_MASTER="team_test0"(6)接着重启服务即可:# systemctl restart network(6)在system1的network-scripts文件夹下,将配置的文件拷贝到system2的机器上:# scp ifcfg-eth1 ifcfg-eth2 ifcfg-team_test0 system2:/etc/sysconfig/network-scripts/(7)在system2机器上编辑第一个配置文件:# vim ifcfg-team_test0DEVICE="team_tset0"NAME=team_test0DEVICETYPE="Team"ONBOOT="yes"BOOTPROTO=noneNETMASK=255.255.255.0IPADDR=172.16.11.35TEAM_CONFIG='{"runner":{"name":"activebackup"}}'(8)最后重启两台机器的服务即可:# systemctl restart network验证:在system1机器上操作:# ping 172.16.11.35,并在system2机器上操作:# ping 172.16.11.25都可以正常的通信,表明配置的聚合链路生效了。 【第二十四题】配置IPv6地址,在你的系统上配置接口eth0使用下列IPv6地址:(a)system1上的地址应该是200e:ac18::e0a/64;(b)system2上的地址应该是200e:ac18::e14/64;(c)两个系统必须能与网络200e:ac18/64内的系统通信。(d)地址必须在重启后依旧生效。(e)两个系统必须保持当前的IPv4地址并能通信。操作步骤:(1)首先在system1上查看一下名称和设备各均为eth0:# nmcli connection(2)将system1设置为auto:# nmcli connection modify eth0 ipv6.method auto(3)接着设置IP地址:# nmcli connection modify eth0 ipv6.addresses 200e:ac18::e0a/64(4)接着将system1设置为manual:# nmcli connection modify eth0 ipv6.method manual(5)在system2上就行同样的操作:# nmcli connection modify eth0 ipv6.method auto(6)# nmcli connection modify eth0 ipv6.addresses 200e:ac18::e14/64(7)# nmcli connection modify eth0 ipv6.method manual(8)最后重启网络:# systemctl restart network验证:在system1机器上ping第二台机器system2:# ping6 200e:ac18::e14,并且反过来在system2上验证:# ping6 200e:ac18::e0a 【第二十五题】配置本地邮件服务,在系统system1和system2上配置邮件服务,满足以下要求:(a)这些系统不接收外部发送来的邮件;(b)在这些系统上本地发送的任何邮件都会自动路由到rhgls.rhce.cc;(c)从这些系统上发送的邮件显示来自于rhce.cc;(d)您可以通过发送邮件到本地用户'dave'来测试您的配置,系统rhgls.rhce.cc已经配置把此用户的邮件转到下列URL:http://rhgls.rhce.cc/received_mail/11 操作步骤:(1)首先可以在system1机器的防火墙中work zone添加允许所有的邮件通过:# firewall-cmd --add-service=smtp(2)并且将配置写入持久态:# firewall-cmd --add-service=smtp --permanent(3)进入邮件配置文件夹:# cd /etc/postfix(4)编辑配置文件:# vim main.cf(5)题中要求系统不接收来自外部的邮件,所以修改:'mydestination = '(6)如果接受了来自外部的邮件,则先在系统中查找关键字:# postconf | grep transp(7)找到'local_transport'关键字后,接着让系统给出一个报错:# postconf -e local_transport=err:xxxxx(7)由于需要本地发送的任何邮件都会自动路由到rhgls.rhce.cc,所以在配置文件中修改:relayhost = [rhgls.rhce.cc](8)在系统上发送的邮件显示来自于rhce.cc,所以修改:myorigin = rhce.cc(9)在system1上做完以上的配置后,再在system2机器上进行同样的配置:# scp /etc/postfix/main.cf system2:/etc/postfix/(10)最后重启邮件服务器即可:# systemctl restart postfix验证:(1)首先在system1机器上安装mail客户端:# yum inStall mailx -y(2)然后发送一封邮件给已经配置好的本地用户:# echo aaaaaa | mail -s 'aaaa' dave(3)然后再浏览器中打开下列URL:http://rhgls.rhce.cc/received_mail/11 ,即可发现邮件已经可以正常的接收了,同样的测试在system2机器上操作一次。 【第二十六题】通过SMB共享目录,在system1上配置SMB服务:(a)您的SMB服务器必须是STAFF工作组的一个成员;(b)共享/common目录,共享名必须为common;(c)只有rhce.cc域内的客户端可以访问common共享;(d)common必须是可以浏览的;(e)用户andy必须能够读取共享中的内容,如果需要的话,验证的密码是:redhat操作步骤:(1)首先把服务安装起来:# yum inStall samba -y(2)编辑配置文件:# vim /etc/samba/smb.conf(3)由于SMB服务器必须是STAFF工作组的一个成员,所以修改配置文件:workgroup = STAFF(4)由于共享/common目录,所以先创建目录:# mkdir /common(5)在samba服务中每创建一个文件都需要修改上下文:# chcon -R -t samba_share_t /common(6)由于具体的访问控制是在配置文件中设置的,所以在防火墙work zone中允许所有的数据包通过:# firewall-cmd --add-service=samba(7)并且将配置写入持久态:# firewall-cmd --add-service=samba --permanent(8)继续编辑配置文件:# vim /etc/samba/smb.conf(9)在最后一行添加如下内容:[common]path = /commonhosts allow = 192.168.122.0/24(10)由于发现:# id andy,用户不存在,所以创建用户:# useradd andy(11)给创建的用户设置密码:# echo redhat | passwd --stdin andy(12)因为后续验证时需要在system2机器上测试samba服务,但是软件包并没有安装,查询需要在system2机器上安装的软件包:# yum whatprovides */smbclient(13)在system2机器上将软件包安装起来:# yum inStall samba-client -y(14)然后添加samba用户:# smbpasswd -a andy(15)然后输入:#pdbedit -L,发现andy用户已经添加到samba域里了。(16)最后在system1机器上启动服务:# systemctl start smb(17)并将服务加入开机启动项:# systemctl enable smb验证:(1)在system2机器上验证samba服务是否配置成功:# smbclient -L //system1 -U andy%redhat(2)接着查看用户是否可以登录common目录:# smbclient //system1//common -U andy%redhat 【第二十七题】配置多用户SMB挂载,在system1共享通过SMB目录/miscellaneous满足以下要求:(a)共享名为miscellaneous;(b)共享目录miscellaneous只能被rhce.cc域中的客户端使用;(c)共享目录miscellaneous必须可以被浏览;(d)用户silene必须能以读的方式访问此共享,访问密码是redhat;(e)用户akira必须能以读写的方式访问此共享,访问密码是redhat;(f)此共享永久挂载在system2.rhce.cc上的/mnt/multi目录,并使用用户silene作为认证,任何用户可以通过akira来临时获取写的权限。操作步骤:(1)首先在system1机器上创建题目要求的目录:# mkdir /miscellaneous(2)同时需要修改目录文件的上下文:# chcon -R -t samba_share_t /miscellaneous(3)接着编辑samba的配置文件:vim /etc/samba/smb.conf[miscellaneous]path = /miscellaneoushosts allow = 192.168.122.0/24writable = nowrite list = akira(4)同时需要将目录的其他用户设置可写的权限:# chmod o+w /miscellaneous/(5)创建silene和akira用户:# useradd silene# useradd akira(6)并且给用户设置密码:# echo redhat | passwd --stdin silene# echo redhat | passwd --stdin akira(7)然后将用户加入到samba服务中:# smbpasswd -a silene# smbpasswd -a akira(8)然后在system1机器上重启服务:# systemctl restart smb.service(9)然后在system2机器上测试silene用户是否可以登录samba共享:# smbclient //system1/miscellaneous -U silene%redhat,发现可以登录samba共享,使用silene用户创建目录:# mkdir aa,发现没有权限创建目录。(10)接着在system2机器上测试akira用户是否可以登录samba共享:# smbclient //system1/miscellaneous -U akira%redhat,发现可以登录samba共享,使用akira用户创建目录:# mkdir bb,发现有权限创建文件目录。(11)由于需要将samba共享永久挂载在system2机器上,所以先创建好所需的目录:# mkdir /mnt/multi,并编辑挂载配置文件:# vim /etc/fstab(12)然后添加如下的一行://system1/miscellaneous /mnt/multi cifs defaults,username=silene,password=redhat,multiuser,sec=ntlmssp 0 0(13)由于是多用户挂载,所以需要安装cifs软件包:# yum inStall cifs-u* -y(14)然后重置挂载的配置文件:# mount -a(15)接着输入:# df -hT,发现已经挂载成功了。验证:(1)首先在system2机器上创建多个测试用户:# useradd tom1# useradd tom2# useradd tom3(2)首先在system2机器上切换到tom1用户:# su - tom1,然后进入到创建好的目录中:# cd /mnt/multi(3)先使用silene用户测试:# cifscreds add system1 -u silene,接着测试:# touch ssss,发现没有创建文件的权限。(4)然后在system2机器上切换到tom2用户:# su - tom2,并且进入到创建好的目录中:# cd /mnt/multi(5)再使用akira用户测试:# cifscreds add system1 -u akira,接着测试:# mkdir bbbb,发现可以正常的创建目录。所以实现了此共享挂载在system2对应的目录上,并且对应的用户拥有各自的权限了。 【第二十八题】配置NFS服务,在system1配置NFS服务,要求如下:(a)以只读的方式共享目录/public同时只能被rhce.cc域中的系统访问;(b)以读写的方式共享目录/protected能被rhce.cc域中的系统访问;(c)访问/protected需要通过Kerberos安全加密,您可以使用下面URL提供的密钥http://host.rhce.cc/materials/nfs_server.keytab ;(d)目录/protected应该包含名为confidential拥有人为ldapuser11的子目录;(e)用户ldapuser11能以读写方式访问:/protected/confidential操作步骤:(1)因为system1需要配置NFS服务,所以首先启动服务:# systemctl start nfs-server(2)然后还要设置开机自动启动:# systemctl enable nfs-server(3)由于system1只能被rhce.cc域中的系统访问,所以设置防火墙富规则:# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.122.0/24" service name="nfs" accept'(4)并且写入持久态,使重启后仍然生效:# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.122.0/24" service name="nfs" accept' --permanent(5)# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.122.0/24" service name="rpc-bind" accept'(6)# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.122.0/24" service name="rpc-bind" accept' --permanent(7)# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.122.0/24" service name="mountd" accept'(8)# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.122.0/24" service name="mountd" accept' --permanent(9)接着在system1上创建public目录:# mkdir /public(10)在system1上编辑配置文件:# vim /etc/exports,然后添加如下的一行:/public *(ro,sync),并将修改内容生效:# exportfs -arv(如图28-6和28-7)(11)接着在system2机器上测试NFS是否生效:# showmount -e system1,然后挂载system1的目录:# mount system1:/public /mnt(12)然后在system1上创建protected目录:# mkdir /protected(13)在system1上编辑配置文件:# vim /etc/exports,然后添加如下的一行:/protected *(rw,sync),并将修改内容生效:# exportfs -arv(如图28-10和28-11)(14)因为访问protected需要通过Kerberos安全加密:# wget -O /etc/krb5.keytab http://host.rhce.cc/materials/nfs_server.keytab(15)因为配置了安全加密,所以需要修改配置文件:# vim /etc/exports,修改为:/protected *(rw,sync,sec=krb5p),并且重新生效配置:# exportfs -arv(如图28-13和28-14)(16)由于system1上配置了安全加密,所以也要修改system1配置文件:# vim /etc/sysconfig/nfs,修改如下配置'PRCNFSDARGS="-V 4.2"'强制使用4.2版本。(17)由于system1配置了4.2版本,所以需要修改protected目录的上下文:# chcon -R -t public_content_t /protected/(18)在system1上创建confidential目录:# mkdir /protected/confidential,并再次修改上下文:# chcon -R -t public_content_t /protected/(19)然后修改目录的属主信息:# chown ldapuser11 /protected/confidential(20)最后system1需要重启nfs-server服务:# systemctl restart nfs-server.service,接着还要重启:# systemctl restart nfs-secure-server,并加入开机启动项:# systemctl enable nfs-secure-server 【第二十九题】挂载一个NFS共享,在system2上挂载一个来自system1.rhce.cc的NFS共享,并符合下列要求:(a)/public挂载在下面的目录上/mnt/nfsmount;(b)/protected挂载在下面的目录上/mnt/nfssecure并使用安全的方式,密钥下载URL如下:http://host.rhce.cc/materials/nfs_client.keytab ;(c)用户ldapuser11能够在/mnt/nfssecure/confidential上创建文件;(d)这些文件系统在系统启动时自动挂载。操作步骤:(1)在system2机器上操作,首先需要验证NFS是否有挂载成功:# showmount -e system1(2)创建nfsmount目录:# mkdir /mnt/nfsmount(3)编辑fstab配置文件:# vim /etc/fstab(4)在配置文件中添加如下一行信息:system1.rhce.cc:/public /mnt/nfsmount nfs defaults 0 0,并且重启挂载:# mount -a,测试已经挂载成功了:# df -hT(如图29-3和29-4)(5)创建nfssecure目录:# mkdir /etc/nfssecure(6)并且需要使用安全的方式:# wget -O /etc/krb5.keytab http://host.rhce.cc/materials/nfs_client.keytab(7)因为system2使用了安全的方式,所以需要启动如下服务:# systemctl start nfs-secure(8)并将服务加入开机启动项中:# systemctl enable nfs-secure(9)此时进行挂载,编辑fstab配置文件:# vim /etc/fstab(10)在配置文件中添加如下一行信息:system1.rhce.cc:/protected /mnt/nfssecure nfs defaults,v4.2,sec=krb5p 0 0,并重新启动挂载:# mount -a,然后测试挂载已经成功了:# df -hT验证:(1)由于用户ldapuser11能够在挂载的目录上创建文件,在system1机器上操作:# ssh ldapuser11@system2.rhce.cc -X,因为配置的时候是基于Kerberos进行安全加密的,所以使用SSH的方式登录的时候就可以基于Kerberos进行认证。(2)登录到confidential目录:# cd /mnt/nfssecure/confidential,此时用户ldapuser11就能够在confidential目录上创建文件了:# touch aaa 【第三十题】配置web站点,system1上配置一个站点http://system1.rhce.cc 然后执行下述步骤:(a)从http://rhgls.rhce.cc/materials/station.html 下载文件,并且将文件重命名为index.html不要修改此文件的内容;(b)将文件index.html拷贝到您的web服务器的DocumentRoot目录下;(c)来自于rhce.cc域的客户端可以访问此Web服务;(d)来自于my133t.org域的客户端拒绝访问此Web服务。操作步骤:(1)首先安装Web服务:# yum groupinStall web* -y(2)接着将服务启动起来:# systemctl start httpd(3)并将服务加入开机启动项:# systemctl enable httpd(4)编辑配置文件:# vim /etc/httpd/conf/httpd.conf(5)修改ServerName的一行:ServerName system1.rhce.cc:80(6)下载文件,并且将文件重命名为index.html:# wget -O /var/www/html/index.html http://rhgls.rhce.cc/materials/station.html(7)由于来自rhce.cc域的客户端可以访问此Web服务,所以设置防火墙:# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.122.0/24" service name="http" accept'(8)并且将防火墙的Web规则写入持久态:# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.122.0/24" service name="http" accept' --permanent(9)最后将服务重启:# systemctl restart httpd.service注意:(1)有时候重启服务器之后,使用域名就无法正常访问了,所以可以在hosts配置文件中解决:# vim /etc/hosts(2)为使重启Web服务后,仍然可以正常的使用域名访问,在配置文件中添加一行:192.168.122.100 system1.rhce.cc system1验证:打开浏览器,输入:system1.rhce.cc,可以正常访问,说明Web站点配置成功。 【第三十一题】配置安全web服务,为站点http://system1.rhce.cc 配置TLS加密,一个已签名证书从http://host.rhce.cc/materials/system1.crt 获取,此证书的密钥从http://host.rhce.cc/materials/system1.key 获取,此证书的签名授权信息从http://host.rhce.cc/materials/domain11.crt 获取。操作步骤:(1)因为需要配置安全web服务,所以先进入目录:# cd /etc/httpd/conf(2)先将第一个文件下载到本地:# wget http://host.rhce.cc/materials/system1.crt(3)将第二个文件也下载到本地:# wget http://host.rhce.cc/materials/system1.key(4)将第三个文件也下载到本地:# wget http://host.rhce.cc/materials/domain11.crt(5)编辑Web服务中的安全配置文件:# vim /etc/httpd/conf.d/ssl.conf(6)修改配置文件中的如下各行信息:SSLCertificateFile /etc/httpd/conf/system1.crtSSLCertificateKeyFile /etc/httpd/conf/system1.keySSLCertificateChainFile /etc/httpd/conf/domain11.crt(7)接下来重启Web服务:# systemctl restart httpd(8)此时还要将https写入防火墙富规则中:# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.122.0/24" service name="https" accept'(9)并且还要将https写入防火墙规则的持久态中:# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.122.0/24" service name="https" accept' --permanent验证:打开浏览器,输入:https://system1.rhce.cc ,发现可以正常的访问,说明安全Web服务配置完成。(如图31-6至图31-8) 【第三十二题】配置虚拟主机,在system1上扩展您的web服务器,为站点http://www.rhce.cc 创建一个虚拟主机,然后执行下述步骤:(a)设置DocumentRoot为/var/www/virtual;(b)从http://rhgls.rhce.cc/materials/www.html 下载文件并重命名为index.html不要对文件index.html的内容做任何修改;(c)将文件index.html放到虚拟主机的DocumentRoot目录下,确保andy用户能够在/var/www/virtual目录下创建文件。注意:原始站点http://system1.rhce.cc 必须仍然能够访问,名称服务器rhce.cc提供对主机名www.rhce.cc 的域名解析。操作步骤:(1)首先编辑配置文件:# vim /etc/hosts(2)在配置文件中添加如下的一行信息:192.168.122.100 www.rhce.cc www(3)创建DocumentRoot目录:# mkdir /var/www/virtual(4)下载文件:# wget -O /var/www/virtual/index.html http://rhgls.rhce.cc/materials/www.html(5)确保andy用户能够在此目录下创建文件:# setfacl -m u:andy:rwx /var/www/virtual/(6)由于需要配置虚拟主机,所以可以使用模板:# cp /usr/share/doc/httpd-2.4.6/httpd-vhosts.conf /etc/httpd/conf.d/vhost.conf(7)编辑新生成的vhost文件:# vim /etc/httpd/conf.d/vhost.conf<VirtualHost www.rhce.cc:80>DocumentRoot /var/www/virtualServerName www.rhce.cc</VirtualHost><VirtualHost system1.rhce.cc:80>DocumentRoot /var/www/htmlServerName system1.rhce.cc</VirtualHost>(8)最后将服务重启一下:# systemctl restart httpd验证:(1)在浏览器中输入:www.rhce.cc ,发现可以正常访问。(2)在浏览器中输入:http://system1.rhce.cc ,发现可以正常访问。(3)在浏览器中输入:https://system1.rhce.cc ,发现可以正常访问,说明虚拟主机配置成功。 【第三十三题】配置web内容的访问,在您的system1上的web服务器的DocumentRoot目录下创建一个名为secret的目录,要求如下:(a)从http://rhgls.rhce.cc/materials/private.html 下载一个副本到这个目录,并且重命名为index.html。(b)不要对这个文件的内容做任何修改。(c)从system1上,任何人都可以浏览secret的内容,但是从其它系统不能访问这个目录的内容。操作步骤:(1)由于需要在system1上的web服务器创建secret目录,所以创建:# mkdir /var/www/html/secret /var/www/virtual/secret(2)将副本下载到这个html目录:# wget -O /var/www/html/secret/index.html http://rhgls.rhce.cc/materials/private.html(3)将副本下载到这个virtual目录:# wget -O /var/www/virtual/secret/index.html http://rhgls.rhce.cc/materials/private.html(4)由于secret目录只允许本机的用户可以访问,所以在配置文件中:# vim /etc/httpd/conf/httpd.conf中找到如下模板信息:<Directory "/var/www">AllowOverride None# Allow open access:Require all granted</Directory>(5)接着根据模板信息编辑vhost配置文件:# vim /etc/httpd/conf.d/vhost.conf<Directory "/var/www/html/secret">AllowOverride NoneRequire local</Directory><Directory "/var/www/virtual/secret">AllowOverride NoneRequire local</Directory>(6)最后重启服务:# systemctl restart httpd验证:(1)在system1机器上操作:# curl -s www.rhce.cc/secret/index.html ,发现可以正常访问。(2)在system1机器上操作:# curl -s system1.rhce.cc/secret/index.html ,发现可以正常访问。(3)在system2机器上操作:# curl -s www.rhce.cc/secret/index.html ,发现无法正常访问。(4)在system2机器上操作:# curl -s system1.rhce.cc/secret/index.html ,发现无法正常访问。 【第三十四题】实现动态Web内容,在system1上配置提供动态Web内容,要求如下:(a)动态内容有名为dynamic.rhce.cc的虚拟主机提供,虚拟主机侦听在端口8998;(b)从http://rhgls.rhce.cc/materials/webapp.wsgi 下载一个脚本,然后放在适当的位置,无论如何不要求修改此文件的内容;(c)客户端访问http://dynamic.rhce.cc:8998/ 时,应该接收到动态生成的web页面;(d)此http://dynamic.rhce.cc:8998/ 必须能被rhce.cc域内的所有系统访问。操作步骤:(1)首先确认动态主机的IP:# ping dynamic.rhce.cc,发现IP地址为:192.168.122.100(2)编辑system1机器上的配置文件:# vim /etc/hosts,并添加如下的一行信息:192.168.122.100 dynamic.rhce.cc dynamic(3)由于虚拟主机侦听在端口8998,所以需要设置防火墙的富规则:# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.122.0/24" port protocol="tcp" port="8998" accept'(4)并将防火墙规则写入持久态:# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.122.0/24" port protocol="tcp" port="8998" accept' --permanent(5)接下来还要在配置文件中开放端口8998:# vim /etc/httpd/conf/httpd.conf,添加如下一行信息:Listen 8998(6)接着进入vhost配置文件:# vim /etc/httpd/conf.d/vhost.conf<VirtualHost dynamic.rhce.cc:8998>DocumentRoot /var/www/html/yyServerName dynamic.rhce.ccWSGIScriptAlias / /var/www/html/yy/webapp.wsgi</VirtualHost>(7)创建第六步在配置文件中定义的目录:# mkdir /var/www/html/yy(8)由于需要实现动态web,所以安装对应的软件包:# yum inStall mod_wsgi -y(9)将下载的脚本放到第七步创建的目录下:# wget -P /var/www/html/yy http://rhgls.rhce.cc/materials/webapp.wsgi(10)由于在第六步中配置了端口,所以需要修改端口的上下文,首先需要找到模板:# vim /etc/ssh/sshd_config,找到如下一行:semanage port -a -t ssh_port_t -p tcp #PORTNUMBER(11)确认需要安装semanage软件包的名称:# yum whatprovides */semanage(12)并将软件包安装起来:# yum inStall policycoreutils-python-2.2.5-11.el7.x86_64 -y(13)然后执行修改上下文的命令:# semanage port -a -t http_port_t -p tcp 8998(14)重启Apache服务器:# systemctl restart httpd验证:(1)在浏览器输入:http://system1.rhce.cc ,发现正常访问。(2)在浏览器输入:https://system1.rhce.cc ,发现正常访问。(3)在浏览器输入:www.rhce.cc ,发现正常访问。(4)在浏览器输入:dynamic.rhce.cc:8998,发现正常访问。 【第三十五题】创建一个脚本,在system1上创建一个名为/root/script的脚本,让其提供下列特性:(a)当运行/root/script foo,输出为bar;(b)当运行/root/script bar,输出为foo;(c)当没有任何参数或者参数不是foo或者bar时,其错误输出产生以下的信息:/root/script foo|bar操作步骤:(1)首先在system1机器上创建一个脚本:# vim script(2)然后添加如下脚本信息:#! /bin/bashcase $1 infoo)echo bar;;bar)echo foo;;*)echo '/root/script foo|bar';;esac(3)然后给脚本加上可执行权限:# chmod +x /root/script验证:(1)执行:# ./script afa,得到了结果:/root/script foo|bar(2)执行:# ./script foo,得到了结果:bar(3)执行:# ./script bar,得到了结果:foo 【第三十六题】创建一个添加用户的脚本,在system1上创建一个脚本,名为/root/mkusers,此脚本能实现为系统system1创建本地用户,并且这些用户的用户名来自一个包含用户名列表的文件。同时满足下列要求:(a)此脚本要求提供一个参数,此参数就是包含用户名列表的文件;(b)如果没有提供参数,此脚本应该给出下面的提示信息Usage:/root/mkusers然后退出并返回相应的值;(c)如果提供一个不存在的文件名,此脚本应该给出下面的提示信息Input file not found然后退出并返回相应的值;(d)创建的用户登录shell为/bin/false;(e)此脚本不需要为用户设置密码;(f)您可以从下面的URL获取用户名列表作为测试用:http://rhgls.rhce.cc/materials/userlist操作步骤:(1)首先在system1机器上创建一个脚本:# vim /root/mkusers(2)然后添加如下脚本信息:#! /bin/bashif [ $# -eq 0 ];thenecho "Usage:/root/mkusers"exit 1fiif[ ! -f $1 ];thenecho "Input file not found"exit 1fiwhile read aadouseradd -s /bin/false $aadone < $1(3)下载用户列表文件:# wget http://rhgls.rhce.cc/materials/userlist(4)chmod +x /root/mkusers验证:(1)执行:# ./mkusers,得到了结果:Usage:/root/mkusers(2)执行:# ./mkusers afafaf,得到了结果:Input file not found(3)执行:# ./mkusers userlist,正常执行了脚本,并且验证发现新用户已经创建:# id lisi 【第三十七题】配置iSCSI服务端,配置system1提供一个iSCSI服务,磁盘名为iqn.2014-09.com.example.domain11:system1,并符合下列要求:(a)服务端口为3260;(b)使用iscsi_vol作其后端卷,大小为3G;(c)此服务只能被system2.rhce.cc访问。操作步骤:(1)首先应该在system1机器上将服务的软件包安装起来:# yum inStall target* -y(2)接着启动服务:# systemctl start target(3)并将服务加入开机启动项:# systemctl enable target(4)由于使用的后端卷大小为3G,所以创建:# fdisk /dev/vda,然后输入:p --------(打印当前的分区情况)n --------(创建一个新的分区)p --------(创建一个主分区)+3G ----(创建一个3G大小的主分区)w --------(保存退出)(5)最后还需要将system1修改的配置同步更新一下:# partprobe /dev/vda(6)进入配置iSCSI服务的界面:# targetcli,然后输入:/> ls / -----------------------------------------------------------------------------(列出所有的卷信息)/> /backstores/block create iscsi_vol /dev/vda4 -----------------------(将磁盘中创建的第四个分区设置为iscsi_vol)/> /iscsi create iqn.2014-09.com.example.domain11:system1 ----(在iscsi目录下设置卷的磁盘名信息)/> cd /iscsi/iqn.2014-09.com.example.domain11:system1/tpg1 ---(进入到配置的目录中)/> acls/ create iqn.2014-09.com.example.domain11:xx -------------(设置acls访问控制列表的名称)/> luns/ create /backstores/block/iscsi_vol ----------------------------- (创建逻辑单元号)/> portals/ create 0.0.0.0 3260 ---------------------------------------------(设置iSCSI的服务端口为3260)/> exit ---------------------------------------------------------------------------- (退出设置)(7)由于要求只能被system2访问,所以设置防火墙端口的富规则:# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.122.200/24" port protocol="tcp" port="3260" accept'(8)并将防火墙的设置写入持久态:# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.122.200/24" port protocol="tcp" port="3260" accept' --permanent,此时iSCSI服务端便配置好了。 【第三十八题】配置iSCSI的客户端,配置system2使其能连接在system1的上提供的iqn.2014-09.com.example.domain11:system1并符合以下要求:(a)iSCSI设备在系统启动的期间自动加载;(b)块设备iSCSI上包含一个大小为1700MiB的分区,并格式化为xfs;(c)此分区挂载在/mnt/data上,同时在系统启动的期间自动挂载。操作步骤:(1)由于需要配置iSCSI客户端,所以在system2机器上安装客户端的软件包:# yum inStall iscsi* -y(2)然后编辑:# vim /etc/iscsi/initiatorname.iscsi,并添加如下的一行信息:InitiatorName=iqn.2014-09.com.example.domain11:xx(3)接着启动客户端的服务:# systemctl start iscsid(4)并且加入开机启动项:# systemctl enable iscsid(5)在系统启动的期间自动发现iSCSI存储:# iscsiadm -m discovery -t st -p system1.rhce.cc -l(6)由于需要在iSCSI上包含一个1700M的分区:# fdisk /dev/sda,输入如下的信息:n -------------(新建一个分区)p -------------(选择创建一个主分区)+1700M ----(分区创建大小为1700M)w -------------(保存退出)(7)最后需要在system2机器上将配置同步更新一下:# partprobe /dev/sda(8)将创建的分区格式化为xfs文件系统:# mkfs.xfs /dev/sda1(9)在system2机器上创建挂载的目录:# mkdir /mnt/data(10)编辑分区挂载的配置文件:# vim /etc/fstab,并添加如下一行信息:/dev/sda1 /mnt/data xfs defaults,_netdev 0 0验证:(1)在system2机器上重新挂载所有的分区:# mount -a(2)查看分区挂载的情况:# df -hT 【第三十九题】配置一个数据库,在system1上创建一个MariaDB数据库,名为Contacts,并符合以下条件:(a)数据库应该包含来自数据库复制的内容,复制文件的URL为http://rhgls.rhce.cc/materials/users.mdb 。(b)数据库只能被localhost访问。(c)除了root用户,此数据库只能被用户Luigi查询。此用户密码为redhat。(d)root用户的密码为redhat,同时不允许空密码登录。操作步骤:(1)首先在system1机器上安装MariaDB数据库:# yum inStall mariadb-server mariadb -y(2)接着启动服务:# systemctl start mariadb(3)将服务加入开机启动项中:# systemctl enable mariadb(4)然后进入数据库:# mysql,然后输入如下SQL语句:\> show databases; -----------------(显示当前所有的数据库)\> create database Contacts; ----(创建一个数据库,命名为Contacts)\> quit ----------------------------------(由于接下来需要下载文件,所以退出当前的数据库)(5)因为数据库包含来自数据库复制的内容,所以把文件下载下来:# wget http://rhgls.rhce.cc/materials/users.mdb(6)接着再次进入数据库:# mysql,然后输入如下的SQL语句:\> use Contacts; ---------------------------------------------------------------------------(进入到第四步创建的Contacts数据库中)\> source /root/users.mdb; --------------------------------------------------------------(将下载的文件生效到数据库中)\> show tables; -----------------------------------------------------------------------------(显示当前数据库中所有的数据表文件)\> grant select on Contacts.* to Luigi@'localhost' identified by 'redhat'; ----(设置数据库只能被localhost访问,数据库只能被Luigi查询,且设置好密码)\> set password=password('redhat'); -------------------------------------------------(设置root用户的登录密码为redhat)验证:此时在system1机器上操作:# mysql -uroot -predhat,才可以正常登录系统,说明配置生效。 【第四十题】数据库查询,在系统system1上使用数据库Contacts,并使用相应的SQL查询以回答下列问题:(a)密码是tangerine的人的名字?(b)有多少人的姓名是John同时居住在Santa Clara?操作步骤:(1)首先在system1机器上登录数据库:# mysql -uroot -predhat(2)进入mariadb数据库后输入如下:\> use Contacts; ----(进入到Contacts数据库)\> show tables; -----(显示数据库中所有的数据表)\> desc loc; ----------(查看loc数据表的表结构)\> desc name; -------(查看name数据表的表结构)\> desc pass; --------(查看pass数据表的表结构)\> select * from name join pass where name.aid=pass.bid and pass.password='tangerine';\> select count(*) from name join loc where name.aid=loc.cid and name.firstname='John' and loc.loction='Santa Clara';

优秀的个人博客,低调大师

「实战篇」开源项目docker化运维部署-搭建mysql集群(四)

有了docker虚拟机,就需要利用平台部署数据库的集群,在实际操作之前介绍下数据库集群的方案和各自的特点。源码:https://github.com/limingios/netFuture/tree/master/mysql-pxc/ 集群的方案单节点的弊病大型互联网程序用户群体庞大,所以架构必须要特殊设计单节点的数据库无法满足性能的要求案例15年前,高考成绩可以在网上查(河南几十万考生),那时候基本家里都没电脑,都是去网吧白天去网吧也查不了,太慢了,后来半夜通宵有时候可以查到,也就是说白天基本查不了人太多了。晚上看运气。一个数据库的实例1万多人就无法反应了。 单节点的数据库没有冗余设计,无法满足高可用常用的mysql集群设计方案Replication速度快弱一致性低价值场景:日志,新闻,帖子PXC速度慢强一致性高价值场景:订单,账户,财务Percona Xtradb Cluster,简称PXC。是基于Galera插件的MySQL集群。相比那些比较传统的基于主从复制模式的集群架构MHA和MM+keepalived,galera cluster最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,他们相互的关系是对等的。大数据学习扣qun74零零加【41三八yi】本身galera cluster也是一种多主架构。galera cluster最关注的是数据的一致性,对待事物的行为时,要么在所有节点上执行,要么都不执行,它的实现机制决定了它对待一致性的行为非常严格,这也能非常完美的保证MySQL集群的数据一致性。在PXC里面任何一个节点都是可读可写的。在其他的节点一定是可以读取到这个数据。 建议PXC使用PerconaServer(MYSQL的改进版,性能提升很大) PXC方案和Replication方案的对比 PXC任意一个节点都可以存在读写的方案,也就是任意一个节点都可以当读或者当写。同步复制。保证强一致性。 Replication方案,主从的方式,他是采用异步的方式。 PXC的数据强一致性同步复制,事务在所有节点要提交都提交。要么都不提交 Replication弱一致性,主要master成功就成功了。返回给调用者。如果slave失败,也没办法。因为已经告诉调用者成功了,调用者获取查询的时候查询不到信息。例如:在淘宝买个东西,付款也成功了,查询订单没信息是不是要骂娘。 环境搭建应用 IP地址 服务 配置 安装应用 安装方式docker-mysql 192.168.66.100 docker-mysql 双核 8g内存 docker-mysql docker(1). 虚拟机vagrant讲述安装的步骤 vagrant up (2).机器window/mac开通远程登录root用户下 su - 密码 vagrant 设置 PasswordAuthentication yes vi /etc/ssh/sshd_configsudo systemctl restart sshdPXC集群安装介绍PXC既可以在linux系统安装,也可以在docker上面安装。 安装镜像PXC镜像docker pull percona/percona-xtradb-cluster 本地安装 docker load /soft/pxc.tar.gz创建内部网络的处于安全,需要给PXC集群实例创建Docker内部网络,都出可虚拟机自带的网段是172.17.0., 这是内置的一个网段,当你创建了网络后,网段就更改为172.18.0., docker network create net1docker network inspect net1docker network rm net1 设置网段 docker network create --subnet=172.18.0.0/24 net1 创建Docker 卷一旦生成docker容器,不要在容器内保存业务的数据,要把数据放到宿主机上,可以把宿主机的一个目录映射到容器内,如果容器出现问题,只需要吧容器删除,重新建立一个新的容器把目录映射给新的容器。 之前一直有个疑问,如果直接映射目录的吧,存在失败的问题,现在终于知道解决方案了,直接映射docker卷就可以可以忽略这个问题了。 容器中的PXC节点映射数据目录的解决方法 docker volume create name --v1mysql pxc搭建脚本开发 !/bin/bash echo "创建网络"docker network create --subnet=172.18.0.0/24 net1 echo "创建5个docker卷"docker volume create v1docker volume create v2docker volume create v3docker volume create v4docker volume create v5 echo "创建节点 node1"docker run -d -p 3306:3306 --net=net1 --name=node1 \ -e CLUSTER_NAME=PXC \ -e MYSQL_ROOT_PASSWORD=a123456 \ -e XTRABACKUP_PASSWORD=a123456 \ -v v1:/var/lib/mysql \ --privileged \ --ip 172.18.0.2 \ percona/percona-xtradb-cluster sleep 1m echo "创建节点 node2"docker run -d -p 3307:3306 --net=net1 --name=node2 \ -e CLUSTER_NAME=PXC \ -e MYSQL_ROOT_PASSWORD=a123456 \ -e XTRABACKUP_PASSWORD=a123456 \ -e CLUSTER_JOIN=node1 \ -v v2:/var/lib/mysql \ --privileged \ --ip 172.18.0.3 \ percona/percona-xtradb-cluster sleep 1m echo "创建节点 node3"docker run -d -p 3308:3306 --net=net1 --name=node3 \ -e CLUSTER_NAME=PXC \ -e MYSQL_ROOT_PASSWORD=a123456 \ -e XTRABACKUP_PASSWORD=a123456 \ -e CLUSTER_JOIN=node1 \ -v v3:/var/lib/mysql \ --privileged \ --ip 172.18.0.4 \ percona/percona-xtradb-cluster sleep 1m echo "创建节点 node4"docker run -d -p 3309:3306 --net=net1 --name=node4 \ -e CLUSTER_NAME=PXC \ -e MYSQL_ROOT_PASSWORD=a123456 \ -e XTRABACKUP_PASSWORD=a123456 \ -e CLUSTER_JOIN=node1 \ -v v4:/var/lib/mysql \ --privileged \ --ip 172.18.0.5 \ percona/percona-xtradb-cluster sleep 1m echo "创建节点 node5"docker run -d -p 3310:3306 --net=net1 --name=node5 \ -e CLUSTER_NAME=PXC \ -e MYSQL_ROOT_PASSWORD=a123456 \ -e XTRABACKUP_PASSWORD=a123456 \ -e CLUSTER_JOIN=node1 \ -v v5:/var/lib/mysql \ --privileged \ --ip 172.18.0.6 \ percona/percona-xtradb-cluster 新建立一个aaa数据库 结果都可以用 哇塞就这么简单,成功的搭建了mysql的集群 增加负载均衡方案目前数据库都是独立的ip,在开发的时候总不能随机连接一个数据库吧。如果想请求,统一的口径,这就需要搭建负载均衡了。虽然上边已经搭建了集群,但是不使用数据库负载均衡,单节点处理所有请求,负载高,性能差。下图就是一个节点很忙,其他节点很闲。 调整后的方案,使用Haproxy做负载均衡,请求被均匀分发到每个节点,单节点的负载低,性能好。haproxy不是数据库,只是一个转发器。 负载均衡中间件对比LVS是不知道在虚拟机环境下安装的。 安装haproxydocker-haproxy的介绍:https://hub.docker.com/_/haproxy/ 配置文件mkdir haproxy/h1pwdvi haproxy.cfg haproxy.cfg配置登录:admin密码:abc123456 global #工作目录 chroot /usr/local/etc/haproxy #日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info log 127.0.0.1 local5 info #守护进程运行 daemon defaults log global mode http #日志格式 option httplog #日志中不记录负载均衡的心跳检测记录 option dontlognull #连接超时(毫秒) timeout connect 5000 #客户端超时(毫秒) timeout client 50000 #服务器超时(毫秒) timeout server 50000 监控界面 listen admin_stats #监控界面的访问的IP和端口 bind 0.0.0.0:8888 #访问协议 mode http #URI相对地址 stats uri /dbs #统计报告格式 stats realm Global\ statistics #登陆帐户信息 stats auth admin:abc123456 数据库负载均衡 listen proxy-mysql #访问的IP和端口 bind 0.0.0.0:3306 #网络协议 mode tcp #负载均衡算法(轮询算法) #轮询算法:roundrobin #权重算法:static-rr #最少连接算法:leastconn #请求源IP算法:source balance roundrobin #日志格式 option tcplog #在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测 option mysql-check user haproxy server MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000 server MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000 server MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000 server MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000 server MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000 #使用keepalive检测死链 option tcpka 创建docker下的haproxy容器docker run -it -d -p 4001:8888 \-p 4002:3306 \-v /root/haproxy/h1:/usr/local/etc/haproxy \--name h1 --privileged --net=net1 \--ip 172.18.0.7 haproxy 进入容器后,加载配置文件docker exec -it h1 /bin/bashhaproxy -f /usr/local/etc/haproxy/haproxy.cfg 在数据库中创建一个haproxy的用户,不需要设置密码 登录haproxy网页端http://192.168.66.100:4001/dbs 客户端连接haproxy-mysql数据库 正常的连接haproxy,传递增删盖查,其实是通过轮询的方式。选择mysql的节点。均匀的分发给mysql的实例。不会吧数据库的请求都集中在一个节点上。把请求分散出去,每个数据库实例获取到的请求就小很多了。这就是数据库的负载。 虚拟机重启后,发现pxc起不起来了查看日志发现,node1无法启动,输入命令查看docker logs node1 It may not be safe to bootstrap the cluster from this node. It was not the last one to leave the cluster and may not contain all the updates. To force cluster bootstrap with this node, edit the grastate.dat file manually and set safe_to_bootstrap to 1 .解决方案 查看node1挂载点的文件地址 docker volume inspect v1 进入目录下 cd /var/lib/docker/volumes/v1/_data 编辑文件grastate.dat vi grastate.dat 高可用负载均衡方案目前haproxy只有一个,单haproxy不具备高可用,必须冗余设计。haproxy不能形成瓶颈。 虚拟IP技术haproxy双机互备离不开一个关键的技术,这个技术是虚拟IP,linux可以在一个网卡内定义多个虚拟IP,得把这些IP地址定义到一个虚拟IP。 利用keepalived实现双机热备定义出来一个虚拟IP,这个方案叫双机热备,准备2个keepalived,keepalived 就是为了抢占虚拟IP的,谁手快谁能抢到,没抢到的处于等待的状态。抢到的叫做主服务器,未抢到的叫做备服务器。两个keepalived之前有心跳检测的,当备用的检测到主服务挂了,就立马抢占虚拟IP。 Haproxy双机热备方案 安装keepalived keepalived必须在haproxy所在的容器之内,也可以在docker仓库里面下载一个haproxy-keepalived的镜像。这里直接在容器内安装keepalived。 docker exec -it h1 /bin/bash 写入dns,防止apt-get update找不到服务器 echo "nameserver 8.8.8.8" | tee /etc/resolv.conf > /dev/null apt-get cleanapt-get updateapt-get install vimvi /etc/apt/sources.list sources.list 添加下面的内容 deb http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse deb-src http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse deb http://mirrors.163.com/ubuntu/ precise-security universe main multiverse restricted deb-src http://mirrors.163.com/ubuntu/ precise-security universe main multiverse restricted deb http://mirrors.163.com/ubuntu/ precise-updates universe main multiverse restricted deb http://mirrors.163.com/ubuntu/ precise-proposed universe main multiverse restricted deb-src http://mirrors.163.com/ubuntu/ precise-proposed universe main multiverse restricted deb http://mirrors.163.com/ubuntu/ precise-backports universe main multiverse restricted deb-src http://mirrors.163.com/ubuntu/ precise-backports universe main multiverse restricted deb-src http://mirrors.163.com/ubuntu/ precise-updates universe main multiverse restricted 更新apt源apt-get cleanapt-get updateapt-get install keepalivedapt-get install vim keepalived配置文件容器内的路径:/etc/keepalived/keepalived.conf vi /etc/keepalived/keepalived.conf VI_1 名称可以自定义state MASTER | keepalived的身份(MASTER主服务器,BACKUP备份服务器,不会抢占虚拟机ip)。如果都是主MASTER的话,就会进行互相争抢IP,如果抢到了就是MASTER,另一个就是SLAVE。interface网卡,定义一个虚拟IP定义到那个网卡上边。网卡设备的名称。eth0是docker的虚拟网卡,宿主机是可以访问的。virtual_router_id 51 | 虚拟路由标识,MASTER和BACKUP的虚拟路由标识必须一致。标识可以是0-255。priority 100 | 权重。MASTER权重要高于BACKUP 数字越大优选级越高。可以根据硬件的配置来完成,权重最大的获取抢到的级别越高。advert_int 1 | 心跳检测。MASTER与BACKUP节点间同步检查的时间间隔,单位为秒。主备之间必须一致。authentication | 主从服务器验证方式。主备必须使用相同的密码才能正常通信。进行心跳检测需要登录到某个主机上边所有有账号密码。virtual_ipaddress | 虚拟ip地址,可以设置多个虚拟ip地址,每行一个。根据上边配置的eth0上配置的ip。启动keeplived容器内启动 service keepalived start 宿主机ping这个ip ping 172.18.0.201 创建haproxy2容器,并配置与haproxy1相同的环境因为要保证有2个haproxy 和keepalived,这次就不那么麻烦了。直接对一个镜像里面包括keeplived 和 haproxy。 宿主机创建文件mkdir haproxy/h2cd haproxy/h2vi haproxy.cfgvi keepalived.cfg haproxy.cfg global #工作目录 chroot /usr/local/etc/haproxy #日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info log 127.0.0.1 local5 info #守护进程运行 daemon defaults log global mode http #日志格式 option httplog #日志中不记录负载均衡的心跳检测记录 option dontlognull #连接超时(毫秒) timeout connect 5000 #客户端超时(毫秒) timeout client 50000 #服务器超时(毫秒) timeout server 50000 监控界面 listen admin_stats #监控界面的访问的IP和端口 bind 0.0.0.0:8888 #访问协议 mode http #URI相对地址 stats uri /dbs #统计报告格式 stats realm Global\ statistics #登陆帐户信息 stats auth admin:abc123456 数据库负载均衡 listen proxy-mysql #访问的IP和端口 bind 0.0.0.0:3306 #网络协议 mode tcp #负载均衡算法(轮询算法) #轮询算法:roundrobin #权重算法:static-rr #最少连接算法:leastconn #请求源IP算法:source balance roundrobin #日志格式 option tcplog #在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测 option mysql-check user haproxy server MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000 server MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000 server MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000 server MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000 server MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000 #使用keepalive检测死链 option tcpka keepalived.cfgvrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 172.18.0.201 } }docker的方式一下安装好 haproxy 和keepalivedhttps://hub.docker.com/r/pelin/haproxy-keepalived/映射端口更改为4003 4004 name修改h2 docker run -it -d --privileged -p 4003:8888\ -p 4004:3306 \ -v /root/haproxy/h2/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg \ -v /root/haproxy/h2/keepalived.conf:/etc/keepalived/keepalived.conf \ --name haproxy-keepalived \ --net=net1 \ --name h2 \ --ip 172.18.0.8 \ pelin/haproxy-keepalived 宿主机安装keepalivedyum -y install keepalivedvi /etc/keepalived/keepalived.conf 删除这个表里之前存在的内容 keepalived.cof vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.66.200 } } virtual_server 192.168.66.200 8888 { delay_loop 3 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 172.18.0.201 8888 { weight 1 } } virtual_server 192.168.66.200 3306 { delay_loop 3 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 172.18.0.201 3306 { weight 1 } } 启动宿主机service keepalived start 虚拟机端口转发 外部无法访问 WARNING: IPv4 forwarding is disabled. Networking will not work.解决方案宿主机修改 vi /etc/sysctl.conf 添加net.ipv4.ip_forward=1 systemctl restart network PS:如果通过docker的方式直接拉取haproxy和keepalived镜像,比直接在镜像里面安装应用方便很多,建议各位老铁尽量避免在容器内安装应用,这样真心麻烦不爽,别人封装的镜像根据pull的量好好看看api就可以使用了。像h1如果容器stop后,重新start,还需要进入容器把keeplived给起起来。而h2直接start里面的haproxy和keeplived,同时都起起来了。 两个容器的采用的热备的方案,让用户毫无感知,切换ip的形式真是美滋滋。mysql集群的高性能,高负载,高可用基本完成了,可用按照这个思路搭建不同的主机下。

优秀的个人博客,低调大师

超详细:自动化运维之jumpserver堡垒机入门到掌握

测试推荐环境 CPU: 64位双核处理器 内存: 4G DDR3 数据库:mysql 版本大于等于 5.6 mariadb 版本大于等于 5.5.6 环境 系统: CentOS 7 IP: 192.168.0.230 设置 selinux 和防火墙 [root@web1 ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:c5:33:97 brd ff:ff:ff:ff:ff:ff inet 192.168.0.230/24 brd 192.168.0.255 scope global noprefixroute dynamic ens33 valid_lft 4169sec preferred_lft 4169sec inet6 fe80::20c:29ff:fec5:3397/64 scope link valid_lft forever preferred_lft forever [root@web1 ~]# iptables -F [root@web1 ~]# iptables -X [root@web1 ~]# iptables -Z [root@web1 ~]# getenforce Disabled [root@web1 ~]# # 修改字符集, 否则可能报 input/output error的问题, 因为日志里打印了中文 [root@web1 ~]# localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 [root@web1 ~]# export LC_ALL=zh_CN.UTF-8 [root@web1 ~]# echo 'LANG="zh_CN.UTF-8"' > /etc/locale.conf 一. 准备 Python3 和 Python 虚拟环境 1.1 安装依赖包 [root@web1 ~]# yum -y install wget gcc epel-release git 1.2 安装 Python3.6 [root@web1 ~]# yum -y install python36 python36-devel # 如果下载速度很慢, 可以换国内源 [root@web1 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo [root@web1 ~]# yum -y install python36 python36-devel 1.3 建立 Python 虚拟环境因为 CentOS 7 自带的是 Python2, 而 Yum 等工具依赖原来的 Python, 为了不扰乱原来的环境我们来使用 Python 虚拟环境 [root@web1 ~]# cd /opt [root@web1 opt]# python3.6 -m venv py3 [root@web1 opt]# source /opt/py3/bin/activate # 看到下面的提示符代表成功, 以后运行 Jumpserver 都要先运行以上 source 命令, 以下所有命令均在该虚拟环境中运行(py3) [root@localhost py3] 二. 安装 Jumpserver 2.1 下载或 Clone 项目 项目提交较多 git clone 时较大, 你可以选择去 Github 项目页面直接下载zip包。 [root@web1 opt ]# cd /opt/ [root@web1 opt ]# git clone https://github.com/jumpserver/jumpserver.git 2.2 安装依赖 RPM 包 [root@web1 ~]# cd /opt/jumpserver/requirements [root@web1 requirements ]# yum -y install $(cat rpm_requirements.txt) # 如果没有任何报错请继续 2.3 安装 Python 库依赖 [root@web1 requirements ]# pip install --upgrade pip setuptools [root@web1 requirements ]# pip install -r requirements.txt 或者 # 如果下载速度很慢, 可以换国内源 [root@web1 requirements ]# pip install --upgrade pip setuptools -i https://mirrors.aliyun.com/pypi/simple/ [root@web1 requirements ]# pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ 2.4 安装 Redis, Jumpserver 使用 Redis 做 cache 和 celery broke [root@web1 requirements ]# yum -y install redis [root@web1 requirements ]# systemctl enable redis [root@web1 requirements ]# systemctl start redis 2.5 安装 MySQL 本教程使用 Mysql 作为数据库, 如果不使用 Mysql 可以跳过相关 Mysql 安装和配置 [root@web1 requirements ]# yum -y install mariadb mariadb-devel mariadb-server # centos7下安装的是mariadb [root@web1 requirements ]# systemctl enable mariadb [root@web1 requirements ]# systemctl start mariadb 2.6 创建数据库 Jumpserver 并授权 [root@web1 requirements ]# DB_PASSWORD=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 24` # 生成随机数据库密码 [root@web1 requirements ]# echo -e "\033[31m 你的数据库密码是 $DB_PASSWORD \033[0m" [root@web1 requirements ]# mysql -uroot -e "create database jumpserver default charset 'utf8'; grant all on jumpserver.* to 'jumpserver'@'127.0.0.1' identified by '$DB_PASSWORD'; flush privileges;" 2.7 修改 Jumpserver 配置文件 [root@web1 requirements ]# cd /opt/jumpserver [root@web1 jumpserver]# cp config_example.yml config.yml [root@web1 jumpserver]# SECRET_KEY=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 50` # 生成随机SECRET_KEY [root@web1 jumpserver]# BOOTSTRAP_TOKEN=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 16` # 生成随机BOOTSTRAP_TOKEN [root@web1 jumpserver]# sed -i "s/SECRET_KEY:/SECRET_KEY: $SECRET_KEY/g" /opt/jumpserver/config.yml [root@web1 jumpserver]# sed -i "s/BOOTSTRAP_TOKEN:/BOOTSTRAP_TOKEN: $BOOTSTRAP_TOKEN/g" /opt/jumpserver/config.yml [root@web1 jumpserver]# sed -i "s/# DEBUG: true/DEBUG: false/g" /opt/jumpserver/config.yml [root@web1 jumpserver]# sed -i "s/# LOG_LEVEL: DEBUG/LOG_LEVEL: ERROR/g" /opt/jumpserver/config.yml [root@web1 jumpserver]# sed -i "s/# SESSION_EXPIRE_AT_BROWSER_CLOSE: false/SESSION_EXPIRE_AT_BROWSER_CLOSE: true/g" /opt/jumpserver/config.yml [root@web1 jumpserver]# sed -i "s/DB_PASSWORD: /DB_PASSWORD: $DB_PASSWORD/g" /opt/jumpserver/config.yml [root@web1 jumpserver]# echo -e "\033[31m 你的SECRET_KEY是 $SECRET_KEY \033[0m" [root@web1 jumpserver]# echo -e "\033[31m 你的BOOTSTRAP_TOKEN是 $BOOTSTRAP_TOKEN \033[0m" [root@web1 jumpserver]# cat config.yml # 确认内容有没有错误 # SECURITY WARNING: keep the secret key used in production secret! # 加密秘钥 生产环境中请修改为随机字符串,请勿外泄, 可使用命令生成 # $ cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 49;echo SECRET_KEY: 7hB9ogGBpfqqW3uqg5l8vq49FBbOKXESDaWfjvI5hdYBytfjXt # SECURITY WARNING: keep the bootstrap token used in production secret! # 预共享Token coco和guacamole用来注册服务账号,不在使用原来的注册接受机制 BOOTSTRAP_TOKEN: IAvMqFnKUvmjjlLb # Development env open this, when error occur display the full process track, Production disable it # DEBUG 模式 开启DEBUG后遇到错误时可以看到更多日志 DEBUG: false # DEBUG, INFO, WARNING, ERROR, CRITICAL can set. See https://docs.djangoproject.com/en/1.10/topics/logging/ # 日志级别 LOG_LEVEL: ERROR # LOG_DIR: # Session expiration setting, Default 24 hour, Also set expired on on browser close # 浏览器Session过期时间,默认24小时, 也可以设置浏览器关闭则过期 # SESSION_COOKIE_AGE: 86400 SESSION_EXPIRE_AT_BROWSER_CLOSE: true # Database setting, Support sqlite3, mysql, postgres .... # 数据库设置 # See https://docs.djangoproject.com/en/1.10/ref/settings/#databases # SQLite setting: # 使用单文件sqlite数据库 # DB_ENGINE: sqlite3 # DB_NAME: # MySQL or postgres setting like: # 使用Mysql作为数据库 DB_ENGINE: mysql DB_HOST: 127.0.0.1 DB_PORT: 3306 DB_USER: jumpserver DB_PASSWORD: cK2VQVUV16Q8F2U41flDfAFb DB_NAME: jumpserver # When Django start it will bind this host and port # ./manage.py runserver 127.0.0.1:8080 # 运行时绑定端口 HTTP_BIND_HOST: 0.0.0.0 HTTP_LISTEN_PORT: 8080 # Use Redis as broker for celery and web socket # Redis配置 REDIS_HOST: 127.0.0.1 REDIS_PORT: 6379 # REDIS_PASSWORD: # REDIS_DB_CELERY: 3 # REDIS_DB_CACHE: 4 # Use OpenID authorization # 使用OpenID 来进行认证设置 # BASE_SITE_URL: http://localhost:8080 # AUTH_OPENID: false # True or False # AUTH_OPENID_SERVER_URL: https://openid-auth-server.com/ # AUTH_OPENID_REALM_NAME: realm-name # AUTH_OPENID_CLIENT_ID: client-id # AUTH_OPENID_CLIENT_SECRET: client-secret # OTP settings # OTP/MFA 配置 # OTP_VALID_WINDOW: 0 # OTP_ISSUER_NAME: Jumpserver 2.8 运行 Jumpserver [root@web1 jumpserver]# ./jms start all -d # 后台运行使用 -d 参数./jms start all -d # 新版本更新了运行脚本, 使用方式./jms start|stop|status|restart all 后台运行请添加 -d 参数 如果运行不报错, 请继续往下操作 三. 安装 SSH Server 和 WebSocket Server: Coco 3.1 下载或 Clone 项目 [root@web1 jumpserver]# cd /opt [root@web1 opt]# source /opt/py3/bin/activate [root@web1 opt]# git clone https://github.com/jumpserver/coco.git 3.2 安装依赖 [root@web1 opt]# cd /opt/coco/requirements [root@web1 requirements]# yum -y install $(cat rpm_requirements.txt) [root@web1 requirements]# pip install -r requirements.txt # 如果下载速度很慢, 可以换国内源 [root@web1 requirements]# pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ 3.3 修改配置文件并运行 [root@web1 requirements]# cd /opt/coco [root@web1 coco]# cp config_example.yml config.yml [root@web1 coco]# sed -i "s/BOOTSTRAP_TOKEN: <PleasgeChangeSameWithJumpserver>/BOOTSTRAP_TOKEN: $BOOTSTRAP_TOKEN/g" /opt/coco/config.yml [root@web1 coco]# sed -i "s/# LOG_LEVEL: INFO/LOG_LEVEL: ERROR/g" /opt/coco/config.yml [root@web1 coco]# cat config.yml # 项目名称, 会用来向Jumpserver注册, 识别而已, 不能重复 # NAME: {{ Hostname }} # Jumpserver项目的url, api请求注册会使用 CORE_HOST: http://127.0.0.1:8080 # Bootstrap Token, 预共享秘钥, 用来注册coco使用的service account和terminal # 请和jumpserver 配置文件中保持一致,注册完成后可以删除 BOOTSTRAP_TOKEN: IAvMqFnKUvmjjlLb # 启动时绑定的ip, 默认 0.0.0.0 # BIND_HOST: 0.0.0.0 # 监听的SSH端口号, 默认2222 # SSHD_PORT: 2222 # 监听的HTTP/WS端口号,默认5000 # HTTPD_PORT: 5000 # 项目使用的ACCESS KEY, 默认会注册,并保存到 ACCESS_KEY_STORE中, # 如果有需求, 可以写到配置文件中, 格式 access_key_id:access_key_secret # ACCESS_KEY: null # ACCESS KEY 保存的地址, 默认注册后会保存到该文件中 # ACCESS_KEY_FILE: data/keys/.access_key # 加密密钥 # SECRET_KEY: null # 设置日志级别 [DEBUG, INFO, WARN, ERROR, FATAL, CRITICAL] LOG_LEVEL: ERROR # 日志存放的目录 # LOG_DIR: logs # SSH白名单 # ALLOW_SSH_USER: all # SSH黑名单, 如果用户同时在白名单和黑名单,黑名单优先生效 # BLOCK_SSH_USER: # - # 和Jumpserver 保持心跳时间间隔 # HEARTBEAT_INTERVAL: 5 # Admin的名字,出问题会提示给用户 # ADMINS: '' # SSH连接超时时间 (default 15 seconds) # SSH_TIMEOUT: 30 # 语言 [en,zh] # LANGUAGE_CODE: zh # SFTP的根目录, 可选 /tmp, Home其他自定义目录 # SFTP_ROOT: /server/jms_sftp # SFTP是否显示隐藏文件 # SFTP_SHOW_HIDDEN_FILE: false [root@web1 coco]# source /opt/py3/bin/activate (py3) [root@web1 coco]# ./cocod start -d # 后台运行使用 -d 参数./cocod start -d Use eventlet dispatch Stop coco process Start coco process (py3) [root@web1 coco]# # 新版本更新了运行脚本, 使用方式./cocod start|stop|status|restart 后台运行请添加 -d 参数 四. 安装 Web Terminal 前端: Luna Luna 已改为纯前端, 需要 Nginx 来运行访问访问(https://github.com/jumpserver/luna/releases)下载对应版本的 release 包, 直接解压不需要编译4.1 解压 Luna (py3) [root@web1 coco]# cd /opt/ (py3) [root@web1 opt]# wget https://github.com/jumpserver/luna/releases/download/1.4.8/luna.tar.gz (py3) [root@web1 opt]# tar xf luna.tar.gz (py3) [root@web1 opt]# chown -R root:root luna 五. 安装 Windows 支持组件(如果不需要管理 windows 资产, 可以直接跳过这一步) 5.1 安装依赖 (py3) [root@web1 opt]# mkdir /usr/local/lib/freerdp/ (py3) [root@web1 opt]# ln -s /usr/local/lib/freerdp /usr/lib64/freerdp (py3) [root@web1 opt]# rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro (py3) [root@web1 opt]# rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm (py3) [root@web1 opt]# yum -y localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-7.noarch.rpm (py3) [root@web1 opt]# yum install -y java-1.8.0-openjdk libtool (py3) [root@web1 opt]# yum install -y cairo-devel libjpeg-turbo-devel libpng-devel uuid-devel (py3) [root@web1 opt]# yum install -y ffmpeg-devel freerdp-devel freerdp-plugins pango-devel libssh2-devel libtelnet-devel libvncserver-devel pulseaudio-libs-devel openssl-devel libvorbis-devel libwebp-devel ghostscript 5.2 编译安装 guacamole 服务 (py3) [root@web1 opt]# cd /opt (py3) [root@web1 opt]# git clone https://github.com/jumpserver/docker-guacamole.git (py3) [root@web1 opt]# cd /opt/docker-guacamole/ (py3) [root@web1 docker-guacamole ]# tar -xf guacamole-server-0.9.14.tar.gz (py3) [root@web1 docker-guacamole ]# cd guacamole-server-0.9.14 (py3) [root@web1 guacamole-server-0.9.14 ]# autoreconf -fi (py3) [root@web1 guacamole-server-0.9.14 ]# ./configure --with-init-dir=/etc/init.d (py3) [root@web1 guacamole-server-0.9.14 ]# make && make install (py3) [root@web1 guacamole-server-0.9.14 ]# cd .. (py3) [root@web1 docker-guacamole ]# rm -rf guacamole-server-0.9.14 (py3) [root@web1 docker-guacamole ]# ldconfig 5.3 配置 Tomcat (py3) [root@web1 docker-guacamole ]# mkdir -p /config/guacamole /config/guacamole/lib /config/guacamole/extensions # 创建 guacamole 目录 (py3) [root@web1 docker-guacamole ]# ln -sf /opt/docker-guacamole/guacamole-auth-jumpserver-0.9.14.jar /config/guacamole/extensions/guacamole-auth-jumpserver-0.9.14.jar (py3) [root@web1 docker-guacamole ]# ln -sf /opt/docker-guacamole/root/app/guacamole/guacamole.properties /config/guacamole/guacamole.properties # guacamole 配置文件 (py3) [root@web1 docker-guacamole ]# cd /config (py3) [root@web1 config ]# wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.38/bin/apache-tomcat-8.5.38.tar.gz (py3) [root@web1 config ]# tar xf apache-tomcat-8.5.38.tar.gz (py3) [root@web1 config ]# rm -rf apache-tomcat-8.5.38.tar.gz (py3) [root@web1 config ]# mv apache-tomcat-8.5.38 tomcat8 (py3) [root@web1 config ]# rm -rf /config/tomcat8/webapps/* (py3) [root@web1 config ]# ln -sf /opt/docker-guacamole/guacamole-0.9.14.war /config/tomcat8/webapps/ROOT.war # guacamole client (py3) [root@web1 config ]# sed -i 's/Connector port="8080"/Connector port="8081"/g' /config/tomcat8/conf/server.xml # 修改默认端口为 8081 (py3) [root@web1 config ]# sed -i 's/FINE/WARNING/g' /config/tomcat8/conf/logging.properties # 修改 log 等级为 WARNING (py3) [root@web1 config ]# wget https://github.com/ibuler/ssh-forward/releases/download/v0.0.5/linux-amd64.tar.gz (py3) [root@web1 config ]# tar xf linux-amd64.tar.gz -C /bin/ (py3) [root@web1 config ]# chmod +x /bin/ssh-forward 5.4 配置环境变量 (py3) [root@web1 config ]# export JUMPSERVER_SERVER=http://127.0.0.1:8080 # http://127.0.0.1:8080 指 jumpserver 访问地址 $ echo "export JUMPSERVER_SERVER=http://127.0.0.1:8080" >> ~/.bashrc # BOOTSTRAP_TOKEN 为 Jumpserver/config.yml 里面的 BOOTSTRAP_TOKEN (py3) [root@web1 config ]# export BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN (py3) [root@web1 config ]# echo "export BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN" >> ~/.bashrc (py3) [root@web1 config ]# export JUMPSERVER_KEY_DIR=/config/guacamole/keys (py3) [root@web1 config ]# echo "export JUMPSERVER_KEY_DIR=/config/guacamole/keys" >> ~/.bashrc (py3) [root@web1 config ]# export GUACAMOLE_HOME=/config/guacamole (py3) [root@web1 config ]# echo "export GUACAMOLE_HOME=/config/guacamole" >> ~/.bashrc 5.5 启动 Guacamole (py3) [root@web1 config ]# /etc/init.d/guacd start (py3) [root@web1 config ]# sh /config/tomcat8/bin/startup.sh 六. 配置 Nginx 整合各组件 6.1 安装 Nginx (py3) [root@web1 config ]# yum install yum-utils (py3) [root@web1 config ]# vi /etc/yum.repos.d/nginx.repo [nginx-stable]name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1enabled=1gpgkey=https://nginx.org/keys/nginx_signing.key (py3) [root@web1 config ]# yum install -y nginx (py3) [root@web1 config ]# rm -rf /etc/nginx/conf.d/default.conf (py3) [root@web1 config ]# systemctl enable nginx 6.2 准备配置文件 修改 /etc/nginx/conf.d/jumpserver.conf (py3) [root@web1 config ]# vi /etc/nginx/conf.d/jumpserver.conf server { listen 80; # 代理端口, 以后将通过此端口进行访问, 不再通过8080端口 # server_name demo.jumpserver.org; # 修改成你的域名或者注释掉 client_max_body_size 100m; # 录像及文件上传大小限制 location /luna/ { try_files $uri / /index.html; alias /opt/luna/; # luna 路径, 如果修改安装目录, 此处需要修改 } location /media/ { add_header Content-Encoding gzip; root /opt/jumpserver/data/; # 录像位置, 如果修改安装目录, 此处需要修改 } location /static/ { root /opt/jumpserver/data/; # 静态资源, 如果修改安装目录, 此处需要修改 } location /socket.io/ { proxy_pass http://localhost:5000/socket.io/; # 如果coco安装在别的服务器, 请填写它的ip proxy_buffering off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; access_log off; } location /coco/ { proxy_pass http://localhost:5000/coco/; # 如果coco安装在别的服务器, 请填写它的ip proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; access_log off; } location /guacamole/ { proxy_pass http://localhost:8081/; # 如果guacamole安装在别的服务器, 请填写它的ip proxy_buffering off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; access_log off; } location / { proxy_pass http://localhost:8080; # 如果jumpserver安装在别的服务器, 请填写它的ip proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }} 6.3 运行 Nginx (py3) [root@web1 config ]# nginx -t # 确保配置没有问题, 有问题请先解决 # CentOS 7 (py3) [root@web1 config ]# systemctl start nginx (py3) [root@web1 config ]# systemctl enable nginx 6.4 开始使用 Jumpserver检查应用是否已经正常运行服务全部启动后, 访问http://192.168.0.230, 访问nginx代理的端口, 不要再通过8080端口访问默认账号: admin 密码: admin到Jumpserver 会话管理-终端管理 检查 Coco Guacamole 等应用的注册。 测试连接 如果登录客户端是 macOS 或 Linux, 登录语法如下 $ ssh -p2222 admin@192.168.244.144 $ sftp -P2222 admin@192.168.244.144 密码: admin 如果登录客户端是 Windows, Xshell Terminal 登录语法如下 $ ssh admin@192.168.244.144 2222 $ sftp admin@192.168.244.144 2222 密码: admin 如果能登陆代表部署成功 # sftp默认上传的位置在资产的 /tmp 目录下# windows拖拽上传的位置在资产的 Guacamole RDP上的 G 目录下 设置授权规则,重新连接 [root@web1 ~]# ssh leoheng@192.168.0.230 -p 2222 leoheng@192.168.0.230's password: leoheng, 欢迎使用Jumpserver开源跳板机系统 1) 输入 ID 直接登录 或 输入部分 IP,主机名,备注 进行搜索登录(如果唯一). 2) 输入 / + IP, 主机名 or 备注 搜索. 如: /ip 3) 输入 p 显示您有权限的主机. 4) 输入 g 显示您有权限的节点. 5) 输入 g + 节点ID 显示节点下主机. 如: g1 6) 输入 s 中/英文切换. 7) 输入 h 帮助. 0) 输入 r 刷新最新的机器和节点信息. 0) 输入 q 退出. Opt> p ID 主机名 IP 登录用户 备注 1 k8s 192.168.0.228 [leo] 页码: 1, 数量: 1, 总页数: 1, 总数量: 1 Opt> 1 开始连接到 leo@k8s 1.1 Last login: Fri Mar 8 15:11:05 2019 from 192.168.0.230 [leo@k8s ~]$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:1f:fd:1b brd ff:ff:ff:ff:ff:ff inet 192.168.0.228/24 brd 192.168.0.255 scope global noprefixroute dynamic ens33 valid_lft 6579sec preferred_lft 6579sec inet6 fe80::20c:29ff:fe1f:fd1b/64 scope link valid_lft forever preferred_lft forever 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:c5:84:a3:7c brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 scope global docker0 valid_lft forever preferred_lft forever [leo@k8s ~]$ 6.5 设置邮件服务 (py3) [root@web1 opt]# yum install -y mailx ##安装邮件服务 (py3) [root@web1 opt]# vim /etc/mail.rc ##在配置文件最后添加 set from=**@****.com #(需修改)收件人显示的发件人名称,可填写你的名字等 set smtp=smtp.ym.163.com (需修改)你所使用的外部邮箱的smtp服务器地址,这里使用163的邮件服务器 set smtp-auth-user=**@****.com (需修改)你所使用的外部邮箱的用户名 set smtp-auth-password=******* (需修改)你所使用的外部邮箱密码 set smtp-auth=login 测试邮件发送 (py3) [root@web1 opt]# echo 111 |mailx -v -s "test info" ******@qq.com Resolving host smtp.ym.163.com . . . done. Connecting to 59.111.176.15:smtp . . . connected. 220 proxy-sm2.ym.internal ESMTP ready >>> EHLO web1 250-proxy-sm2.ym.internal 250-PIPELINING 250-8BITMIME 250-AUTH=LOGIN PLAIN 250-AUTH PLAIN LOGIN 250 STARTTLS >>> AUTH LOGIN 334 VXNlcm5hbWU6 >>> a2JAYnV5ZXJjYW1wLmNvbQ== 334 UGFzc3dvcmQ6 >>> YWNiZDY1NDMyMQ== 235 2.0.0 OK >>> MAIL FROM:<**@******.com> 250 2.1.0 Ok >>> RCPT TO:<******@qq.com> 250 2.1.5 Ok >>> DATA 354 End data with <CR><LF>.<CR><LF> >>> . 250 2.0.0 Ok: queued as 77CE7B41A88 >>> QUIT 221 2.0.0 Bye 邮箱收件情况 设置jms的邮件发送 更多的博客转移到个人博客上了,请点击以下链接:个人博客

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册