運維工具
當前常見的運維工具(Configuration)有以下一種
puppret(ruby)
saltstack(python)
chef
cfengine
....
Command and Control;
fabricfunc
程序發佈:
手動發佈 腳本發佈 發佈程序(運維程序) 程序發佈要求:1、不能影響用戶體驗;2、系統不能停機;3、不能導致系統故障或造成系統完全不可用; 灰度發佈模型(考慮以下兩種維度):1、主機;2、用戶; 發佈思路: /webapps/tuangou /webapps/tuangou-1.1/webapps/tuangou-1.2將程序解壓縮,解壓縮後進行文件鏈接,近期版本不刪除, 一邊後期能夠出問題能夠進行回滾; 在調度器上先下線一批主機(標記爲維護模式)-->關閉服務-->部署新版本-->啓動服務-->在調度器上啓用這一批主機;
運維工具的分類
agent:puppet,func,...agentless(ssh):ansible,fabric
Ansible
輕量化運維工具 能夠提供Configuration和Command and Control的功能 Ansible的特性: 模塊化:調用特定的模塊,完成特定的任務; 基於Python語言實現,由paramiko,PyYAML和jinja2三個關鍵模塊; 部署簡單:agentless; 支持自定義模塊; 支持playbook; 冪等性:一個命令執行一邊和多邊的效果是一樣的。
Ansible的安裝及應用:
yum的epel源, 配置文件:/etc/ansible/ansible.cfg 主機清單:/etc/ansible/hosts 主程序: ansible ansible-playbook ansible-doc ansible的簡單使用格式: ansible HOST-PATTERN -m MOD_NAME -a MOD_ARGS ansible-doc -s MOD_name ansible的常用模塊: 獲取模塊列表: ansible-doc -l command模塊:在遠程主機運行命令,不支持“|” ansible websrvs -m command -a "useradd user1" shell模塊:遠程主機在shell進程中中運行 ansible websrvs -m shell - a "echo magedu | password --stdin user1" copy模塊:複製文件至遠程主機; 用法:(1)src= dest= ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab" (2)content= dest= //直接把內容作爲數據流傳輸至文件; ansible all -m copy -a "content='hello world\n' dest=/tmp/testfile" owner,group,mode cron模塊:manage cron.d and crontab entries minute= hour= day= weekday= job= *name= //必須有此參數 state= present //默認爲添加 absent //刪除crontab ansible all -m cron -a "minute=*/5 job='/sbin/ntpdate 172.16.0.1 &> /dev/null' name=Synctime" fetch模塊:從遠程主機拉去文件至當前機器; file模塊:修改文件屬性; *path= //必須有此參數 用法:(1)創建連接文件 ansible all -m file -a "src=/tmp/fstab path=/tmp/fstab.link state=link" (2)修改屬性:path= owner= mode= group= (3)創建目錄:path= state=directory ansible all -m file -a "path=/tmp/tmpdir state=directory" hostname模塊:manage hostname name= ping模塊: pip模塊:用來管理Python的依賴模塊; yum模塊:用yum來管理程序包 *name=:指明程序包名稱,可以帶版本號 //必須有此參數 state= present,latest(安裝),absent(卸載); ansible all -m yum -a "name=httpd state=latest" service模塊:管理服務 *name= //必須有此參數 state= started,stopped,restarted; enabled= 1|0 //開機自啓動; runlevel= ansible all -m service -a "name=httpd state=started" uri模塊:uri的訪問管理 user模塊:管理用戶賬戶; *name system= yes|no //yes是系統賬戶 uid= shell= group= groups= comment= home= move_home= remove= //當state=agent是刪除家目錄 ansible all -m user -a "name=user3 system=yes state=present uid=306" setup模塊:用於獲取facts; group模塊:添加或刪除組 *name= //必須給的參數 state system gid= scipt模塊:把本地腳本傳遞到遠程主機後進行執行; ansible -m script -a "/path/to/script_file"
YAML:
YAML簡介:
YAML是一個可讀性高的用來表達資料序列的格式。YAML參考了其他多種語言, 包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822等。Evans在2001年首次發表了這種語言, 另外Ingy dot Net 與 Ben-kiki也是這種語言的共同設計者;YAML Ain`t Markup Language,即YAML不是XML。 不過,在開發的這種語言時,YAML的意思是:“Yet Another Markup Language”(仍是一種標記語言)。 其特性: YAML的可讀性較好; YAML和腳本語言的交互性很好; YAML有一個一致的信息模型; YAML易於實現; YAML可以基於流來處理; YAML表達能力強,擴展性好;
YAML語法:
YAML的語法和其他高階語言類似,並且可以簡單表達清單、散列表、標量等數據結構。 其結構(structure)通過空格來展示,序列(Sequence)裏的項用“-”來代表,Map裏的鍵值對用“:”分隔。 Playbook: Playbook的核心元素: Hosts:主機 Tasks:任務 variables: Templates:包含了模板的文本文件; Handlers:由特定條件出發任務; Roles: playbook的基礎組件 Hosts:運行指定任務的目標主機; remoute_user:在遠程主機上執行任務的用戶; sudu_user: tasks:任務列表 模塊,模塊參數; 格式: (1)action:module arguments (2)module:arguments handlers: 任務,在特定條件下觸發; 接收到其他任務的通知時被觸發; variables: (1)facts:可直接調用; (2)ansible-playbook命令行中的自定義變量; -e VARS,--extra-vars=VARS (3)通過role傳遞變量; (4)Host Inventory (1)向不同的主機傳遞不同的變量; ip/hostname varaiable=value var2=value2 (2)向組中主機傳遞相同的變量 [groupname:vars] variable=value invertory參數: 用於定義ansible遠程連接目標主機時的參數,而非傳遞給playbook的變量; ansible_ssh_host ansible_ssh_port ansible_ssh_user ansible_ssh_pass ansible_sudo_pass .... **注意:shell和command模塊後直接跟命令即可** **某任務的狀態在運行後爲changed時,可通過“notify”通知給相應的handlers;** **任務可以通過“tags”打標籤,而後可在ansible-playbook命令上使用-t指定進行調用;** playbook的使用方法: ansible-playbook在執行命令時,第一個任務執行完成後執行第二個任務,第二個執行完成後,執行第三個任務; ansible-playbook --list-host //顯示執行的主機列表; --check //在目標主機進行檢測可能會發生改變,但並不執行; -t tags //指明任務 ansible-palybook -t instconf web.yml //進行標籤爲instconf的項目; playbook示例1:編寫sample.yaml - hosts: remote_user:root tasks: - name: create a user user3 user: name=user3 system=true uid=307 - name: creare a user user4 user: name=user4 system=true uid=308 playbook示例2:編寫web.yml - hosts: websrvs remote_user: root tasks: - name: install httpd package yum: name=httpd state=present - name: install configure file copy: src=files/httpd.conf dest=/etc/httpd/conf/ //src爲相對路徑 tags: instconf notify: restart httpd - name: start httpd.service serivce: name=httpd state=started -name: execute ss command shell: ss -tnl | grep 8080 - handlers: - name: restart httpd service: name=httpd state=restarted