運維自動化發展歷程及技術應用 IaaS基礎設施即服務(相當於賣硬體) ,PaaS平臺即服務(賣操作系統),SaaS軟體即服務(賣軟體) 企業實際應用場景分析 灰度環境(生產環境的一部分) 功能:在全量發佈代碼前將代碼的功能面向少量精準用戶發佈的環境,可基於主機或用戶執行灰度發佈 案例:共100台生產 ...
運維自動化發展歷程及技術應用 IaaS基礎設施即服務(相當於賣硬體) ,PaaS平臺即服務(賣操作系統),SaaS軟體即服務(賣軟體) 企業實際應用場景分析 灰度環境(生產環境的一部分) 功能:在全量發佈代碼前將代碼的功能面向少量精準用戶發佈的環境,可基於主機或用戶執行灰度發佈 案例:共100台生產伺服器,先發佈其中的10台伺服器,這10台伺服器就是灰度伺服器 灰度環境:往往該版本功能變更較大,為保險起見特意先讓一部分用戶優化體驗該功能,待這部分用戶使用沒有重大問題的時候,再全量發佈至所有伺服器 程式發佈 程式發佈要求: 不能導致系統故障或造成系統完全不可用 不能影響用戶體驗 預發佈驗證: 新版本的代碼先發佈到伺服器(跟線上環境配置完全相同,只是未接入到調度器) 灰度發佈: 基於主機,用戶,業務 發佈路徑: /webapp/tuangou /webapp/tuangou-1.1 /webapp/tuangou-1.2 發佈過程:在調度器上下線一批主機(標記為maintanance狀態) --> 關閉服務 --> 部署新版本的應用程式 --> 啟動服務 --> 在調度器上啟用這一批伺服器 自動化灰度發佈:腳本、發佈 常用自動化運維工具 Ansible:python,Agentless,中小型應用環境 (管理上百台機器) 利用ssh協議遠程來進行管理,基於key驗證,把管理者的公鑰傳到被管理的主機上去, Saltstack:python,一般需部署agent(代理),執行效率更高 (管理上千台機器) Puppet:ruby, 功能強大,配置複雜,重型,適合大型環境 (管理上百台機器) Fabric:python,agentless Chef: ruby,國內應用少 Cfengine func Ansible簡介 Ansible是一個簡單的自動化運維管理工具,基於Python語言實現,由ParamikoPyYAML兩個關鍵模塊構建,可用於自動化部署應用、配置、編排task(持續交付、無宕機更等)。 Ansible官網:https://www.ansible.com/ github地址:https://github.com/Ansible 特性 模塊化:調用特定的模塊,完成特定任務,一千多個模塊 有Paramiko,PyYAML,Jinja2(模板語言)三個關鍵模塊 支持自定義模塊 基於Python語言實現 部署簡單,基於python和SSH(預設已安裝)免代理,agentless 安全,基於OpenSSH 支持playbook編排任務 冪等性:一個任務執行1遍和執行n遍效果一樣,不因重覆執行帶來意外情況 無需代理不依賴PKI(無需ssl) 可使用任何編程語言寫模塊 AML格式,編排任務,支持豐富的數據結構 較強大的多層解決方案 Ansible主要組成部分 1:ANSIBLE PLAYBOOKS:任務劇本(任務集),編排定義Ansible任務集的配置文件,由Ansible順序 依次執行,通常是JSON格式的YML文件 2:INVENTORY:Ansible管理主機的清單/etc/ansible/hosts 3:MODULES:Ansible執行命令的功能模塊,多數為內置核心模塊,也可自定義 4:PLUGINS:模塊功能的補充,如連接類型插件、迴圈插件、變數插件、過濾插件等,該功能不常用 5:API:供第三方程式調用的應用程式編程介面 6:ANSIBLE:組合INVENTORY、API、MODULES、PLUGINS的綠框,可以理解為是ansible命令工 具,其為核心執行工具 7:Ansible命令執行來源: U7SER,普通用戶,即SYSTEM ADMINISTRATOR CMDB(配置管理資料庫) API 調用 PUBLIC/PRIVATE CLOUD API調用 USER-> Ansible Playbook -> Ansibile 8:利用ansible實現管理的方式: Ad-Hoc 即ansible命令,主要用於臨時命令使用場景 Ansible-playbook 主要用於長期規劃好的,大型項目的場景,需要有前提的規劃 9:Ansible-playbook(劇本)執行過程: 將已有編排好的任務集寫入Ansible-Playbook 通過ansible-playbook命令分拆任務集至逐條ansible命令,按預定規則逐條執行 10:Ansible主要操作對象: HOSTS主機 NETWORKING網路設備 11:註意事項 執行ansible的主機一般稱為主控端,中控,master或堡壘機 主控端Python版本需要2.6或以上 被控端Python版本小於2.4需要安裝python-simplejson 被控端如開啟SELinux需要安裝libselinux-python windows不能做為主控端 安裝 rpm包安裝: EPEL源 yum install ansible 編譯安裝: yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto tar xf ansible-1.5.4.tar.gz cd ansible-1.5.4 python setup.py build python setup.py install mkdir /etc/ansible cp -r examples/* /etc/ansible Git方式: git clone git://github.com/ansible/ansible.git --recursive cd ./ansible source ./hacking/env-setup pip安裝: pip是安裝Python包的管理器,類似yum yum install python-pip python-devel yum install gcc glibc-devel zibl-devel rpm-bulid openssl-devel pip install --upgrade pip pip install ansible --upgrade 確認安裝: ansible --version 配置文件 /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性,(軟連接指向新版本,方便) /etc/ansible/hosts 主機清單 , /etc/ansible/roles/ 存放角色的目錄 程式 /usr/bin/ansible 主程式,臨時命令執行工具 /usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具,相當於man命令 /usr/bin/ansible-galaxy(銀河) 下載/上傳優秀代碼或Roles模塊的官網平臺 /usr/bin/ansible-playbook 定製自動化任務,編排劇本工具/usr/bin/ansible-pull (拉取)遠程執行命令的工具 /usr/bin/ansible-vault 文件加密工具 /usr/bin/ansible-console 基於Console界面與用戶交互的執行工具 主機清單inventory Inventory 主機清單 ansible的主要功用在於批量主機操作,為了便捷地使用其中的部分主機,可以在inventory file中 將其分組命名 /etc/ansible/hosts文件格式 inventory文件遵循INI文件風格,中括弧中的字元為組名。可以將同一個主機同時歸併到多個不同的組中;此外,當如若目標主機使用了非預設的SSH埠,還可以在主機名稱之後使用冒號加埠號來標明 ntp.magedu.com [webservers] www1.magedu.com:2222 www2.magedu.com [dbservers] db1.magedu.com db2.magedu.com db3.magedu.com 如果主機名稱遵循相似的命名模式,還可以使用列表的方式標識各主機 · 示例: [websrvs] www[01:100].example.com [dbsrvs] db-[a:f].example.com ansible 配置文件 Ansible 配置文件/etc/ansible/ansible.cfg (一般保持預設) [defaults] #inventory = /etc/ansible/hosts # 主機列表配置文件 #library = /usr/share/my_modules/ # 庫文件存放目錄 #remote_tmp = $HOME/.ansible/tmp #臨時py命令文件存放在遠程主機目錄 #local_tmp = $HOME/.ansible/tmp # 本機的臨時命令執行目錄 #forks = 5 # 預設併發數 #sudo_user = root # 預設sudo 用戶 #ask_sudo_pass = True #每次執行ansible命令是否詢問ssh密碼 #ask_pass = True #remote_port = 22 #host_key_checking = False # 檢查對應伺服器的host_key,建議取消註釋 #log_path=/var/log/ansible.log #日誌文件 Ansible系列命令 ansible ansible-doc ansible-playbook ansible-vault ansible-console ansible-galaxy ansible-pull ansible-doc: 顯示模塊幫助 ansible-doc [options] [module...] -a 顯示所有模塊的文檔 -l, --list 列出可用模塊 -s, --snippet顯示指定模塊的playbook片段 示例: ansible-doc –l 列出所有模塊 ansible-doc ping 查看指定模塊幫助用法 ansible-doc –s ping 查看指定模塊幫助用法 ansible ansible通過ssh實現配置管理、應用部署、任務執行等功能,建議配置ansible端能基於密鑰認證的方式聯繫各被管理節點 ansible <host-pattern> [-m module_name] [-a args] (-a加參數) --version 顯示版本 -m module 指定模塊,預設為command -v 詳細過程 –vv -vvv更詳細 --list-hosts 顯示主機列表,可簡寫—list -k, --ask-pass 提示輸入ssh連接密碼,預設Key驗證 -K, --ask-become-pass 提示輸入sudo時的口令 -C, --check 檢查,並不執行 (測試) -T, --timeout=TIMEOUT 執行命令的超時時間,預設10s -u, --user=REMOTE_USER 執行遠程執行的用戶 -b, --become 代替舊版的sudo 切換 一、環境準備 centos7 192.168.30.110做主控端 192.168.30.100 、192.168.30.107 192.168.30.114 做被控端 二、搭建配置ansible [root@centos7 ~]# yum -y install ansible 查看版本信息 這裡面的ping是ansible的ping模塊; 清單列表不包括本機; 把要管理的主機加入到主機清單中 etc/ansible/hosts [root@centos7 ~]# ansible 192.168.30.100 -m ping 測試存活性是基於ssh服務的,基於密碼和key驗證,通常是基於key驗證;部署是把ssh的可以驗證做好 建議:在控制主機登錄主機的同時,如果不要每次都通過驗證登錄,則修改配置文件,預設提供YES啟動日誌的功能,手動註釋取消就行了 [root@centos7 ~]# vim /etc/ansible/ansible.cfg 在控制端主機生成公鑰,把公鑰傳到三台被控制端主機上去,實現key驗證 可以對主機清單做分組 ansible的Host-pattern(主機列表) 匹配主機的列表 All :表示所有Inventory(主機清單)中的所有主機 ansible all –m ping * :通配符 ansible “*” -m ping ansible 192.168.1.* -m ping ansible “*srvs” -m ping 或關係 ansible “websrvs:appsrvs” -m ping ansible “192.168.1.10:192.168.1.20” -m ping 邏輯與 ansible “websrvs:&dbsrvs” –m ping 在websrvs組並且在dbsrvs組中的主機 邏輯非 ansible ‘websrvs:!dbsrvs’ –m ping 在websrvs組,但不在dbsrvs組中的主機 註意:此處為單引號 綜合邏輯 ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ –m ping 正則表達式 ansible “websrvs:&dbsrvs” –m ping ansible “~(web|db).*\.magedu\.com” –m ping 邏輯與 ansible命令執行過程 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退出 執行狀態: 綠色:執行成功並且不需要做改變的操作 黃色:執行成功並且對目標主機做變更 紅色:執行失敗 ansible使用示例 示例 sudo 切換身份預設就是root, 以wang用戶執行ping存活檢測 ansible all -m ping -u wang -k 以wang sudo至root執行ping存活檢測(用wang用戶連接對方後,sudo到root身份執行操作) ansible all -m ping -u wang –b -k 以wang sudo至mage用戶執行ping存活檢測 ansible all -m ping -u wang –b -k --become-user mage 以wang sudo至root用戶執行ls ansible all -m command -u wang --become-user=root -a 'ls /root' -b –k -K ansible常用模塊 Command:在遠程主機執行命令,預設模塊,可忽略-m選項 ansible srvs -m command -a ‘service vsftpd start’ ansible srvs -m command -a ‘echo magedu |passwd --stdin wang’ 不成功此命令 不支持 $VARNAME < > | ; & 等,用shell模塊實現 Shell:和command相似,用shell執行命令 vim /etc/ansible/ansible.cfg 1:ansible srv -m shell -a ‘echo magedu |passwd –stdin wang’ :2:調用bash執行命令 類似 cat /tmp/stanley.md | awk -F‘|’ ‘{print $1,$2}’ &>/tmp/example.txt 這些複雜命令,即使使用shell也可能會失敗,解決辦法:寫到腳本時,copy到遠程,執行,再把需要的結果拉回執行命令的機器 Script:運行腳本 腳本模式、用於批量執行腳本 -a "/PATH/TO/SCRIPT_FILE“ snsible websrvs -m script -a f1.sh 在控制端的主機上編寫一個腳本,但是運行是在被控制端的主機上 Copy:從伺服器複製文件到客戶端, ansible srv -m copy -a “src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600,backup=yes” 如目標存在,預設覆蓋,此處指定先備份 ansible srv -m copy -a “content=‘test content\n’ dest=/tmp/f1.txt” 利用內容,直接生成目標文件 複製模塊、批量複製,拷貝文件到遠程主機 ansible [主機ip、主機組] -m copy -a "src=源文件 dest=目標路徑 owner=所有者 mode=許可權 backup=yes/no是否備份" 備份文件名稱比較長的 Fetch(抓取):把遠程的主機文件抓取到控住端的主機上,copy相反,目錄可先tar ansible srv -m fetch -a ‘src=/root/a.sh dest=/data/scripts’ File:設置文件屬性 (刪除文件的效果,創建軟硬連接) ansible srv -m file -a "path(管理的文件)=/root/a.sh owner=wang mode=755“ ansible web -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link(軟連接) ansible all -m file -a 'path(管理的文件)=/data state=absent(遞歸的刪除,缺席)' 已經刪除data文件夾 還可以[root@centos7 ~]# ansible all -m file -a 'path=/data/test.txt state=touch' 在被控制端的主機上創建test.txt 文件 創建軟連接 Hostname:管理主機名 ansible node1 -m hostname -a “name=websrv” 永久生效,但hosts文件沒有被改 Cron:計劃任務 [root@centos7 ~]# ansible-doc -s cron 調用模塊 支持時間:minute,hour,day,month,weekday ansible srv -m cron -a “minute=*/5(每5分鐘) job(後跟執行的命令)=‘/usr/sbin/ntpdate 172.16.0.1 &>/dev/null’ name=Synctime” 創建任務 ansible srv -m cron -a ‘state=absent name=Synctime’ 刪除任務 結果 Yum:管理包 ansible srv(all) -m yum -a ‘name=httpd state=latest(最新版)’ 安裝 [root@centos7 ~]# scp /etc/yum.repos.d/media.repo 192.168.30.107:/etc/yum. repos.d/media.repo 100% 140 64.3KB/s 00:00 [root@centos7 ~]# ansible all -m yum -a 'name=httpd state=present' ansible srv -m yum -a ‘name=httpd state=absent’ 刪除 ansible常用模塊 Service:管理服務 ansible-doc -s service ansible all -m service -a 'name=httpd state=stopped' ansible all -m service -a 'name=httpd state=started' ansible all –m service –a ‘name=httpd state=reloaded’ ansible all -m service -a 'name=httpd state=restarted' User:管理用戶 ansible all-m user -a 'name=user1 comment=“test user” uid=2048 home=/app/user1 group=root‘ ansible all -m user -a 'name=sysuser1 system=yes home=/app/sysuser1 ’ ansible all -m user -a ‘name=user1 state=absent remove=yes‘ 刪除用戶及家目錄等數據 [root@centos7 ~]# ansible all -m user -a 'name=testuser(用戶名) system=yes(系統賬號) groups(組)=wang,bin shell=/bin/csh' (shell類型) Group:管理組 ansible srv -m group -a "name=testgroup(組名) system=yes“ ansible srv -m group -a "name=testgroup state=absen(刪除組) ansible系列命令 ansible-galaxy (人們寫的劇本,下載ansible劇本框架工具,根據自己的需求下載相關的角色) 連接 https://galaxy.ansible.com 下載相應的roles 列出所有已安裝的galaxy ansible-galaxy list(列出有哪些裝好的角色) 安裝galaxy ansible-galaxy install geerlingguy.redis 刪除galaxy ansible-galaxy remove geerlingguy.redis ansible-pull 推送命令至遠程,效率無限提升,對運維要求較高 Ansible-playbook(劇本) ansible-playbook hello.yml(劇本文件) cat hello.yml #hello world yml file - hosts(主機清單): websrvs (主機清單的分組名) remote_user: root (遠程連接以root身份) tasks:(任務) - name: hello world(之後要做的事) ommand: /usr/bin/wall hello world (是-a後的所有的操作) [root@centos7 ~]# vim hello.yml [root@centos7 ~]# ansible-playbook hello.yml 用次命令執行 Ansible-vault 功能:管理加密解密yml文件 ansible-vault [create|decrypt|edit|encrypt|rekey|view] ansible-vault encrypt hello.yml 加密 ansible-vault decrypt hello.yml 解密 ansible-vault view hello.yml 查看 ansible-vault edit hello.yml 編輯加密文件 ansible-vault rekey hello.yml 修改口令 ansible-vault create new.yml 創建新文件 Ansible-console:2.0+新增,可交互執行命令,支持tab root@test (2)[f:10] $ 執行用戶@當前操作的主機組 (當前組的主機數量)[f:併發數]$ 設置併發數: forks n 例如: forks 10 切換組: cd 主機組 例如: cd web 列出當前組主機列表: list 列出所有的內置命令: ?或help 示例: root@all (2)[f:5]$ list root@all (2)[f:5]$ cd appsrvs root@appsrvs (2)[f:5]$ list root@appsrvs (2)[f:5]$ yum name=httpd state=present root@appsrvs (2)[f:5]$ service name=httpd state=started