自动化运维管理工具:php
puppet:
有产品线已经在用,优势是历史悠久,比较成熟,在可远程可本地,功能强劲,不过这厮批量执行功能没得,为了批量执行个命令写个配置文件,好像有点大刀砍蚊子腿的感受了,并且有客户端在,和受权系统结合比较麻烦。Puppet agent来master请求同步
saltstack:
和ansible都是python流的,并且就功能上来说,二者也极为类似,不一样之处是salt stack是有客户端的,而且execution模块还用0MQ实现了pub-sub,命令和执行结果所以能够高效并行传输,不过成也萧何败也萧何,第一个sub阶段(将querystring下发到全部机器,而后收集机器响应的阶段)太依赖与客户端返回了,若是客户端未能及时返回或未响应的话,playbook执行阶段可能会直接漏掉这部分机器而没有任何提示,这对于运维来讲是不可接受的,要改造这个就得推掉saltstack的现有架构…算了吧。Master手推同步信息到agent
ansible:
与前二者比起来,在特性上彷佛并不抢眼,配置管理方面(playbook)绝对比不过老大哥puppet,批量执行方面也只是多线程,不像saltstack那么高大上,不过ansible搜索热度高出saltstack三倍多,显然靠的不是吹牛,至少,ansible至少不会悄悄的丢机器,这给了咱们一个定心丸,并且仅依赖ssh,与登陆受权管理系统自然集成,简单即有效,没有比这更美妙的事情了。Master手推同步信息到agentpython
Puppetmysql
Ruby语言nginx
运维工具c++
OS poriovisioning(pxe,)系统自动安装web
OS configuration(puppet,ansible,chef,saltstack)sql
Command and control任务执行(func,ansible)shell
Ansible能实现puppet的全部功能 puppet比ansible能管理的节点多编程
Puppet:IT基础设施自动化管理工具(较ansible安全)api
整个生命周期:
Provisioning系统安装
Configuration配置
Orchestration编排
Reporting报告
模式:
Master/agent模式
Master:puppet server
Agent(1,ansible远程安装puppet agent
2,把agent制做在操做系统中):要有管理功能,真正执行所谓管理操做的核心部件,周期性的去master请求与本身相关的的配置
工做模式:
声明性,基于模型:
定义:使用puppet配置语言定义基础配置信息
模拟:测试
强制(执行):比对客户端主机与定义的目标保持一致
报告:puppet api 返回执行结果
三个层次:
配置语言:
事务层:资源之间的前后依赖关系;配置文件改变出发重启
资源抽象层:把主机上每一个能够被管理对象都抽象定义为资源
资源类型:用户,组,文件,服务,cron任务等
属性及状态与其实现方式是分离的:
每个资源都应该定义其指望状态
核心组件:资源
资源清单:manifests,定义了一个或多个资源(须要进行的操做)在server端
资源清单及清单中的资源定义的全部依赖文件,模板等数据按特定结构组织起即为”模块”
站点清单:用来记录一个主机包含的全部清单
模块:清单的组合
逻辑顺序:
可在本地模式运行或者在master和agent模式运行:
1,agent向master发送与本身相关的catalog,并发送本身的主机名和facts(主机本身的属性:IP地址,主机名,CPU等信息);
2,服务端收到请求,查找请求者的站点清单(请求者调用了的清单);
3,查询完以后找出这个站点的全部清单;
4,将清单在master端进行编译(catalog);
5,将编译结果(伪代码(catalog))发送到agent端[不可能将源代码发送到agent端];
6,伪代码在agent端的应用:
1,状态查询:已经完成的任务和须要再进行的任务。
2,执行目标状态:执行查询到的状态
7,任务执行完返回报告。
经过http协议进行通信,证书认证,master自带CA,agent自动生成带签署的证书发给master的CA
安装:
Agent:puppet,facter
Master:puppet-server
命令用法格式:
Puppet <subcommand> [options] <action> [options]
获取所支持的全部的资源类型:
Puppetdescribe -i
Puppet 资源类型名称(file,package等) -i ##资源的具体使用方法
(puppet实现lnmp架构):
nginx:
file文件夹:
install-nginx.sh:##将安装好安装包的全部过程命令都写到这里
#!/bin/bash
cd /mnt
tar -zxf nginx-1.8.0.tar.gz
cd nginx-1.8.0
./configure --prefix=/usr/local/lnmp/nginx --with-http_ssl_module --with-http_stub_status_module
make && make install
nginx.conf:###所安装的nginx配置文件
nginx安装包
mainfests:
config.pp:
class nginx::config {
file {
"/usr/local/lnmp/nginx/conf/nginx.conf":
source => "puppet:///modules/nginx/nginx.conf",
require => Class["nginx::install"],
notify => Class["nginx::service"]
}
}
install.pp:
class nginx::install{
package {
["pcre-devel","gcc","openssl-devel"]:
ensure => present
}
file {
"/mnt/nginx-1.8.0.tar.gz":
source => "puppet:///modules/nginx/nginx-1.8.0.tar.gz";
"/mnt/install-nginx.sh":
source => "puppet:///modules/nginx/install-nginx.sh"
}
exec {
"install nginx":
command => "sh /mnt/install-nginx.sh",
creates => "/usr/local/lnmp/nginx",
provider => shell,
require => File["/mnt/install-nginx.sh"]
}
}
init.pp:
class nginx {
include nginx::install,nginx::config,nginx::service
}
service.pp:
class nginx::service {
exec {
"start nginx":
command => "/usr/local/lnmp/nginx/sbin/nginx",
provider => shell,
require => Class["nginx::config"]
}
}
MySQL:
files:
install-myslq.sh:
my.cnf
安装包
mainfests:
config.pp:
class mysql::config {
file {
"/etc/my.cnf":
source => "puppet:///modules/mysql/my.cnf",
require => Class[mysql::install],
notify => Class[mysql::service]
}
}
init.pp:
class mysql {
include mysql::install,mysql::config,mysql::service
}
install.pp:
class mysql::install {
package {
["gcc-c++","make","ncurses-devel","bison","zlib-devel","cmake"]:
ensure => present
}
file {
"/mnt/mysql-5.5.12.tar.gz":
source => "puppet:///modules/mysql/mysql-5.5.12.tar.gz";
"/mnt/install-mysql.sh":
source => "puppet:///modules/mysql/install-mysql.sh"
}
exec {
"install mysql":
command => "cd /mnt;sh install-mysql.sh",
provider => shell,
creates => "/usr/local/lnmp/mysql",
timeout => 9999,
require => File["/mnt/install-mysql.sh"],
tries => 3
}
}
service.pp:
class mysql::service {
exec {
"start mysql":
command => "/etc/init.d/mysqld start",
provider => shell,
require => Class["mysql::install"]
}
}
php:...
Ansible:
OS Provisioning:PXE,Cobbler(repository,distritution,profile)
PXE:Dhcp(服务端udp 67 客户端udp 68)
Tftp(udp 69)
Dnsmasq:dhcp
OS config:
Puppet,saltstack
运维工具分类:
Agent:puppet,saltstack
无agent:ansible,依赖于每一个被管理主机运ssh服务
Aansible特色:
使用简单,灵活
模块可以使用任意语言
多任务批量执行-->>playbook
YAML标签来定义文本文档格式
当管理多个不一样服务的服务器时,每一个服务器都须要安装
NTP 时间同步
基本结构组件(5个):
Ansible core:核心组件
Host Inventory主机列表:用来定义由ansible可以管理的服务器的IP地址,掩码,ssh用户密码等信息
支持分类,分组
Core核心模块:调用管理模块来针对某个用户完成相对任务
大部分任务 而不是所有任务
Custom自定义模块:能够用各类语言来自定义模块,完成ansible不具备的模块
Connection 链接插件:用来与主机链接,链接插件paramiko
Playbook:用于将一个或多个主机须要进行的任务记录下来用于执行,能够屡次调用执行,yaml,jinjia2定义模板
特性:1,基于Python实现,paramiko,pyyaml,jinjia2三个关键模块
2,部署简单,无agent
3,默认使用ssh协议,1,密钥认证;2,在inventor中指明密码
4,主从模式:master:asible,ssh 客户端
Slave:ssh server
5,支持自定义模块,支持各类编程语言
6,支持playbook
7,基于模块完成各类任务
配置文件:/etc/ansible/ansible.cfg定义批量执行的个数等信息
/etc/ansible/hostsinventory记录表
分组
[web]
Ip
[mysql]
ip
支持通配符[001:006]
命令:ansible-playbook
Ansble-doc -l:显示ansible支持的模块
Ansible-doc -s:查看模块的具体信息
Ansible [主机] -m 模块 -a ‘参数’
Ansible webserver -m cron -a ‘minute=’*/10’ job=’/bin/echo hello’ name=’test cron job’ ’
Ping:测试指定主机可否链接
Service:指定运行状态
Enable=:取值true 开机启动,flase开机不启动
Name=:服务名称
State=:状态,取值有 started,stopped,restarted
Shell:在远程主机上执行命令,尤为是管道等功能复杂的命令
Script:将本地脚本复制到远程主机并运行,要使用相对路径指定脚本
Yum 安装程序包
Name:指明要安装的程序包,能够带上版本号
State:present,lastest表示安装,absent表示卸载
YAML 标记语言:
键值对加缩进
可读性好
和脚本语言交互好
使用实现语言的数据类型
有一个一致的信息模型
易于实现
基于流来处理
表达能力强,扩展性好
语法:
YAML的语法和其余告诫语言相似,而且能够简单的表达清单,散列表,标量的数据结构,其结构经过空格来展现,序列(同一类对象有多个时叫序列)里的项用‘ - ’ 表示,Map里的键值对用‘ :’分隔
List序列/列表:
用 - 表示,表示同一类型的对象
Dictionary 字典:
一个键对应一组值,也能够放置于{key:value}中
基础元素:
变量
Inventory
条件测试
迭代
Playbook的组成结构:
Inventory
Modules
Ad Hoc Commands
Playbooks
Tasks:任务,调用模块完成的某操做
Varliables:变量
Templates:模板
Handlers:处理器,有某件事情触发执行的操做
Roles:角色
基本结构:
- host: webservers
remote_user:
tasks:
- task1
module_name:module_args
- task2