运维工作
一.系统
硬件----部署操作系统---多个主机
如何高效的安装操作系统
1.部署在裸机上的操作系统 bare metal
pxe预执行环境:网卡自身有一个rom,可以自己加载来获得IP地址,能够到文件服务器上加载bootloader文件,依赖于网卡和网络预先提供的安装服务
但是pxe只能预引导1中操作系统
二次封装的pxe:cobbler 将多版本的操作系统环境支持 *
【但是都需要支持pxe】
2.虚拟机器 virtual machine *
二.程序
configurtion 自动完成安装程序,到配置文件的都可以完成
puppet(ruby)所有互联网公司都在使用 *
saltstack(python)与puppet一个作用 开发语言不同而已
【两者都很重量级,没有达到几十上百台不能良好发挥,成本也高,门槛也高】
所以,有了ansible,早些年的chef,cfengine等configurtion
三.操作
command and control:批量运行一些命令,统一命令操作工具
fabric(python):轻量级
func
ansible *
以及监控工具*
四.程序发布(电子商城,论坛)
1.人工智能(手动发布)
2.脚本
3.发布程序:公司内部研发的专门的运维程序框架
要求:
1.【给飞行中的飞机(双发)换发动机】
不能影响用户体验
2.系统不能停机
3.不能导致系统故障或系统完全不可用
【程序发布一般不会在访问量很多的白天进行,=并且在系统部署的时候要留有性能空间,即便停止一部分设备,剩余的也可以轻松的处理请求,所以部署的时候要预留30%左右的性能,但是又容易造成性能浪费,所以有了弹性计算】
弹性计算:如果发现用户量很小,一批一批的而关闭主机,用户量大的时候,一批批的开启
灰度模型:
一次只更新一部分主机,一般在凌晨,访问量较小,将一部分的权重该为零,然后停止服务器,添加新应用,重启,改回正常的权重,然后看请求是不是正常进行,正常就依次重启
1.基于主机做灰度
2.基于用户做灰度
发布路径
在调度器上下线一批主机(标记为维护模式--软离线)---关闭服务(后端主机的服务)----部署新版本---启动服务(后端主机服务)----调度器上启动这些主机
版本上线 应用程序发布
问题:
1.但是如果有回话怎么办
一般session都是放在server上的
【http的长连接是不超过10秒的,权重设置为0的等10秒就好了可以下线(冷模式,一定要停掉,反正已经下线了)了,有回话就等回话的最长时间】
2.发了新版本后发现有bug怎么办
回滚
3.如果用户上传文件了怎么办,又不能覆盖
一般nginx可以将用户上传的文件(静态)单独放到一个目录或服务器来,到时候软连接等就好
五.运维工具分类
管理主机需要拥有被管理主机的特殊权限,但是不安全,所以有了两种方式
无agent(agentless): ansible,
ssh,但是管理主机会有被管理主机的管理员用户账号密码,如果管理主机沦陷,后边的都有危险,于是,都创建一个基于sodu命令的用户
agent:puppet,func
每个主机都装一个程序,2者通过一个加密协议来进行通信,该进程由管理员的身份运行,所有命令都基于该程序运行,也就都有了被管理主机的管理员的权限
六.ansible:能够兼具以上四种功能的工具,第二种第三种完整提供【第一种在开发,第四种要自己配置】,轻量化
configuration
command and control
特性:
高度模块化:调用特定模块完成特定任务
基于python语言实现,paramiko pyYAML和jinja三个关键模块
部署简单:agentless
支持自定义模块
支持playbook(剧本,编排) yaml格式配置文件,可自行编写,可以编排:第一步做什么,第二部做什么...*
幂等性:一个命令执行一遍和多遍结果都一样,不回因为多次操作而变化*
快速失败:在一个程序出错,会快速的告诉你那里出错,不用自己找*
【ansible框架图】
playbook(剧本,编排) yaml格式配置文件,可自行编写,可以编排:第一步做什么,第二部做什么...,调用模块进行,做什么操作就写什么
connection plugins:连接插件,最有名的,标准,默认的是ssh
host..:清单,被管理主机清单,那些主机被管理都要列在里边,不在的将不被ansible管理
应用:一台ansible管理 三台被管理(2台c7,1台c6)
【扩展:要是又多了乌班图主机呢】
当你的被管理主机有不同版本的同一系统(c6,c7)或不同系统(centos,ubautu)的时候,你的配置文件要有条件判断,循环
主配置文件 /etc/ansible/ansible.cfg
hosts:主机清单文件*
roles
/usr/bin/ansible:主程序
ansible-playbook:跑剧本的
ansible-doc:查看配置文件的
主机清单图
hosts:[websrvs]
IP地址【同一主机可以再多个清单中】
[dbsrvs]
ansible-doc -l:查看所以模块
ansible -h:帮助
ansible <host-pattern> [options]
host-pattern:可以统配
ansible all[所有主机] -m ping
简单使用格式
ansible HOST-PATTERN -m MOD_NAME -a MOD_ARGS
-a 指明模块参数
【省略模块的时候会自动调用command模块】
-u sodoname :指明sudo用户
例如:ansible all[所有主机] -m ping
ansible具体模块
查看所以模块
ansible-doc -l
模块文件查找路径,在主配置文件中查找
查看模块使用方法
ansible-doc -s MOD_NAME
例如 ansible-doc -s ping
帮助
ansible[-doc|-playbook] -h
1.command:远程主机上运行名令
ansible HOST-PATTERN -m command -a ‘命令’
不支持管道功能以及一些shell特性
2.shell:远程主机上执行命令,调用一个shell进程,命令是shell子进程执行
ansible HOST-PATTERN -m shell -a ’命令‘
支持管道等shell特性的命令
3.copy:把文件复制到制定的远程节点位置
ansible HOST-PATTERN -m copy -a MOD_ARGS
[带=的表示必须要带的参数]
格式:args=
src:那个文件|目录发送到远程主机
dest=:复制到远程主机的什么位置,必须是绝对路径,不存在创建,已存在覆盖,规则同cp
content:自己写要发送什么到远程主机
dest=
mode:指明文件在目标主机上的权限
owner:属主属组指明
4.cron
ansible HOST-PATTERN -m cron -a MOD_ARGS
name=:指明任务名字,必须写
state:创建还是删除cron任务,创建present,删除absent
minute= */#:没几分钟,基本上规则等于cron的配置文件中的规则,#;每小时的第几中做什么
hour,day,mouth,weekday,reboot
job=:那个时间做什么
5.fetch:从远程主机上拉取文件
ansible HOST-PATTERN -m fetch -a MOD_ARGS
src= 目标的存放位置,可以使目录或者是文件
dest= 拉取过来的文件存放的位置,只能是目录
通常上是讲从一个节点上fetch,除非是一个目录
6.file:设定文件属性,什么属主属组啊之类的
ansible HOST-PATTERN -m file -a MOD_ARGS
(1).path=:指明文件路径,比给参数
src:源文件
state:directory
例:ansible all -m file -a "src=/tmp/fstab path=/tmp/fstab.link state=link"
(2).path=file group= owner= mode=
修改文件属性
(3).path= state=directory
创建目录
7. hostname
ansible HOST-PATTERN -m hostname -a MOD_ARGS
name=:主机不同命,可以用循环或者是变量
8.mysql_db:在远程数据库上添加数据库
9.pip:让远程主机的python环境自动安装python依赖的模块等
10.yum:基于yum管理程序包(要求远程主机支持yum)
ansible HOST-PATTERN -m MOD_NAME -a MOD_ARGS
name=:包名,可以带版本号
state:present 安装最新版本
latest
absent 删除
11.service:管理服务
ansible HOST-PATTERN -m MOD_NAME -a MOD_ARGS
name=:必给
state:started|stopped restarted
enabled:是不是开机自动启动
runlevel:那几个级别开机启动,默认2345
12.uri:想指明的每个web服务器请求个uri
ansible HOST-PATTERN -m MOD_NAME -a MOD_ARGS
url=:url完整格式,通常用变量
user,password
13.user:管理 用户|组 账号
ansible HOST-PATTERN -m MOD_NAME -a MOD_ARGS
name=:
state:present
latest
absent
system:是不是系统账号yes|no
uid
group:基本组
groups:附加组
shell
home
move_home:移动家目录
remove:删除用户的时候同时删除用户的家目录
14.group:管理组
ansible HOST-PATTERN -m MOD_NAME -a MOD_ARGS
name=:必给的,组名
state:
system:
gid:
15.scripts模块:执行脚本的,本地路径上的脚本,自动复制道远程主机上在进行执行
ansible HOST-PATTERN -m MOD_NAME -a “/path/to/script_file"
用法很像shell和command
YAML:数据结构描述格式【key value】清单,散列表,标量
多个key:value在一起叫散列表,就是字典
例如 { name:"user11",group:"group11"}
house:
family:
name: Doe
parents:
- John
- Jane
children:
- Paul
age:17
aa:16
- Mark
- Simone
address:
number: 34
street: Main Street
city: Nowheretown
zipcode: 12345
上边整体都可以叫做一个字典,因为是多个键值对组成的,address和family也是字典,parents就是列表
列表children中,其中一个值又是一个字典
一个键多个值,值是列表,列表的值前边要有-
例如 packages:
-httpd
-php
-php-mysql
【可以嵌套】
family:
name: Doe
parents:
- John
- Jane
children:
- Paul
- Mark
- Simone
family是一个键,他的值是嵌套的一个键值对,一个列表,而且,本身family就是一个字典
【.yaml|.yml结尾】
playbook 核心元素
Hosts:
Tasks:任务,模块加参数
Vsrisble:变量 [自带|自定义]
Templates:模板,包含了模板语法的文本文件
handlers:处理器,在特定条件下才会被触发的任务,本质上还是Tasks
举例,一个playbook定义了安装程序,提供配置文件,启动服务三个步骤,当配置文件变化的时候,由于幂等性的原因,ansible发现程序安装了,就不会在安装了,发现配置文件变了,会重新传一份新配置文件,发现服务启动了,就不会在启动一遍服务了,所以,这个时候的新的配置文件是不会生效的,因为playbook之定义了启动服务,这个时候就需要handlers来设定,一旦发现配置文件有变化立马重启服务(|重读配置文件)使配置文件生效
Roles:角色,由以上元素组成的特定结构
playbook的基础组件
*1.hosts:运行指定任务的目标主机;可以是一个或多个以:分割的主机,但是要事先在配置文件定义
2.remote_user:在远程主机上执行任务的用户,可以是一个全局用户,也可以单任务指定
3.sudo_user:以sudo的方式运行时,于哪个用户运行,某些场景的可选用户
*4.tasks:任务列表,第一个任务在三台主机运行完,再将第二个运行三台主机,一旦有一个主机运行出问题,会终止,修改好后在运行,不会影响之前运行
过的主机
模块,模块参数
格式:
1.action:module arguments(仅新版支持)
2.module:arguments(所有版本都支持)
command|shell:命令
其余的都严格遵循key=value
【每一个任务都要有个名字,以便于出错了给你报名字name:taskname】
某任务的状态字运行后为change时,可以通过notify来通知
任务可以通过tags打标签,可在ansible-playbook命令使用标签-t,多个用:或空白隔开
图片示例
ansible-playbook /path/to/file option
-v:详细信息
--list-hosts:只输出主机列表,不执行任何命令
--check:只测试不执行
-t tags :指明那个标签上边的用户
-e VARS:命令行传导参数项,就是想awk -v一样在命令行定义变量
-s:以sudo的方式运行
运行结果图
ok=#:主机上有几个成功执行的任务
changed=#:有几个是通过修改以后完成的
unreachable=#:有几个主机联系不到的
failed=#失败的个数
主机的facts变量:手机远程主机的facts 变量,在每次运行playbook之前都会自动运行
手动:ansible all -m setup -a facts
手动执行就可以看见目标主机的所有变量了
运行playbook的方式
1.测试
ansible-playbook --check file.yml
只测试运行结果,不真正的执行
ansible-playbook --list-hosts
列出运行的主机
2.运行
ansible-playbook /path/to/file
handlers:在特定条件下触发,在关注的资源发生改变的时候触发,或接受到通知时触发
经常在某任务的状态在运行后为changed的时候使用notify的方式通知处理器
使用方法:那配置文件来举例
在更改配置文件的task(被更改的任务)的下面,加上
notify:handler_name,
然后在这个列表结束后加上
handler:
-name:handler_name
动作
要求就是notify和handler的handler_name必须是一致的
-hosts:192.168.1.101
remote_user:root
tasks:
-name:install httpd
yum:name=httpd state=present
-name:configure
copy:src=file dest=hosts/path/to/dir
notify:restart httpd
-name:start httpd
service:name=httpd state=started
handler:
-name:restart httpd
service:name=httpd state=restart
直接写在hosts栏的后方
【主要处理正常流程下,没有关系的资源,给他们创建练习来工作】
tags:加个标签,结合-t
ansible-playbook -t TAGS_NAME1,TAGS_NAME2,.... file
只执行有标签的任务,当然,前提是先在指定的任务下边加上
tags:tags_name
然后就可以用了,可以给多个任务打标签,同一个任务也可以有多个标签,两个任务的标签可以一样,-t后边也可有多个标签,用逗号或空白隔开就好
variables:变量 只能以字母开头,使用{{ value }}调用变量 注意空格
1.facts:setup模块提供,可直接调用
2.使用ansible-playbook的命名传递 -e
...-e “var=value”,想awk -v一样,可以定义多个变量,使用多个-e就好
3.通过roles传递变量
4.Host Inventiry
想不通的主机传递不同的变量,可以加上端口号
IP地址1/HOSTNAME1[:port] var=value
IP地址2/HOSTNAME2[:port] var2=value2
向组中主机传递相同变量
在hosts文件中的组后边加上
[组名:vars]
var=value
例如[websrvs:vars]
http_port:8080
5.计算
变量可以进行计算,包括下边的template的时候也做过
直接在花括号中写入变量参与的表达式
例如{{ ansible_processor_vapus-1 }}
Inventiry参数:
定义ansible远程连接目标主机时使用的参数,而不是传递给playbook的变量
要注意区分
ansible_ssh_host
port
user
pass:密码
ansible_sudo_pass:密码
templates:模板
文本文件,内部嵌套脚本,使用模板编程语言编写的脚本
python:嵌入式模板编程语言jinja2
字面量:常见的就是字符串 用"" ‘‘引用;
数字:整数,浮点数;
列表:[item1,item2...]可变;
元组: (item1,item2..)不可变;
字典:{"key1":value1,"key2":value2....};
算术运算:+ ,- ,* ,/ ,//(不要余数只留商), %,**;
比较操作:==,!=,>,>=,<,<=;
逻辑运算:and,or,not
迭代,条件判断
template模块:基于模板方式生成一个文件复制到远程主机
ansible HOST-PATTERN -m template -a MOD_ARGS
src=:要指明本地的jinja2的模板文件路径.j2结尾
dest=:远程主机上用于运用的路径,通常是绝对路径
owner
group
mode
上边是命令行的template模块使用方法,下面是写入到配置文件.yml中的方法
就是在tasks下边记上
template:src=xxx.jinja2 dest=xxxx
用法和以前的没什么不同,还可以用tags和notify(handler)
写好用ansible-playbook file.yml就好了
playbook的条件测试:
when语句:在task中使用,jinja2的语法格式
when:ansible_distrubtion == "7"
- name: install conf file to centos7
template: src=files/nginx.conf.c7.j2
when: ansible_distribution_major_version == "7"
- name: install conf file to centos6
template: src=files/nginx.conf.c6.j2
when: ansible_distribution_major_version == "6"
循环:迭代,需要重复执行的任务;
对迭代项的引用,固定变量名为“item”,要在task中使用with_items给定要迭代的元素列表;
列表方法:
字符串
字典
-name:install some package
yum:name={{ item }} state=present
with_items:
-nginx
-memcached
-php-fpm
-name:groups
group:{{ item }} state=present
with_items
- group11
- group12
- group13
-name:add some user
user:name={{ item }} group={{ item }}
with_items
-{ name:"user11",group:"group11"}
-{ name:"user11",group:"group11"}
-{ name:"user11",group:"group11"}
角色(roles)
角色就像一个目录,有个roles的总目录,地下是好多的角色名命名的子目录
/etc/ansible/roles/ 具体位置可以定义.cfg
每个角色以特定的曾级目录结构进行组织
例如 mysql/
files/ 存放copy或script模块调用的文件
templates/ 存放template模块查找模板的文件
tasks/ 必须有的目录,至少包含一个main.yml的文件;其余的.yml都是要借用main.yml加载,要在main.yml中以include包含
handlers/ 至少包含一个main.yml的文件,规则同上,handler
vars/ var中也至少有一个main.yml文件,规则同上,存放变量
meta/ 至少一个main.yml,规则同上,定义当前角色的特殊设定及依赖关系
default/ 设定默认变量时使用此目录中的main.yml
角色只能用自己目录下的子目录或文件,所以,子目录要有这些模块要用到的文件或子目录
在playbook调用角色
-hosts:websvrs
remote_user:root
roles:
-mysql
-memcached
-nginx
启动起来后,ansible会自动的跑到这几个角色的目录下,将他目录下的子目录中的所有代码跑一边
创建角色:
1.在roles中创建角色同名目录
mkdir -pv nginx
创建子目录
mkdir -pv nginx/{...}
2.将需要的文件放进去(main.yml)
编辑main.yml
一些任务,但是任务中要用到同目录下的文件时候,直接写文件名就好,不用写路径,会自己去找的,实例参见配图templates项,好比我现在是在task下编辑main.yml,我想调用files下的文件,并不需要写什么局对路径相对路径,直接写文件名字,他会自己去找
对于一个角色,最重要的是任务,所以先编辑tasks,格式很多都可以省略,比如hosts,这个是让人调用的角色所以不能指定hosts,比如tasks,这个是可以省略的,因为本身就是在task目录下了
但是,要区分主要运行的剧本和这里的main.yml也好自己定义的其他名字的yml也好,都是不同的,playbook要运行的剧本老老实实的写hosts和tasks等
handler也是,在handlers的目录下写main.yml,在要运行的yml中只写notify就好了
在playbook中使用变量,在运行的yml中,remote_user的下边加上
var:value
就可以直接调用了,多个可以使用列表,但是,每次要修改变量还要去到配置文件中去修改配置文件,不过,ansible可以再命令行设置变量,并且优先级还要高于配置文件中的变量
ansible-playbook -e var=value2 file.yml
实际上的var的值是value2
在角色中更贱简单,在ansible的rules下的相关角色的vars目录下编辑main.yml,然后直接在运行的里边使用就好,只要是字典格式就好,不要加-
或者是在角色调用的时候来实现传递变量
Roles:
-{ role:nginx,username:mymy }
把角色那一栏做成字典,第一蓝是角色,后边是变量
还可以在角色调用还可以做条件判断
Roles:
-{ role:nginx,when:xxxxxx == "7" }
只有满足什么条件的时候才会调用角色
实战作业:1.两台主机nginx+keepalived 主从模式,主主更好,制作好ansible角色
2.后端两台主机跑php,lap,
3.再有一台主机跑mysql
注意:写角色要判断操作系统,nginx,mysql的安装包都不同,还有apache也不是很一样
部署一个论坛程序更好
顺便博客作业,把ansible内容写上
ansible如何基于sudo使用,建议把使用sudo的组加到wheel组中
www.ansible.com.cn
cobbler服务依赖于pxe
pxe依赖于dhcp,ftp等服务
DHCP服务:动态主机配置协议
IP/MASK:mask与自己和对方的ip做与运算,计算是不是同一网段
gateway
DNS:第一台是最重要的,第一台不可用(而非解析不了)才用第二台
wins server, ntp server
参数的配置方式:
静态方式指定
动态配置分配:
bootp:boot protocol无盘工作站
无盘工作站:后端有服务器,上边有多个独立空间给子机存储文件,还有一个单独的空间存放模板,基于tcp/ip协议通信,但是往往刚装的时候没有系统怎么配置IP地址呢
有一个基于网卡级别的服务来自动配置,类似于只能网卡,在局域网中广播,让服务来给自己配置IP地址,然后在对文件服务器通信
boot协议:一旦分配出去,就不会在收回,除非重新配置
但是现在的都是有盘计算机,不需要再去服务器读系统,所以直接去拿地址就好
dhcp:有一个地址池,里边有一段连续的IP地址,有自己独立的DNS和网关,计算机关机后自动回收
引入租约(使用时间)的bootp,也可以为实现为特定主机保留某固定的IP地址(MAC地址来识别,从而实现保留固定地址)
rarp:反向arp,将MAC地址解析为ip地址
arp:ip地址解析协议,将ip解析为MAC地址
监听端口:服务端udp67 客户端udp68
客户端监听是因为二者之间是要进行通信的
实现程序:dhcp(重量级)
dnsmasq(同时提供dns请求转发和dhcp功能)
工作流程 客户端广播发现服务器端(discover阶段)
服务器端offer,提供一个地址(offer阶段)
多个服务器提供offer的时候,用最先到达的那个,应为最先证明他的性能好
客户端收到后,请求使用此地址(request阶段)
发送了request,也就告诉了所有的服务器端我选择了那个,其他的服务器就可以把IP地址返回地址池,而选定的服务器就要把IP地址从地址池删除
服务器端同意(ack阶段)
可以使用,结束通信
报文:广播,广播是不能跨越网关的,只能在局域网中进行,但是可以中继,配置一个路由器做dhcp服务器的中继器
使用路由器监听在udp67端口,路由器将广播中继成到dhcp服务器的单播,然后收到的单播传递到另一个局域网广播
但是想要管理别人的局域网,要想将自己的局域网管理好了
续租:提前续租,续租成功的时候,再延长一个租期,但是如果续租的时候联系不上服务器,可以缓一段时间再去找服务器续租,如果总是联系不上,就准备重新discover计算
50%:第一次续租 75% 87.5%
额外功能:可以区分系统(Windows,非Windows)配置不同的地址池,可以区分是不是虚拟机等
如何配置使用dhcp服务
dhcp:只提供dhcp服务
dnsmasq:还能提供dns服务
dhcp:
dhcpd:服务器
dhcrelay:dhcp中继器
融合在一起,所以服务叫dhcp,但是中继和正常的dhcpd不能一起进行,因为都是监听在67端口的
dhcpd:因为他是要给别人分配地址的,所以自己也要有地址,而且要是静态分配的地址,不能发生变化
配置文件:/etc/dhcp/dhcpd.conf
空的,要cp dhcpd.conf.example到这里覆盖
dhcpd.service dhcpd6.service dhcrelay
dhcpd.leases:租约,每个地址的租约都放在里边,分配出去的地址的信息也都在里边
配置:
参数类配置:配置客户端的
指令类配置:配置自己的工作配置
option domain-name "example.org";
搜索域
option domain-name-servers dns server1, dns server2;dns server3;
dns服务器
default-lease-time 600;
默认租约时长 单位:秒
max-lease-time 7200;
最长租约时长
[时间长好还是时间短好呢,长好,关机就释放,所以长了没关系,但是短了每个一段时间就要广播,增加了服务器压力]
log-facility local7;
日志记录[要去rsyslog配置local7]
subnet 172.16.0.0 netmask 255.255.255.0 {
range 172.16.100.1 172.16.100.99;
分配的地址池
option routers 172.16.0.1;
配置网关的,后边指明真正的gw
filename:指明引导文件名称
next-server:指明引导文件的服务器地址
}
管理的子网地址;不管配置几个地址,首先都要先有一个自己网络的
filename:表示只对网段中的主机查找引导,而且只在刚分配完后的短时间内生效,其他时间不生效
[options有范围限制的,范围越小会越有限生效]
host HOST_ID {
hardware Ethernet MAC地址;
fixed-address IP;
option....
}
固定IP地址,这个ip不能出现在上边的地址池,另外HOS_ID只是个标示,不一定与主机名一致,但是要能标示
其他配置
filename:指明引导文件名称
next-server:指明引导文件的服务器地址
例子:filename "pxelinux 0";
next-server 172.16.0.1;
但是这个是对网卡有特殊要求的,要求网卡有tftp协议,简单文件传输服务
怎么指明使用哪个dhcp服务
先关掉vm的dhcp服务,停止dhcp服务的虚拟机桥接,改成仅主机
再来一台仅主机的虚拟机 dhclient -d 追踪分配地址
再次启动的时候,先默认发送一个续租请求(使用了固定地址后,固定地址优先级比请求高,会使用固定地址)
pxe:提供操作系统的技术,网络引导技术,自动化的方式完成操作系统的安装 intel牵头研发的技术,硬件级别(芯片级别)
必须网卡内置了pxe支持才行,在今天网卡都默认支持,而且虚拟机也支持pxe引导了
我们通常那他进行操作系统安装
CentOS系如何配置实现pxe:
硬件支持
dhcp server:配置ip 掩码 dns gw等;filename,next-server
tftp server:加载bootloader和kernel,initrd
yum repository:ftp,http,nfs提供安装树
kickstart:完成自动化安装
tftp server :类似于ftp但是监听在udp69端口
c/s:tftp-server
tftp
/usr/sbin/in.tftpd
启动的服务文件:瞬时守护进程
/usr/lib/systemd/system/tftp.socket
非守护进程
/usr/lib/systemd/system/tftp.service
根目录
/var/lib/tftpboot
配置文件
/etc/xinetd.d/tftp
centos6:
chkconfig tftp on
service xinetd restart
centos7:
systemctl enable tftp
systemctl start tftp
dhcp server:配置range filename next-server
安装httpd vsftpd syslinux(提供各种引导文件)
测试环境192.168.12.0/24
服务器192.168.12.1/24
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot
挂载光盘 挂载到/var/www/html/centos7
cp vmlinuz initrd.img /var/lib/tftpboot
cp /usr/share/syslinux/{mboot.c32,menu.c32,memdisk,chain.c32} /var/lib/tftpboot
在/var/lib/tftpboot中创建目录
mkdir pxelinux.cfg目录
创建default文件
default menu.c32 那个生成菜单的
prompt # 菜单显示时间
timeout # 超时时间
MENU TITLE xxx 菜单名字
LABEL linux 短格式显示菜单
MENU LABEL install Centos7
KERNEL vmlinux 在哪个加载内核
APPEND initrd(参数名)=initrd.img文件名 install.repo=ftp://192.168.12.1/pub/centos/$re...仓库名
LABEL linux_autoinstall
MENU LABEL install c7 auto
KERNEL vmlinux
APPEND initrd=initrd.img install.repo=ftp://192.168.12.1/pub/centos[/$re...](仓库名) ks=ftp://192.168.12.1/pub/kickstart.cfg[注意文件的权限问题,ks权限没有r的话无读取]
记得先把ks文件放到/var/www/html下,要用http访问
另一个主机设置成从网路引导
dos--boot-network的第一项
boot:linux 调用第一项
这么调用可以再后边添加一些选项,比如加上ks=....就和第二项一样了
[本地就有一个ks文件 anaconda-ks.cfg,手动安装时生成的]
[ks文件语法检查工具ksvalidator]
centos6:前边一样,后边的菜单方式不太一样,可以使用centos6自带的图形工具生成
挂载光盘 挂载到/var/www/html/centos6
复制vmlinuz,initrd.img
复制isolinux下的boot.msg vesamenu.c32 splash.jpg
mkdir -pv /var/lib/tftpboot/pexlinux.cfg/
cp -v isolinux/isolinux.cfg /var/lib/tftpboot/pexlinux.cfg/default
vesa:使用boot调用,采用图形安装
menu default:默认项,只能有一个
ks之类的还是加载append后边
但是install.repo不用指明,系统会自动加载的
ks要放到/var/www/html下边,而且要给上读权限r
cobbler:配置多系统版本安装环境
cloud or VM:image lanch
VM:
第一台是安装出来,后边可以镜像
云OS:
将影像文件下载到节点上,以此为硬盘来安装
Bare Metal:OS Install
只能是安装,但是可以借助工具自动批量安装
基本上第一次都是安装的,或者是下载网上别人分享的镜像文件
基本上所有工具都是基于pxe,cobbler当然也不例外
cobbler:
PXE
Koan
核心概念:cobbler(核心)
cobbler_web(补充组件,增进用户体验,提升管理效率)
distros:定义发行版
profiles:基于distros,配合ks,安装不同的部署环境(主机只使用一个服务,如mysql专机)
systems:即便是同一个profile,也是有不一样的地方,比如ip等,这些就叫system,但是很少进行精细管理
repos:yum仓库,发行版,epel(但是不能拿来安装)
images:镜像文件
management classes:分区管理
file resources:文件管理
常用的只有 distros profile
需要服务:
TFTP
rsync
DHCP
DNS
子命令:
import
sync
cobbler图解
distribution:
KERNEL
initrd
profile:
distribution
ks file
repository
system:
profile,IP,MAC
安装:yum安装或编译,epel源
配置文件:/etc/cobbler
服务:cobblerd.service
(运行cobbler之前要强依赖httpd,所以先开启httpd,还有tftp,rsync)
帮助
cobbler [command] --help
检测cobbler环境是不是完备
cobbler check
解决check问题
编辑cobbler/settings
1.server 127....改掉
2.next_server 172.16.100.7 本机地址
3.default_passwd_crypted:"密码"
chkconfig tftp on
loader不用管可以,syslinux提供的就够
chkconfig rsync on 监听873tcp端口
debmirror c7不用,c6需要
/var/www/cobbler
命令号格式
cobbler command [subcommand] [--arg1=value1] [--arg2=value2]
command: distro profile system import sync
distro :centos直接挂载光盘就有,会自动放在/var/www/cobbler的ks_mirror下
使用cobbler import导入 --help
cobbler import 也要指明ks文件,是因为他在创建distros的时候会自动创建profile,不需要就删除
cobbler import --name=centos-6-x86_64 --path=/mnt(挂载关盘目录)
会自动放在/var/www/cobbler的ks_mirror下
cobbler distro list:查看列表
remove:删除
profile: ks文件放在/var/lib/cobbler/kickstarts/下边
cobbler profile add --name="centos6" --distro=Centos-6-x86_64 --kickstart=/var/lib/cobbler/kickstarts
profile list
然后使用cobbler sync 同步一遍,会自动生成default文件
再做一遍就多一个,可以做个c7的
cobbler_web
/etc/cobbler/auth.conf
/modules.conf
[authentication]
module = authn_pam
[authorization]
module = authz_allowall
/users.conf
admin = "管理员名字"
cobbler = "普通用户名字"
记得passwd命令给个密码
/cobbler_web.conf
require all granted
zabbix:监控系统 **绝对不允许不受监控的系统到生产环境**
硬件:硬件自身带传感器
软件:操作系统本身.系统上某进程
业务指标:例如httpd有几个用户,多少请求等
NMS:网络管理系统
监控数据采集通道:
监控系统处于一个数据抓取的工具上,每隔一段时间从被监控的主机中读取数据
snmp协议:简单网络管理协议
ssl/telnet:但是有权限问题,必要的时候还要管理员
ipmi接口:Intel智慧平台管理接口
agent:监控系统在被监控主机安装一个程序,两者可以通过某种协议通信,被监控主机用管理员身份运行该程序就好,需要访问用户控制**
master/agent
sensor:传感器,观察数据指标
工作方式:
1.只对当下数据进行采集,一旦异常立马警报
2.对过去的数据进行观察,检查异常的范围波动频率时间等(要求数据存储)
监控系统基本功能:NMS实现,其采集通道见上,工具见下
1.数据的采样:按固定的周期频率,为了观察;历史数据,还要保存下来,历史数据经过一段时间后可丢弃,只保留趋势数据就好
趋势数据:每一段时间(一天)最大值最小值平均值之类的
2.数据的存储
3.告警(报警):在某一数据一致不正常就像用户报警,邮件短信甚至人工合成声音的电话
脚本:触发脚本自动完成一些功能,是在不行再报警
操作:配合云环境,虚拟化,发现某一虚拟机挂了,kill掉在重建一个配置好加入到环境中
媒介:邮件.短信,微信
4.展示:visual,可视化,随时可以用形象的方式经结果展示给用户
常见开源监控工具:
cacti naglos zabbix ganglia
cacti:本质上不是监控工具,本身不具备监控功能,基于协议构成,能够存储数据并将其数据通过mysql前台展示出来,但是报警功能差
通常和naglos结合使用
zabbix:既能监控又能报警,取代了上两者集合,使用的是mysql的数据系统
ganglia:对多台主机的数据聚合展示,今天有人集合g,z使用,尤其是超级计算机进行计算的
数据存储:
对数据库的写压力太大,千台主机监控指标就到十万指标,cpu的使用率,网卡的,还有多网卡,内存的,是非常大的数据
历史数据:NVPS
趋势数据:
存储系统:
关系型数据库:mysql,性能都不是很好,不是保证事务就不要用
rrd:环装数据库,满了就在覆盖存储一圈,类似一致性哈希算法,在节店上存储,空间,存储槽都是早就创建好了的
*NoSQL:不支持事务,没有复杂的关系.工作空间是内存,因此性能非常好,每隔一段时间同步到硬盘
时间序列存储
SNMP:简单网络管理协议(古老的协议,没涉及复杂的安全功能,所以有别的就不要使用它,能不用就不用)
有agent的,nms/agent组成
每一个通过他监控的各种各样的设备都內建他的agent
snmpd服务
nms:cli,命令行工具 gui,图形工具
agent:service,监控在某个端口,接受请求采集数据返回响应给请求者,说起来想server端..
为避免agent端信息泄露要进行认证
v1版snmpd没有任何安全
v2c(community社区) 类似社区,有令牌通过就可以响应,public社区可以公开出去的社区
v3使用了很强的加密功能,但是网上很少有支持的
操作:
获取操作:get,getnext,bulk(一次获取多个)
管理操作:
陷阱机制,被监控端主动向监控端发送数据,类似dns的通知
MIB,OID
ZABBIX:开源监控系统 2.0稳定成熟的版本
LTS:建议选择的版本,如2.2 3.0 长期支持维护的版本
特性:
数据采集
snmp,ssh/telnet,agent,ipmi,jmx(java management extensions)
自定义采样操作:userprameter
告警
告警升级:执行脚本,在告警(notification)
展示(zabbix_web)
实时绘图:需要看图时候,在数据库中取数据,动态绘制出来
单个graph图片
多个graph组成screen
slide show:多个屏显示,每个多少秒换个屏
map:各设备之间创建一个拓扑图,某设备故障,在拓扑图中将那台机那条线不同色标出来
存储
mysql/pgsql
支持模板:实现快速监控主机添加
网络自动发现:扫描一个网段,将内部的主机自动套上模板添加进来
分布式监控:减少监控,各设备读写压力,有代理主机替你采集指标(每个代理主机采集一部分指标),client只要拿过来就好了
server-----proxy-----agent/ssh/ipmi
丰富的API接口
程序组件: zabbix_web GUI php研发
zabbix_database
zabbix_server c语言 web page
icmp/impi/snmp devices
agent:zabbix_agentd
JMX
zabbix_proxy web page
icmp/impi/snmp devices
agent
zabbix_server
agentd
proxy:代理,可选,不做分布式的时候不需要
get:命令行工具,手动测试向agent发起数据采集请求
sender:运行与agent端,手动向server端发送数据
java_gateway:java网关JMX JVM
database:和zabbix自身没关系,是mysql被用来做数据存储
web:基于web接口展示的gui,对zabbix所有操作几乎都是通过gui来进行,所以他也是个管理接口
zabbix逻辑组件:内部完成一次完整的监控操作用到的组件
主机组
主机
监控项:item;
key,事先定义好的能够采集数据的命令或脚本的名称,key后边加一个参数,参数将会传递给命令,通过修改参数,可以达成一个key监控多个项
应用:application,同一类监控项item的集合
触发器:trigger,一个逻辑表达式(或调用了函数的表达式),监控item接受的数据key对应的数据是不是在合理范围内,即阈值,大与阈值时候,从ok转到problem,会在范围内转回ok
一般都是在范围内problem,不在为ok
事件:event,发生一个值得关注的事情,如ok转换,发现一个新主机,可以针对事件来做相关操作,一旦事件发生了就会发生后续一系列操作
会牵连到告警操作
动作:action 对于特定事件事先定义的处理,包含操作(operations)和条件(condition)
条件不同,操作不同
常见:通知,告警
报警升级:escalation,
报警:
媒介:media,发送通知的手段或通道,email,messages等
通知:notification,告警内容
升级:
层层上诉,县长不行市长,市长不行省长
可以定义多个操作,先执行什么远程命令,还不行就升级报告
远程命令:remote command,预定义的命令.在主机处于特定条件下自动执行
模板:template,快速定义被监控主机的各监控项的预设项目集合
通常包含item,trigger,graph,screen
图形:graph,监控项中采集到的历史数据,用图像的方式展示出来就叫graph
支持现状图面积图饼图爆炸图
屏幕:screen,多个graph集合组成
逻辑组件逻辑关系图
maintenance:维护,定义维护期,维护期内遇到任何异常都不要报警
zabbix poller:数据的采集器.轮训工具,采集一次又一次
internal监控:针对于自身,采集了几次数据之类的
服务端进程
poller:轮训数据
watchdog:监控进程是不是正常,不正常重启
housekeeper:内务管家,管理数据库中的数据,比如清理数据库
alerter:报警工具
escalator:报警升级
httppoller
discover:发现主机,上线下线等
nodewatcher:监控节点
timer:计时器
db_config_syncer
db_data_syncer:完成配置同步和数据同步
pinger:探测主机的
监控级别(最低限度)图
monitored host:被监控主机数
zabbix注意:对于不是关键性指标,监控间隔就可以长一点,重要的就要设置短一点
监控数据库支持 图
监控需要的扩展 图
server端需要扩展 图
jabber那个用不到
zabbix组件:server,agent,database可以分开设置
实际部署:同一台主机上进行,不同主机自己去试
sever,agent,web*,proxy*,get,sender
trousers-0.3.13
mget *3.0.3*
1.mariadb-server安装---配置文件---innodb_file_per_table=ON skip_name_reslove=ON----启动服务
2.创建数据库----授权用户
3.安装服务端 zabbix-server-mysql/get/
4.安装zabbix-web
安装php,httpd,php-mysql,php-gd,php-ldap,php-xml,pgp-mbstring,php-bcmath
5.安装agent
安装zabbix-sender
6.服务端数据库初始化
2.x:三个sql脚本
按官方文档的固定数据导入三个脚本
3.x:一个sql脚本
create.sql(server-mysql提供)
mysql -u -h database_name < create.sql
7.启动
配置文件:/etc/zabbix/zabbix_server.conf
先备份
配置段:
general parameters:通用参数
listenport:监听端口,默认10051
sourceIP:限定采集数据向外通告自己的ip是什么,不然基于ip的访问控制会拒绝
logtype:=日志类型
logfile=/path/to/file
logsize:设置日志滚动大小,0不滚动
debuglevel:日志级别0-5,默认3,自己测试定义5
DBhost:数据库地址 *
dbname:数据库名称 *
dbuser: *
dbpasswd: *
dbsocket:mysql.sock
dbport:与上边的socket有一个就好;mysql 3306
advanced ...:高级参数
高级参数就是定义服务端的那几个进程的参数
loadable:模块
tls....:安全
[mandatory:是不是强制配置]
8.配置web gui
先编辑php的时区 /etc/php.ini date.timezone(所有php程序都遵循)
到/etc/httpd/conf.d下的zabbix.conf里边的data.timezone Asia/shanghai
然后重启httpd
172.16.7.5/zabbix
安装生成的配置文件/etc/zabbix/web/zabbix.conf
monitoring:监控 *
inventor:
reports:报告
configuration:配置 *
administrator:管理 *
*:将来基本上就对这几个做操作
9.agent端配置
/etc/zabbix/zabbix_agentd.conf
zabbix-agent
备份
general parameters
passive checks relate 被动监控
server:=ip1,ip2(代理服务器)..
允许那些主机过来采集数据
listenport:端口,默认10050
listenip:0.0.0.0监听的地址,所有
startagents:=
下午第一节可
active checks relate 主动向server报告
serveractive:=ip1[:port],iP2...
hostname:=zabbix server
主机名,与服务器端配置添加的主机名完全保持一致,区分大小写
hostmatedata:定义知己元数据,在自动进程上使用
hostmetadataitem:定义那些采集项
refreshactivecheck:刷新频率,默认120秒
buffersend
buffersize:发送缓冲大小
advanced ...
user-defined monitored... 用户自定义参数
loadable 模块
tls.... 安全
[mandatory:是不是强制配置]
10.监控配置
host groups --> host-->application--->item--->trigger--->event(不用配置)---->action(condition,operation)--->通知
graph:
simple:自动生成的
customed:将多个item的图形数据整合在一个图形数据进行展示
11.items
key:
內建
type:
agent:
agent(active)
snmp v1
用户自定义
12.采集到的数据
数值:
整数
浮点数
字符串
字符串
文本
13.存储的值:
as is:不对数据做任何处理
速率:变化速度
简单变化:变化量,这次值减上次值,除时间(秒)可以求出速率
ntpdate 172.16.0.1
14.trigger
逻辑表达式,阈值;通常定义数据的不合理区间
OK:正常状态,较老的版本中叫FALSE
PROBLEM:非正常状态,较老的版本叫TRUE
OK-->PROBLEM:出问题了
PROBLEM-->OK:recovery恢复
通常是拿最近5次的平均值,最大值,最小值与阈值比较
或是最后一个值与阈值比较
可调用函数:
nodata()没数据
last()最后一次
参数
function(#300)记上#是最近多少次
不加#是最近多长时间
事件的严重级别 图
not classified
information
warning
average
high
disaster
表达式
{hostname:key[parameters].function(arguments)}
<>=#(not equal)
+-*/
&|
trigger之间是可有依赖关系的
被依赖的出现问题,依赖的就不用报告了
一个item上可以定义多个trigger
media媒介
告警信息的传递通道
类型
email:邮件
script:自定义脚本
sms
jabber
ez texting
接受信息的目标为zabbix用户:
需要用户上定义对应各种媒介通道的接受方式
发送内容由zabbix自动生成
action:
action 图
conditions 图
A:不在正常的维护区间
B:转换到problem
多个条件之间具有逻辑关系
operations 图
条件满足时触发的操作
remote_command:命令
notification:通知
点new定义 图
3600s 表示每3600秒定义一步,启动什么服务
step 从第几步到第几步
1-1 2-5 第1步做什么;等级上升;第2-5步做什么;等级上升
send message
media type:传递信息的通道
script报警脚本
脚本位置:zabbix_server.conf文件中alertscriptspath定义的路径下
/usr/lib/zabbix/alertscript
zabbix服务器在调用脚本时,会传递三个参数
$1:经由此信道接受信息的目标{ALERT.SENDTO}
$2:主题subject{ALERT.SUBJECT}
$3:body,邮件正文{ALERT.MESSAGE}
信息接收人
user groups:组内的人都能收到
user
remote_command
功能:
在agent所在主机上执行用户指定命令或者脚本
重启
通过ipmi重启服务器
完成任何用户自定义脚本中定义的操作
可执行命令类型
ipmi
ssh
telnet
custom script
global script
前提要求:
1.zabbix用户要有所需要的执行权限
2.允许agent进程执行远程命令,默认是关闭的
enableremotecommands=1
3.sudo注释掉 default requiretty用户不需要控制终端
或default zabbix !requiretty
host groups --> host-->application--->item(key)--->trigger--->event(不用配置)---->action(condition,operation)--->通知
media type
user/user group
action operations:可定义为升级方式
send message
remote_command
如何使用宏,自定义图形,自定义参数,如何使用自定义key,分布式监控
展示接口:
graph:simple自带 custom自定义
screen:整合多个graph
slide show:多个screen以幻灯的方式展示
模板:一系列配置的集合
items
trigger
graph
application
screen等
创建完成后,让主机连接到模板,类似软连接那样子.并且当模板更改的时候,连接改模板的主机也会做出相应的修改
创建模板-----添加模板的各种选项----添加新主机---在添加新主机的时候点template天机模板
注意:
模板可继承,可以再模板的情况上继续添加监控项等
宏:(macros)类似于变量,预设的文本替换模式,文本类型的替换机制,跟变量还是不完全相同的,只是字符串变化,没有变量的浮点数啊之类的
生效级别:
全局:administrator---右侧上方gui哪里下拉箭头找macros
模板:编辑模板---macros
主机:编辑主机---macros
生效顺序:应用范围小的优先级高
类型:
內建宏:{macro_name}
自定义宏:{$macro_name}多个$符
自定义命名要求:大写字母,数字,下划线
网络发现:network discovery 上午第二节课
根据用户实现定义的规则,来扫描一个网段,或者是ping或者是某个服务(80端口有没有被监控?监控了就添加主机到监控中)从而添加主机,并且还能自动套上模板,并且某主机不在线还能自动移除主机
时间间隔很长
功能:加快部署,减轻管理工作,经常发生变化的工作环境中不用手动管理
基于以下信息
ip ranges
service(ftp,http等)
zabbix agent
SNMP
阶段:
discovery
disconvery:发现事件
lost:丢失事件
actions
configuration---discovery
注意:low level(也是发现,但是能区分Windows和linux,并且连接像对应的模板,是一种低级别的发现,一般是调用脚本完成)
低级别是指对操作系统比较近
ip range :扫描的网段 xxxxx-xxxxx
check:检查的项
delay:每多长时间检测一次
configuration----action--右上方改成discovery
自定义key:
item type:和key本身的可用是有关系的,不同类型适用的接口有可能不同,一些key只能用在制定的接口之上
agent
agent(active)
simple
snmpv1
snmpv3
ssh
...
接口类型:agent snmp impi
自定义key值得是在zabbix agent端的配置文件上游用户通过userparameter指令定义的key
UserParameter=<key>,<command>
=mysql.ping,mysql -umkmk -pmy123 -h127.0.0.1
注意:
重启agent生效
注意一定不能重名,并且只能通过agent接口运行
是调用/bin/sh(centos中默认bash)运行
监控自定义key的时候,一定要确保被监控的主机上游这个自定义key
UserParameter=<key[*]>,<command>
可以接受参数,参数会传递给后边的命令当参数
*:任意数量参数,$1,$2......$0是命令本身
UserParameter=memory.usage[*],awk ‘^/$1/{print $$2}‘ /proc/meminfo
$1,前边传递的参数 $$2是awk自身的变量
zabbix_get -s 172.16.7.5 -k memory.usage[MemFree]
web监控
首先定义web方案(scenarios)
一个或多个httpd请求或步骤(step)
步骤的执行过程将按照预先定义俄顺序进行执行
通过web监控获得信息
整个web方案中所有步骤的平均下载速度
失败的步骤号
失败的报错信息
在方案的具体步骤中,可以按需使用以下信息
该步骤的下载速度
回应时间
回应状态码
zabbix可以检测获取到的html页面是不是包含预设的字符串,还可以实现登录和页面点击
application---web方案
configuration---host----web
创建完会自动生成一些items,可以直接拿来用
主动监测:
agent需要的基本配置:
serveractive=
hostname=:要与server端添加的而主机名完全一致
主动被动和主机没有关系.和items有关,要选zabbix agent(active)
在监控项非常多的时候会减轻服务器的压力
zabbix proxy :主要是用在分布式监控的
server---proxy---agent
使用proxy,用web gui添加就好
/etc/zabbix/zabbix_proxy.conf
heartbeat frequency每隔多长时间健康监测一次
config
datasender
agent端把server和serveractive改成proxy的IP地址,然后重启zabbix-agent
proxy mode
active主动:自己制动去获取
passive被动:等待发送过来
proxy的主机名记得在hosts中表明解析
Zbbix proxy的配置过程:
1、配置proxy主机,启动服务;
(1) 安装程序包
# yum install zabbix-proxy-mysql zabbix-agent zabbix-sender zabbix-get
(2) 准备数据库
创建、授权、导入方案
(3) 修改配置zabbix_proxy.conf
Server=
Hostname=,与GUI端添加时候的名字要一直并且保证能解析改名称
DBHost=
DBName=
DBUser=
DBPassword=
ServerActive=
heartbeatfrequency每隔多长时间健康监测一次
config 拉取的时间间隔
datasender 发送的时间间隔
2、在server端的GUI上添加此代理服务器;
Administration --> proxies
注意名字要和上边的配置文件中的hostname一致,并且是必须添加主机名
3、在server端的GUI上添加通过porxy进行监控的主机;
注意:通过proxy监控的各agent要授权proxy主机有监控权限;
zabbix performance tuning:性能调优
nvps:new values per second
最基本的性能指标
100w/m, 15000/s
官方给的最多能承载数据,实际肯定没这么多
调优:
Database:历史数据不要保存太长时间;尽量让数据集可缓存到数据库服务器内在中;
触发器表达式:减少使用min(), max(),avg(),尽量使用last(), nodate();
数据收集:polling较慢(减少使用SNMP/agent-
less/agent);尽量使用trapping(agent(active));
数据类型:文本型数据处理较慢,尽量少收集类型为text或string的数据,多使用类型为Numeric的数据;
zabbix服务的配置:
(1)zabbix internal类型的监控来获知zabbix自己的状态;
(2)服务器组件数量:
alerter, discoverer, escalator, http poller, housekeeper, icmp pinger, ipmi poller, poller, trapper
configuration syncer, db watchdog
StartPollers=100
StartPingers=10
StartPollersUnreachable=50
StartIPMIPollers=10
StartTrappers=20
StartDBSyncers=8
数据库优化:
分表;
history_*, trends*, events*
博客作业:
zabbix-server, zabbix-proxy, zabbix-agent应用;