(1)運維自動化發展歷程及技術應用
隨着運維自動化的發展,企業搭建生產環境經歷的過程由最原始的本地部署方式,再到選擇IaaS的基礎設施即服務時代,接着到選擇PaaS的平臺即服務時代,最後到選擇SaaS的軟件即服務時代的過程。下圖就是用形象的方式展現了運維自動化的發展歷程。
(2)運維工程師的核心職責
平臺架構組建:負責參與並審覈架構設計的合理性和可運維性,搭建運維平臺技術架構,經過開源解決方案,以確保在產品發佈以後能高效穩定的運行,保障並不斷提高服務的可用性,確保用戶數據安全,提高用戶體驗。
平常運營保障:負責用運維技術或者運維平臺確保產品能夠高效的發佈上線,負責保障產品7*24H穩定運行,在此期間對出現的各類問題能夠快速定位並解決;在平常工做中不斷優化系統架構和部署的合理性,以提高系統服務的穩定性。
性能、效率優化:用自動化的工具/平臺提高軟件在研發生命週期中的工程效率、不斷優化架構、提高部署效率、優化資源利用率支持產品的不斷迭代,須要不斷的進行架構優化調整。以確保整個產品可以在功能不斷豐富和複雜的條件下,同時保持高可用性。
(3)企業實際應用場景分析
(3.1)Dev開發環境
使用者:程序員
功能:程序員開發軟件,測試BUG的環境
管理者:程序員
(3.2)測試環境
使用者:QA測試工程師
功能:測試通過Dev環境測試經過的軟件的功能
管理着:運維
說明:測試環境每每有多套,測試環境知足測試功能便可,不宜過多。測試人員但願測試環境有多套,公司的多產品線併發,即多個版本,意味着多個版本同步測試;一般測試環境有多少套和產品線數量保持同樣
(3.3)發佈環境:代碼發佈機,有些公司爲堡壘機(安全屏障)
使用者:運維
功能:發佈代碼至生產環境
管理者:運維(有經驗)
發佈機:每每須要有2臺(準備)
(3.4)生產環境
使用者:運維,少數狀況開放權限給核心開發人員,極少數公司將權限徹底開放給開發人員並維護
功能:對用戶提供公司產品的服務
管理者:只能是運維
生產環境服務器數量:通常比較多,且應用很是重要,每每須要自動工具協助部署配置應用
(3.5)灰度環境:(生產環境的一部分)
使用者:運維
功能:在全量發佈代碼前將代碼的功能面向少許精準用戶發佈的環境,可基於主機或用戶執行灰度發佈
案例:共100臺生產服務器,先發布其中的10臺服務器,這10臺服務器就是灰度服務器
管理者:運維
灰度環境:每每該版本功能變動較大,爲保險起見特地先讓一部分用戶優化體驗功能,待這部分用戶使用沒有重大問題的時候,再全量發佈至全部服務器
(3.6)程序發佈
預發佈驗證:新版本的代碼先發布到服務器(跟線上環境配置徹底相同,只是未接入到調度器)
程序發佈:不能致使系統故障或形成系統徹底不可用;不能影響用戶體驗
灰度發佈:
發佈路徑:/webapp/tuangou-1.1
/webapp/tuangou
/webapp/tuangou-1.2
發佈過程:在調度器上下線一批主機(標記爲maintance狀態)-->關閉服務-->部署新版本的應用程序-->啓動服務-->在調度器上啓用這一批服務器
自動化灰度發佈:腳本、發佈平臺
(4)環境準備
(4.1)
# cd /etc/yum.repos.d
進入到yum.repos.d目錄下
# wget -O epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
下載epel源
# yum install ansible -y
安裝ansible軟件
# ansible --version
查看ansible的版本
# ansible 192.168.26.131,192.168.26.132 -m ping -k
在130服務器上鍊接131和132主機,並使用ask的模式鏈接,查看是否鏈接成功
# ansible all -m ping -k
能夠對/etc/ansible/hosts全部主機都進行鏈接測試,查看是否鏈接成功
(4.2)
咱們也能夠在/etc/ansible/hosts文件中將每臺主機進行分組,此時可使用組名來鏈接對應的主機
# ansible dbsrvs -m ping -k
鏈接dbsrvs組對應的服務器的信息,查看是否鏈接成功
# ansible all -m ping -vvv
能夠查看ansible命令在執行的時候執行的全部過程信息
(4.3)將/etc/ansible/ansible.cfg配置文件中的log_path = /var/log/ansible.log的註釋取消掉,此時全部ansible的操做都會記錄在日誌當中
將/etc/ansible/ansible.cfg配置文件中的host_key_checking = False註釋取消掉,此時在ssh鏈接到主機時,就不須要再輸入yes的應答了。
(4.4)
# ansible-doc -l | wc -l
統計doc文檔查看所包含的全部模塊
# ansible-doc -s ping
以片斷的方式查看指定模塊的幫助用法
# ansible all --list-hosts
能夠列出主機清單中的全部主機
# ansible all -m ping -u wang -k
若是在成員服務器中存在一個wang用戶,那麼咱們可使用wang用戶在Master主機上去執行測試是否鏈接成功
(4.5)若是咱們但願在130服務器上可以使用wang用戶經過sudo執行root的命令
# usermod -aG wheel wang
在131和132服務器上將wang用戶加入到wheel的附加組中(編輯/etc/sudoers文件)
# ansible all -m command -a 'ls /root' -u wang -k -b -K
m表示使用命令行,a參數表示指定的命令,u參數表示用戶,k表示ask,b表示默認使用root用戶的權限,K表示輸入sudo時二次驗證
(4.6)若是咱們但願在130服務器上可以使用wang用戶經過sudo執行root的命令,同時不用輸入二次驗證的密碼,能夠在131和132主機的# vim /etc/sudoers文件中進行修改
# ansible all -m command -a 'ls /root' -u wang -k -b
m表示使用命令行,a參數表示指定的命令,u參數表示用戶,k表示ask,b表示默認使用root用戶的權限,此時不用再輸入二次驗證的參數了
(4.7)建立基於密鑰驗證的方式
# ssh-keygen
建立ssh密鑰
# ssh-copy-id 192.168.26.131
# ssh-copy-id 192.168.26.132
將130主機上建立的密鑰傳送到131和132服務器上
# ansible all -m ping
此時咱們即可以正常的完成基於密鑰進行驗證的命令執行了
(4.8)
# ansible websrvs --list
查詢對應組名中的具體主機信息
# ansible srvs -m ping
使用號通配符匹配組名信息
# ansible 192.168.26. -m ping
使用號匹配IP地址信息
# ansible websrvs:dbsrvs -m ping
表示邏輯「或」的關係
# ansible 'websrvs:&dbsrvs' -m ping
表示邏輯與,在websrvs組而且在dbsrvs組中主機
# ansible 'websrvs:!dbsrvs' -m ping
表示邏輯非,在在websrvs組但不在dbsrvs組中主機
# ansible '~(web|db)srvs' -m ping
使用正則表達式其中~符號表示使用正則表達式語法
(4.9)ansible命令執行過程
1.加載本身的配置文件,默認爲/etc/ansible/ansible.cfg
2.加載本身對應的模塊文件,如command
3.經過ansible將模塊或命令生成對應的臨時py文件,並將該文件傳輸至遠程服務器的對應執行用戶$HOME/.ansible/tmp/ansible-tmp-數字/xxx.py文件
4.給文件+x執行
5.執行並返回結果
6.刪除臨時py文件,sleep 0退出
執行狀態:
1.綠色:執行成功而且不須要作改變的操做
2.黃色:執行成功而且對目標主機作變動
3.紅色:執行失敗
(4.10)使用示例
# ansible all -m ping -u wang -k
以wang用戶執行ping存活檢測
# ansible all -m ping -u wang -b -k
以wang用戶sudo至root執行ping存活檢測
# ansible all -m ping -u wang -b -k --become-user=root
以wang用戶sudo之root用戶執行ping存活檢測
# ansible all -m command -u wang --become-user=root -a 'ls /root' -b -k -K(兩次密碼都是輸入wang用戶的)
以wang用戶sudo至root用戶執行ls
# ansible all -m command -a 'ls -ld /data'
查看各個主機上的/data目錄下的文件
(4.11)
# ansible-doc command
查看command命令。其中creates表示其中一個文件或者一個模式已經存在了,將不做後面的操做了;removes表示其中一個文件或者一個模式不存在,將不做後面的操做了
# ansible all -a 'chdir=/boot ls'
表示切換到/boot目錄下執行ls命令
# ansible 192.168.26.* -a 'useradd test1'
建立一個用戶test1
# ansible 192.168.26.* -a 'getent passwd test1'
查詢建立的用戶test1是否有生成
(5)ansible經常使用模塊
(5.1)
Ping模塊:測試主機是否能夠鏈接
Command:在遠程主機執行命令,默認模塊,可忽略-m選項;此命令不支持$VARNAME、<、>、|、&等,需用shell模塊實現
Shell:和command類似,用shell執行命令
Script:運行腳本
# ansible 192.168.26.* -m shell -a 'echo $HOSTNAME'
使用shell模塊查詢主機名
# ansible 192.168.26.* -m shell -a 'echo redhat | passwd --stdin test1'
使用shell模塊改其餘主機的test1用戶的密碼
# ansible 192.168.26.* -m shell -a '> /data/f2'
在其餘主機的data目錄下建立一個空文件f2
# ansible 192.168.26.* -m shell -a 'ls /data'
查詢data目錄下的全部文件信息
# ansible 192.168.26.132 -m shell -a 'hostname node02'
將132服務器的主機名修改成node02
# ansible all -m script -a '/root/ansible/host.sh'
使用script模塊執行本地服務器上的host.sh腳本
(5.2)
Copy:從服務器複製文件到客戶端,若是目標存在,默認覆蓋,此處指定先備份
# ansible all -m copy -a 'src=/root/ansible/config dest=/etc/selinux/config backup=yes'
使用copy模塊,將本地的config文件拷貝到遠端主機的/etc/selinux目錄下,而且可以進行備份
# ansible all -m shell -a 'ls /etc/selinux/'
使用ls命令查看到config文件已經產生備份信息了
# ansible all -m copy -a 'src=/etc/shadow dest=/data/'
將130服務器上的shadow文件拷貝到其餘主機的data目錄下
# ansible all -m shell -a 'ls -l /data/shadow''
此時咱們使用ls命令發現文件複製過去後權限信息自動發生了其餘的改變,由000變成了644
# ansible all -m copy -a 'src=/etc/shadow dest=/data/ mode=000 owner=wang'
將130服務器上的shadow文件拷貝到其餘主機的data目錄下,同時權限修改成000,屬主信息修改成wang
# ansible all -m shell -a 'ls -l /data/shadow'
此時咱們發現相關的屬性信息已經發生了修改
# ansible all -m copy -a 'content="hello\nthanks\n" dest=/data/f2'
使用content參數能夠直接在遠端主機的對應目錄下的文件中生成內容
# ansible all -m shell -a 'cat /data/f2'
查看f2文件中生成的內容信息
(5.3)
Fetch:從客戶端抓取文件至服務器端,copy相反,目錄可先tar
# ansible all -m fetch -a 'src=/var/log/messages dest=/data'
從各主機上將/var/log/messages文件抓取到本地/data目錄下
# tree /data
查看當前130主機上的目錄結構
# ansible all -m shell -a 'tar zcvf log.tar.gz /var/log/*.log'
咱們將/var/log目錄下的全部.log結尾的文件進行壓縮成log.tar.gz文件並放在各主機的root家目錄下
# ansible all -m fetch -a 'src=/root/log.tar.gz dest=/data/'
將生成的log.tar.gz文件拷貝到本地130主機的/data目錄下
# tree /data
查看當前130主機上的目錄結構
# tar tvf /data/192.168.26.131/root/log.tar.gz
以不解壓的方式查看被壓縮的文件log.tar.gz中的內容信息
(5.4)File模塊:設置文件屬性
# ansible all -m file -a 'name=/data/f3 state=touch'
使用file模塊建立在/data目錄下建立f3文件,注意:name與dest、path的意思一致
# ansible all -a 'ls -l /data'
查看建立的f3文件是否存在
# ansible all -m file -a 'name=/data/f3 state=absent'
使用file模塊同時使用absent參數刪除f3文件
# ansible all -m file -a 'name=/data/dir1 state=directory'
使用file模塊同時使用directory參數建立一個文件夾,注意:若是刪除文件夾也是使用absent參數
# ansible all -m file -a 'src=/etc/fstab dest=/data/fstab.link state=link'
建立一個軟連接,其中源是/etc/fstab,目的文件爲fstab.link
# ansible all -a 'ls -l /data'
查看軟連接是否有生成
# ansible all -m file -a 'dest=/data/fstab.link state=absent'
若是軟連接不須要了,將軟連接刪除
(5.5)Hostname模塊:管理主機名
# vim /etc/hostname
通常修改主機名在hostname文件中配置主機名信息,而後重啓主機便可生效
# ansible 192.168.26.131 -m hostname -a 'name=node01.example.com'
修改131主機的主機名爲node01.example.com
(5.6)Cron模塊:計劃任務
# ansible all -m cron -a 'minute=* weekday=1,3,5,7 job="/usr/bin/wall FBI waring" name=warningcron'
建立一個計劃任務,在每週1,3,5,7的沒一分鐘執行一次告警信息
# ansible all -m cron -a 'disabled=true job="/usr/bin/wall FBI warning" name=warningcron'
將建立的計劃任務warningcron使用disabled參數進行註釋掉,使得告警信息解除
# ansible all -m cron -a 'job="/usr/bin/wall FBI warning" name=warningcron state=absent'
若是咱們建立的計劃任務須要刪除掉,此時使用state的狀態且參數值是absent
(5.7)Yum模塊
# rm -f /var/run/yum.pid
經驗總結:若是出現有yum進程刪除不掉,那麼就使用如上命令進行刪除
# ansible all -m yum -a 'name=vsftpd'
使用yum模塊,安裝vsftpd
# ansible all -m yum -a 'name=vsftpd,memcached,httpd'
若是同時安裝多個模塊的軟件,使用逗號隔開
# ansible all -m yum -a 'list=installed'
查詢目標主機全部裝好的安裝包
# ansible all -m yum -a 'name=vsftpd state=absent'
使用yum模塊,卸載vsftpd程序,使用absent參數
# ansible all -m yum -a 'name=vsftpd,memcached,httpd state=absent'
若是同時卸載多個模塊的軟件,使用逗號隔開,使用absent參數
# ansible all -m shell -a 'rpm -q vsftpd'
查詢vsftpd程序是否有安裝
需求實現:將互聯網下載的rpm包推送到遠端主機而且進行安裝。
# ansible all -m copy -a 'src=/data/vsftpd-3.0.2-22.el7.x86_64.rpm dest=/root/'
咱們首先將vsftpd-3.0.2-22.el7.x86_64.rpm從本地推送到各個服務器上
# ansible all -m yum -a 'name=/root/vsftpd-3.0.2-22.el7.x86_64.rpm'
使用root目錄下的rpm包文件進行安裝
# ansible all -m yum -a 'name=/root/vsftpd-3.0.2-22.el7.x86_64.rpm disable_gpg_check=yes'
安裝的時候能夠忽略gpgcheck的檢查
# ansible all -m yum -a 'name=dstat update_cache=yes'
在安裝dstat監控工具的時候將yum的緩存清理,設置update_cache=yes
(5.8)Service:管理服務
# ansible-doc -s service
查詢service的幫助文檔
# ansible all -m service -a 'name=vsftpd state=started enabled=yes'
設置vsftpd服務開機自動啓動,而且當前也爲啓動狀態(stopped,restarted是中止和重啓服務)
(5.9)User:管理用戶
# ansible all -m user -a 'name=nginx shell=/sbin/nologin system=yes home=/var/nginx groups=root,bin uid=80 comment="nginx service"'
建立一個用戶nginx,使用的是sbin下的nologin登陸,同時仍是系統帳號,建立的家目錄是/var/nginx,屬於root和bin的附加組,uid爲80,描述信息爲nginx service
# ansible all -a 'getent passwd nginx'
查看建立的nginx用戶的屬性
# ansible all -a 'ls -ld /var/nginx'
查詢的nginx服務的家目錄是否有建立
# ansible all -m user -a 'name=nginx state=absent remove=yes'
若是帳號不須要了進行刪除,同時將家目錄也刪除掉(注:默認值state=present)
(5.9)Group:組管理
# ansible all -m group -a 'name=nginx system=yes gid=80'
建立一個nginx的用戶組,使用的gid是80
# ansible all -a 'getent group nginx'
查詢建立的nginx的組是否存在
# ansible all -m group -a 'name=nginx state=absent'
若是不須要nginx組,那麼使用absent的狀態將建立的組刪除
(6)ansible系列命令
(6.1)
官方站點:https://galaxy.ansible.com/home
# ansible-galaxy install geerlingguy.nginx
下載角色文件
# tree /root/.ansible/roles
查看下載的文件的目錄信息
# ansible-galaxy list geerlingguy.nginx
查看下載的文件的版本信息
# ansible-galaxy remove geerlingguy.nginx
刪除下載的文件版本
(6.2)
Ansible-pull:推送命令之遠程,效率無線提高,對運維要求較高
Ansible-playbook模塊
# vim hello.yaml
編輯hello.yaml文件
# ansible-playbook hello.yaml
使用playbook執行hell.yaml文件
(6.3)
Ansible-vault:功能是管理加密解密yml文件
# ansible-vault encrypt hello.yaml
對建立的hello.yaml文件進行加密
# ansible-vault decrypt hello.yaml
將hello.yaml文件進行解密
# ansible-vault view hello.yaml
當文件加密的狀況下,查看hello.yaml文件的具體內容
# ansible-vault edit hello.yaml
對加密文件進行編輯
# ansible-vault rekey hello.yaml
對加密文件的口令進行修改
# ansible-vault create hello2.yaml
建立一個新的文件hello2.yaml同時將文件加密
(6.4)Ansible-console命令:2.0+新增,可交互執行命令,支持Tab
# ansible-console
使用命令行交互界面
$ cd websrvs
進入到websrvs組中
$ forks 10
使用10個併發
$ ?
列出全部的內置命令
$ command hostname
查看各個服務器的主機名
$ cd 192.168.26.132
進入到132的主機
$ hostname name=node02.example.com
修改132的主機名
$ yum name=httpd state=present
使用yum安裝httpd的服務
$ service name=httpd state=started
將httpd服務啓動起來node
—————— 本文至此結束,感謝閱讀 ——————linux