自動化運維工具ansible初探web
-----------------------------------------------------------------------------------------------------------------------------------------------正則表達式
ansible做爲自動化運維工具篇幅會有不少,此篇只是初探,後面還會有內容shell
藍綠環境:準備兩套發佈環境,一套依舊是老版本,一套是剛上線的新版本,升級後先將平臺轉換到新版本的環境,若是新版本不穩定,此時能夠用調度器指到舊版本,平滑切換
centos
灰度環境:抽取少數佔比的服務器,發佈新版本更新,這小部分服務器更新能夠先讓某個地區或者某些特定用戶來提取使用,若是發現不穩定的地方能夠及時修改,等到新版本穩定時再大批量更新服務器
遠程系統維護日常用ansible和saltstack
app
ansible:控制端,服務器是被控制端,配置簡單,適合於中小型應用環境運維
saltstack:通常部署agent,配置複製,執行效率高ssh
因爲ansible也是基於openssh,因此管理起來最好仍是須要基於key驗證ide
ansible具備冪等性,也就是說某個任務執行一遍和執行n遍的效果同樣,舉例若是複製某個文件到100個服務器上,有些設備有該文件,有些設備沒有該文件,此時執行結果是有該文件的設備將被跳過,沒有的文件將會複製
工具
ansible基於ssh服務無需代理,puppet或者saltstack須要安裝代理
使用ansible管理服務器,須要知足兩個條件:
(1)ansible控制機能夠經過ssh鏈接到被控制機,基於key或者基於帳戶密碼驗證均可以
(2)被控制機的ip地址信息處於ansible的管理清單中
ansible,epel源安裝,yum install ansible
一、控制機對被控制機創建基於key鏈接
二、被控制機須要在ansible的主機清單中
配置文件
/etc/ansible/ansible.cfg 主配置文件
/etc/ansible/hosts 主機清單
/etc/ansible/roles 存放角色的目錄
主配置文件
/etc/ansible/ansible.conf該文件通常不用更改,不過爲了使用方便,建議
(1)搜索host_key_checking,將該項取消註釋,其意爲使用ssh鏈接時避免首次鏈接時讓輸入yes/no部分的提示,避免了批量操做的交互性
(2)搜索log_path,將該項取消註釋,工做中仍是須要查看ansible的日誌文件
(3)搜索module_name,取消注視後將command改成shell
主機清單
[組1]
IP1
IP2
IP...
[組2]
IPm
IPn
192.168.1.[1:3]7 ===>>表明192.168.1.17,192.168.1.27和192.168.1.37
ansible用法
ansible IP -m MODULE -a 'CMD'
組名
ALL
MODULE:模塊
ansible-doc -l,列出模塊列表,截止到如今共1852個
ansible-doc CMD,列出該模塊的詳細說明用法
默認狀況下模塊是用command模塊,所以若是咱們輸入command模塊支持的命令,此時-m COMMAND能夠省略不寫,例如
可是該模塊不支持邏輯關係重定向等符號,因此咱們能夠用-m shell 模塊,或者修改/etc/ansible/ansible.conf將默認模塊更改成shell,但此時若是再執行command模塊就必須-m command了
舉例說明
ansible centos7 -a 'echo hello > /app/hi'
沒有key驗證,經過密碼口令執行時候,有一命令ansilbe CLASS -m ping -b -k -K -u USER --->解釋-b:至關於sudo,-k:提示輸入ssh的口令,-K:提示輸入sudo口令,不然口令會被提示信息覆蓋形成操做失敗,-u 以遠程主機某個用戶的身份,使用sudo類須要在目標ip主機上添加sudo權限。命令舉例:
ansible中的邏輯關係
通配符
(1)ansible "*" -m ping,表明所有
(2)ansible 192.168.1.* -m ping,表明192.168.1.0-192.168.1.254
(3)ansible "*srvs" -m ping,表明srvs結尾的組別
或關係
(1)ansible "centos6:centos7" -m ping,表明在centos6或centos7的主機
(2)ansible "192.168.1.10:192.168.1.20" -m ping,表明192.168.1.10或192.168.1.1.20
與關係
ansible "centos6:¢os7" –m ping,表明在centos6和centos7的主機
非關係
ansible 'centos6:!centos7' –m ping,表明在centos6但不在centps7的主機
注意:此處爲單引號
綜合邏輯
ansible 'centos6:centos7:&redhat:!ubantu' –m ping,表明在centos6或者centos7的主機,這主機同時也在redhat,但不在ubantu
正則表達式
ansible "~(web|db).*\.chen\.com" –m ping,表明主機的網址符合web.chen.com或者db.chen.com
ansible經常使用模塊
copy模塊
(1)ansible CLASS -m copy -a 'src=/位置/文件 dest=/目標位置 mode=666 owner=chen'
src:源文件,dest:目標文件位置,mode:複製後賦予的權限,owner:複製後屬於哪一個擁有者
(2)ansible CLASS -m copy -a 'content="文本內容" dest=/位置/' --->文本內容複製到目標位置文件
fetch模塊:抓取文件
ansible CLASS -m fetch -a 'src=/位置/文件 dest=/位置/' --->抓取目標源文件到本機位置
圖片中能夠看到ansible很智能的將ip做爲文件夾包含了咱們抓取的文件,避免了文件重名覆蓋的問題
file模塊:設置文件屬性
(1)ansible CLASS -m file -a 'path=/位置/文件 owner=CLASS mode=640' --->設置路徑文件擁有者爲,權限是640
(2)ansible CLASS -m file -a 'src=/位置/文件 state=touch mode=777'
新建文件,權限是777
(3)ansible CLASS -m file -a 'src=/app/ancopy dest=/app/test state=link' --->創建軟鏈接,目標文件是源文件的軟連接,若是state=hard,則爲建立硬連接
(4)ansible CLASS -m file -a 'path=/路徑/目標文件 state=absent' --->刪除文件,少了一幅圖,指令以下ansible centos6 -m file 'path=/app/test state=absent'
注若是path=/app,將刪除/app整個目錄,若是該/app是個掛載點將不被刪除,只是刪除其中的全部文件
hostname模塊:管理主機名
ansible CLASS -m hostname -a 'name=NAME'
cron模塊:計劃任務
(1)ansible CLASS -m cron -a 'name=NAME minute=* job="CMD"' --->建立計劃任務,格式和cron計劃任務同樣,注意job後面指令屬於描述,須要引號
(2)ansible CLASS -m cron -a 'name=NAME state=absent' --->刪除計劃任務,若是刪除上圖的計劃任務,指令爲ansible centos6 -m cron -a 'name=ntptime state=absent'
(3)ansible CLASS -m cron -a 'name=NAME disabled=true job="CMD"' --->禁用計劃任務,再次啓用時輸入指令ansible CLASS -m cron -a 'name=NAME job="CMD"'便可
yum模塊:安裝
ansible CLASS -m yum -a 'name=PACKAGE state=installed' --->安裝,state的選項有present、install和latest,present、installed 是指安裝套件,而 latest是安裝最新版,也就是啓用epel源
ansible CLASS -m yum -a 'name=PACKAGE state=absent',卸載
service模塊:服務管理模塊
ansible CLASS -m service -a 'name=SERVICE state=started' --->開啓服務
state的狀態有:started開始、stopped中止、reloaded重載、restarted重啓
user模塊:用戶管理
(1)ansible CLASS -m user -a 'name=NAME comment="描述" uid=1000 home=/home/NAME group=GROUP' --->創建普通用戶
(2)ansible CLASS -m user -a 'name=NAME uid=200 home=/usr/bin/ system=yes group=root groups=bin,daemon shell=/sbin/nologin' --->創建系統用戶,group:主組,groups:附加組,shell:用戶shell類型
(3)ansible CLASS -m user -a 'name=NAME state=absent' --->刪除用戶,不刪除家目錄
ansible CLASS -m user -a 'name=NAME state=absent remove=yes' --->刪除用戶,同時刪除家目錄
group模塊:組管理
(1)ansible CLASS -m group -a 'name=NAME system=yes' --->建立系統組
(2)ansible CLASS -m group -a 'name=NAME state=absent' --->刪除組
script模塊:運行腳本
ansible CLASS -m script -a "/路徑/腳本"
總結
咱們能夠發現,在大部分模塊中,若是指令基本都是按照公式ansible CLASS -m MODULE -a 'name=NAME 其它擴展項',須要注意的是,當-a後的單引號(雙引號)中出現須要描述的文字或者cron模塊中的job時,描述性文字須要加上雙引號(單引號),舉例說明ansible CLASS -m cron -a 'name=NAME minute=* job="CMD"',也能夠寫做ansible CLASS -m cron -a "name=NAME minute=* job='CMD'",但兩個引號不能是同一種引號
刪除時候是ansible CLASS -m MODULE -a 'name=NAME state=absent'