自動化運維管理工具: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