一:關於自動化咱們要知道的php
一、自動化是什麼?python
IT運維自動化是一組將靜態的設備結構轉化爲根據IT服務需求動態彈性響應的策略,目的就是實現IT運維的質量,下降成本。能夠說自動化運維必定是IT運維高層面的重要屬性之一。mysql
二、爲何要使用自動化技術?linux
當公司規模擴大,從初期的幾臺服務器發展到龐大的數據中心時,天然而然的單靠人工就沒法知足在技術、業務、管理等方面的要求,那麼標準化、自動化、架構優化、過程優化等下降IT服務成本的因素愈來愈被人們所重視。nginx
三、自動化的目的是什麼?web
自動化做爲其重要屬性之一已經不只僅只是代替人工操做,更重要的是深層探知和全局分析,關注的是在當前條件下如何實現性能與服務最優化,同時保障投資收益最大化。sql
二:自動化工具——Ansible軟件詳解shell
一、是什麼數據庫
基於python開發的,集合了衆多運維工具(puppet、chef、func、fabric)的優勢,實現了批量系統配置、批量程序部署、批量運行命令等功能。centos
二、Ansible軟件特色
①部署簡單,只需在主控端部署Ansible環境,被控端無需作任何操做;
②默認使用SSH協議對設備進行管理;
③有大量常規運維操做模塊,可實現平常絕大部分操做。
④配置簡單、功能強大、擴展性強;
⑤支持API及自定義模塊,可經過Python輕鬆擴展;
⑥經過Playbooks來定製強大的配置、狀態管理;
⑦輕量級,無需在客戶端安裝agent,更新時,只需在操做機上 進行一次更新便可;
⑧提供一個功能強大、操做性強的Web管理界面和REST API接口 ——AWX平臺。
三、Ansible基本架構圖 && 核心組件說明
Ansible:Ansible核心程序。 HostInventory:記錄由Ansible管理的主機信息,包括端口、密碼 、ip等。 Playbooks:「劇本」YAML格式文件,多個任務定義在一個文件 中,定義主機須要調用哪些模塊來完成的功能。 CoreModules:核心模塊,主要操做是經過調用核心模塊來完成管 理任務。 CustomModules:自定義模塊,完成核心模塊沒法完成的功能, 支持多種語言。 ConnectionPlugins:鏈接插件,Ansible和Host通訊使用
四、ansible任務執行模式:單個命令、批量命令
①ad-hoc模式:使用單個模塊,支持批量執行單條命令。 ad-hoc 命令是一種能夠快速輸入的命令,並且不須要保存起來的命令。就至關於bash中的一句話shell。
②playbook模式:是Ansible主要管理方式,也是Ansible功能強大的關 鍵所在。playbook經過多個task集合完成一類功能,如Web服務的安裝部署、數據庫服務器的批量備份等。能夠簡單地把playbook理解爲經過組合多條ad-hoc進行操做的配置文件。
五、ansible執行流程 && 流程描述
一、加載本身的配置文件 默認/etc/ansible/ansible.cfg 二、查找對應的主機配置文件,找到要執行的主機或者組 三、加載本身對應的模塊文件,如command 四、經過ansible將模塊或命令生成對應的臨時py文件,並將該文件傳 輸至遠程服務器的 五、對應執行用戶的家目錄的.ansible/tmp/XXX/XXX.PY文件 六、給文件+x執行 七、執行並返回結果 八、刪除臨時py文件,sleep 0退出
三:Ansible經常使用命令及用法
※經常使用命令
/usr/bin/ansible # Ansibe AD-Hoc 臨時命令執行工具,經常使用於臨時命 令的執行 /usr/bin/ansible-doc # Ansible 模塊功能查看工具 /usr/bin/ansible-galaxy # 下載/上傳優秀代碼或Roles模塊 的官網平臺 ,基於網絡的 /usr/bin/ansible-playbook # Ansible 定製自動化的任務集編排工具 /usr/bin/ansible-pull # Ansible遠程執行命令的工具,拉取配置而非推 送配置(使用較少,海量機器時使用,對運維的架構能力要求較高) /usr/bin/ansible-vault # Ansible 文件加密工具 /usr/bin/ansible-console # Ansible基於Linux Consoble界面可與用戶交互的命令執行工具
※命令詳解
一、ansible-doc
(1)命令格式
ansible-doc [options] [module...]
(2)options
-h:--help 顯示命令參考API文檔
-l:--list 列出可用模塊
-M module_path:--module-path=module_path 指定模塊路徑
-s mode_name:--snippet 獲取指定模塊的使用幫助
--version:顯示版本信息
二、ansible
(1)命令格式
①ansible [-f forks] [-m module_name] [-a args] ②ansible <host-pattern> [options] Options
(2)options
· -a MODULE_ARGS, --args=MODULE_ARGS :模塊的參數,若是執行默認COMMAND的模塊,便是命令參數 ,如:「date」,「pwd」等等 module arguments 模塊 參數 · -m MODULE_NAME, --module-name=MODULE_NAME:執行模塊的名字,默認使用"command" 模塊,因此若是是隻執行單一命令能夠不用 · -M MODULE_PATH, --module-path=MODULE_PATH:要執行的模塊的路徑(default:/usr/share/ansible) · -f FORKS, --forks=FORKS: 並行任務數(default:5) · -C, --check:測試模式。測試一下會改變什麼內容,不會真正去執行;相反,試圖預測一些可能發生的變化 · -c connection,--connection=CONNECTION:鏈接類型使用(default:smart) · -v, --verbose(-vvv,-vvvv):顯示命令執行的詳細信息/超詳細信息 (常和-C配合使用,用於運行前測試環節) · -i INVENTORY, --inventory-file=INVENTORY:指定主機清單存放路徑,默認爲/etc/ansible/hosts · -S, --su :使用 su 命令 · -R SU_USER, --su-user=SU_USER 指定SU的用戶(default:root) · -s, --sudo:以sudo方式運行(不須要密碼) · -U SUDO_USER, --sudo-user=SUDO_USER :sudo到哪一個用戶(default:root) · -T TIMEOUT, --timeout=TIMEOUT:指定SSH默認超時時間(default:10s) · -u REMOTE_USER, --user=REMOTE_USER:默認鏈接到遠程主機哪一個用戶(default:root) · -k, --ask-pass:登錄密碼,提示輸入ssh密碼而不是假設基於密鑰的驗證 · -K, --ask-sudo-pass:提示密碼使用sudo,sudo表示提權操做 · -B SECONDS, --background=SECONDS:後臺運行超時時間 · -h,--help:查看幫助 · -o, --one-line:壓縮輸出,摘要輸出,嘗試將全部內容都在一行上輸出。 · -private-key=PRIVATE_KEY_FILE:私鑰路徑,使用這個文件來驗證鏈接
(3)經常使用模塊
①ping 測試主機網絡連通性
[root@server ~]# ansible all -m ping 172.17.214.75 | SUCCESS => { "changed": false, "ping": "pong" } 172.17.214.74 | SUCCESS => { "changed": false, "ping": "pong" }
②command執行命令
[root@server ~]# ansible webserver -m command -a 'ifconfig' 在webserver主機組上執行命令ifconfig
注意:命令模式下,'' 的用法 :'命令名稱+用空格分隔的列表參數', 給定的命令將在全部指定節點上執行,但不支持shell命令模式,以下列幾種:
$arg、"<"、">"、"|"、";"、"&"等shell命令,有其特定的命令:
· chdir=dir_name:切換目錄
· executable:切換shell來執行命令(注意:命令要使用絕對路徑表示)
· free_form:要執行的linux命令,通常用-a選項代替
· creates=file_name:文件存在,則命令不執行,只可用來作判斷
· removes=file_name:文件存在,則命令執行,也用來作判斷
使用示例以下:
①[root@server ~]# ansible all -m command -a 'creates=/app/hehe.w ls' 172.17.214.74 | SUCCESS | rc=0 >> skipped, since /app/hehe.w exists 172.17.214.75 | SUCCESS | rc=0 >> skipped, since /app/hehe.w exists 由於兩主機都存在此文件,因此ls命令不執行 ②[root@server ~]# ansible all -m command -a 'removes=/app/hehe.w ls' 172.17.214.74 | SUCCESS | rc=0 >> 172.17.214.75 | SUCCESS | rc=0 >> 兩主機文件存在,則執行此ls命令
③shell 遠程主機執行shell命令(支持管道、重定向等特殊符號)
[root@server ~]# ansible all -m shell -a 'cat /etc/passwd | grep "root"' 172.17.214.74 | SUCCESS | rc=0 >> root:x:0:0:root:/root:/bin/bash 172.17.214.75 | SUCCESS | rc=0 >> root:x:0:0:root:/root:/bin/bash
④copy 複製文件到遠程主機
copy模塊常見用法: 一、複製文件 -a "src= dest= " 二、生成指定內容的文件 -a "content= dest= " copy模塊經常使用選項: ①backup=<yes|no> :覆蓋文件以前,備份原文件 ②content:功能與重定向">"相同,文件存在則覆蓋文件內容(default),不能存在則建立指定內容文件 ③dest:文件或目錄,必須爲絕對路徑 ④src:文件或目錄,相對路徑|絕對路徑。 ⑤directory_mode:遞歸設置目錄權限,默認爲系統默認權限 ⑥force yes|no :設爲yes時,若目標主機包含該文件,則強制覆蓋;若爲no,則只有目標主機不存在該文件時才複製。(default:yes) ⑦others:全部file模塊裏的選項均可以在這裏面使用。
⑤file 設置文件屬性
常見用法: 一、建立目錄 -a 'path= state=directory' 二、建立連接文件 -a 'path= src= state=link' 三、刪除文件 -a 'path= state=absent' 四、常見選項: ①force yes|no:強制建立軟連接。第一,源文件不存在,但稍後會建立;第二,目標軟連接已存在,須要先取消以前的連接關係,建立新的軟連接。 ②group:定義文件/目錄的屬組 mode:定義文件/目錄權限 ③owner:定義文件/目錄的屬主 path:定義文件/目錄路徑(必選項) ④recurse:遞歸設置文件屬性 ⑤src:被連接的源文件路徑,只應用於state=link ⑥dest:被連接的文件路徑,只應用於state=link ⑦state: directory:若目錄不存在,則建立目錄 file:文件不存在也不建立 link:建立軟鏈接 hard:建立硬連接 touch:若文件不存在,則會建立一個新文件, 若存在,則更新時間戳 absent:刪除文件、目錄、連接文件
⑥fetch 從遠程某主機獲取文件到本地
dest:本機用來存放拉過來的文件或目錄的目錄 src:遠程文件。(只能爲文件)
⑦cron 管理計劃任務
常見action: cron backup=<yes|no>:建立一個crontab備份 cron_file=file_name:若是使用,使用這個cron.d,而不是單個用戶 常見時間選項: day= #日應該運行的工做( 1-31, *, */2, ) hour= # 小時 ( 0-23, *, */2, ) minute= #分鐘( 0-59, *, */2, ) month= # 月( 1-12, *, /2, ) weekday # 周 ( 0-6 for Sunday-Saturday) 經常使用選項: jod="" :指明執行的命令 name="":任務描述 reboot 任務在重啓時運行。(不建議使用,建議使用special_time) special_time="":特殊的時間範圍,參數有:reboot(重啓時),annually(每一年),monthly(每個月),weekly (每週),daily(天天),hourly(每小時) state="":指定狀態,常見狀態有present(添加定時任務)、absent(刪除定時任務) user="":以哪一個用戶身份去運行 eg:每五分鐘同步各主機時間 [root@server ~]# ansible all -m cron -a 'name="sync date per second 5 min" minute="*/5" job="/usr/sbin/ntpdate 172.17.0.1 &> /dev/null"' [root@server ~]# ansible all -m shell -a 'crontab -l' #查看計劃任務添加狀況
⑧yum 安裝軟件
name= #所安裝的包的名稱 state= #present(安裝), latest(安裝最新的), absent(卸載軟件)。 update_cache #強制更新yum的緩存。 conf_file #設定遠程yum安裝時所依賴的配置文件。如配置文件沒有在默認的位置。 disable_gpg_check #是否禁止GPG checking,只用於`present‘ or `latest’。 disablerepo #臨時禁止使用yum庫。 只用於安裝或更新時 enablerepo #臨時使用的yum庫。只用於安裝或更新時。
⑨service 服務管理
arguments #命令行提供額外的參數 enabled=<true|false> #設置開機啓動。 name= #服務名稱 runlevel #開機啓動的級別,通常不用指定。 sleep #在重啓服務的過程當中,是否等待。如在服務關閉之後等待2秒再啓動。 state #started啓動服務, stopped中止服務, restarted重啓服務, reloaded重載配置
⑩user 用戶和帳號管理
comment # 用戶的描述信息 createhome # 是否建立家目錄 force # 在使用state=absent時, 行爲與userdel –force一致. group # 指定基本組 groups # 指定附加組,若是指定爲(groups=)表示刪除全部組 home # 指定用戶家目錄 move_home # 若是設置爲home=時, 試圖將用戶主目錄移動到指定的目錄 name # 指定用戶名 non_unique # 該選項容許改變非惟一的用戶ID值 password # 指定用戶密碼 remove # 在使用state=absent時, 行爲是與userdel –remove一致 shell # 指定默認shell state # 設置賬號狀態,不指定爲建立,指定值爲absent表示刪除 system # 當建立一個用戶,設置這個用戶是系統用戶。這個設置不能更改現有用戶 uid # 指定用戶的uid update_password # 更新用戶密碼
⑪group 組管理,添加或刪除組
gid #設置組的GID號 name= #組名 state #指定組狀態,默認爲建立(present),設置值爲absent爲刪除 system #設置值爲yes,表示爲建立系統組
⑫script 運行服務器端腳本
ansible all -m script -a '/root/test.sh'
⑬setup 查看機器全部facts信息
※facts是什麼?
facts是一個內建變量。每一個主機的各類信息,cpu顆數、內存大小等。會存在facts中的某個變量中。調用後返回不少對應主機的信息,在後面的操做中能夠根據不一樣的信息來作不一樣的操做。如redhat系列用yum安裝,而debian系列用apt來安裝軟件。
※setup模塊主要功能
setup模塊,主要用於獲取主機信息,在playbooks裏常常會用到的一個參數gather_facts就與該模塊相關。 setup模塊下常用的一個參數是filter參數,具體使用示例以下(因爲輸出結果較多,這裏只列命令不寫結果):
setup經常使用命令格式: #ansible web -m setup //查看主機全部變量 #ansible 10.212.52.252 -m setup -a 'filter=ansible_*_mb' //查看主機內存信息 #ansible 10.212.52.252 -m setup -a 'filter=ansible_eth[0-2]' //查看地接口爲eth0-2的網卡信息 #ansible all -m setup --tree /tmp/facts //將全部主機的信息輸入到/tmp/facts目錄下,每臺主機的信息輸入到主機名文件中,以下爲命令執 行結果: [root@server ~]# ls /tmp/facts/ 172.17.214.74 172.17.214.75
四:Ansible playbook
一、playbook簡介
(1)playbook是ansible用於配置,部署,和管理被控節點的劇本
(2)經過playbook的詳細描述,執行其中一系列tasks來操控節點
(3)演員:計算機
劇本:playbook
二、playbook使用場景
(1)ad-doc適合執行單條命令,當命令較多時,須要playbook
(2)playbook有本身的語法格式
(3)能夠將經常使用的命令集合編寫爲playbook
三、playbook編寫詳解
(1)語法格式
①開頭:文件的第一行應該以 」—」 (三個連字符)開始,代表YMAL文件的開始。 ②註釋:在同一行中,#以後的內容表示註釋,相似於shell,python和ruby。 ③列表元素:YMAL中的列表元素以」-」開頭而後緊跟着一個空格,後面爲元素內容。 eg:- apple - banana - orange 等價於python列表 ["apple","banana","orange"] ④經常使用對象指定:play中hosts,variables,roles,tasks等對象的表示方法都是鍵值中間以":"分隔表示,":"後面還要增長一個空格。
(2)playbook組件詳解
①Hosts:運行指定任務的目標主機 (a)主機清單默認爲/etc/ansible/hosts,也可本身指定文件,經過-i file_name指定 (b) ansible --list-hosts 顯示哪些主機參與到task的執行中 ②remote_user:遠程主機上執行任務的用戶 ③sudo_user:切換遠程主機上執行任務的用戶 ④tasks: 任務列表,配合各模塊使用纔有功能。 module_name: modile arguments 注意:shell和command模塊後可直接跟命令,而非key=value參數列表 ⑤handlers 任務,在特定條件下被觸發,接收到其餘任務的通知時被觸發 格式: tasks: - name: restart httpd service service: name=httpd states=stopped notify: httpd_manager handlers: - name: httpd_manager service: name=httpd states=started ⑥變量 Variables 方法1)facts:可直接調用 注意:可以使用setup模塊直接獲取目標主機的facters; 方法2)用戶自定義變量 (a)命令行定義:ansible-playbook *.yml -e var1=value1 eg:①定義變量名 tasks: - name: stop httpd service service: name={{ service_name }} states=stopped ##定義變量service_name ②命令行引用變量 ansible-playbook web.yml -e service_name=httpd ##關閉httpd服務 (b).yml文件中定義: vars: - var1: value1 - var2: value2 注意:vars位置爲hosts之下,tasks以外,與tasks等級相同 方法3)經過roles傳遞變量 方法4)Host Inventory 主機清單文件自中定義 (a) 向不一樣主機傳遞不一樣的變量: ip/hostname var1=value1 var2=value2 (b)向組中的主機傳遞相同變量 [group_name:vars] //原樣輸入便可 var1=value1 //指定變量及變量值 ⑦tags:爲單個執行命令打標籤 1)修改yml文件 tasks: - name: restart httpd service service: name=httpd states=stopped tags: restart-httpd 2)命令行引用tags,運行單獨task absible-playbook web.yml -t restart-httpd 」-t「 引用tag,運行指定命令
四、playbook運行方法
(1)試運行 ansible-playbook --check/-C #測試運行yml文件,不執行真正操做,用來查看是否有錯誤 ansible-playbook --list-hosts #列出執行task所用主機 ansible-playbook (2)直接運行 ansible-playbook *.yml
五、playbook字典
語法示例: - name: add some users user: name={{ item.name }} group={{ item.group }} state=present with_items: - { name:'user11',group:'group11' } - { name:'user22',group:'group22' }
六、playbook條件測試
(1)條件測試:when 用法:在task中使用,jinja2的語法格式 eg: tasks: - name: install conf file to centos7 template: src=files/nginx.conf.c7.j2 when: ansible_distribution_major_version == "7" - name: install conf file to centos6 template: src=files/nginx.conf.c6.j2 when: ansible_distribution_major_version == "6" (2)循環:迭代,須要重複執行的任務 用法:①對迭代項的引用,固定變量名爲 "item" ②然後,要在task中使用with_items給定要迭代的元素列表 eg: - hosts: web remote_user: root tasks: - name: uninstall web packages yum: name={{ item }} state=absent with_item: - httpd - php - php-mysql - php-fpm
七、roles 角色定製
(1)功能 roles 用於層次性、結構化地組織playbook。roles 可以根據層次型結構自動裝載變量文件、tasks以及handlers等。roles就是經過分別將變量(vars)、文 件(file)、任務(tasks)、模塊 (modules)及處理器(handlers)放置於單獨的目錄中,並能夠便捷 地include它們的一種機制。角色通常用於基於主機構建 服務的場 景中,但也能夠是用於構建守護進程等場景中。要使用 roles只須要在playbook中使用include指令便可。 (2)角色集合 ①mysql/ ②httpd/ ③nginx/ ④files/: 存儲由copy或script等模塊調用的文件; ⑤tasks/:此目錄中至少應該有一個名爲main.yml的文件,用於定義各task;其它的文件須要由main.yml 進行「包含」調用; ⑥handlers/:此目錄中至少應該有一個名爲main.yml的文件,用於定義各handler;其它的文件須要由 main.yml進行「包含」調用; ⑦vars/:此目錄中至少應該有一個名爲main.yml的文件,用於定義各variable;其它的文件須要由 main.yml進行「包含」調用; ⑧templates/:存儲由template模塊調用的模板文本; ⑨meta/:此目錄中至少應該有一個名爲main.yml的文件,定義當前角色的特殊設定及其依賴關係;其它的 文件須要由main.yml進行「包含」調用; ⑩default/:此目錄中至少應該有一個名爲main.yml的文件,用於設定默認變量; (3)角色定製操做步驟 ①在role目錄下生成對應的目錄結構 mkdir -pv ./{nginx,mysql,httpd}/{files,templates,vars,tasks,handlers,meta,default} ②定義/tasks/main.yml的配置文件 - name: cp copy: src=nginx-1.10.2-1.el7.ngx.x86_64.rpm dest=/tmp/nginx-1.10.2- 1.el7.ngx.x86_64.rpm - name: install yum: name=/tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm state=latest - name: conf template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf tags: nginxconf notify: new conf to reload name: start service service: name=nginx state=started enabled=true ③修改變量文件 vars/main.yml 添加變量nginx_port: 「8888」 ④定義handlers文件 handlers/main.yml - name: new conf to reload service: name=nginx state=restarted ⑤定義/etc/ansible/nginx.yml的playbook文件 - hosts: nginx remote_user: root roles: - nginx ⑥能夠經過roles傳遞變量 - hosts: nginx remote_user: root roles: - { role: nginx, nginxport: 12345 } ⑦也能夠配置多個角色 roles: # - { role: nginx, nginxport: 12345 } - { role: memcached