一:關于自動化我們要知道的
1、自動化是什麼?
IT運維自動化是一組将靜态的裝置結構轉化為根據IT服務需求動态彈性響應的政策,目的就是實作IT運維的品質,降低成本。可以說自動化運維一定是IT運維高層面的重要屬性之一。
2、為什麼要使用自動化技術?
當公司規模擴大,從初期的幾台伺服器發展到龐大的資料中心時,自然而然的單靠人工就無法滿足在技術、業務、管理等方面的要求,那麼标準化、自動化、架構優化、過程優化等降低IT服務成本的因素越來越被人們所重視。
3、自動化的目的是什麼?
自動化作為其重要屬性之一已經不僅僅隻是代替人工操作,更重要的是深層探知和全局分析,關注的是在目前條件下如何實作性能與服務最優化,同時保障投資收益最大化。
二:自動化工具——Ansible軟體詳解
1、是什麼
基于python開發的,集合了衆多運維工具(puppet、chef、func、fabric)的優點,實作了批量系統配置、批量程式部署、批量運作指令等功能。
2、Ansible軟體特點
①部署簡單,隻需在主要端部署Ansible環境,被控端無需做任何操作;
②預設使用SSH協定對裝置進行管理;
③有大量正常運維操作子產品,可實作日常絕大部分操作。
④配置簡單、功能強大、擴充性強;
⑤支援API及自定義子產品,可通過Python輕松擴充;
⑥通過Playbooks來定制強大的配置、狀态管理;
⑦輕量級,無需在用戶端安裝agent,更新時,隻需在操作機上 進行一次更新即可;
⑧提供一個功能強大、操作性強的Web管理界面和REST API接口 ——AWX平台。
3、Ansible基本架構圖 && 核心元件說明

Ansible:Ansible核心程式。
HostInventory:記錄由Ansible管理的主機資訊,包括端口、密碼 、ip等。
Playbooks:“劇本”YAML格式檔案,多個任務定義在一個檔案 中,定義主機需要調用哪些子產品來完成的功能。
CoreModules:核心子產品,主要操作是通過調用核心子產品來完成管 理任務。
CustomModules:自定義子產品,完成核心子產品無法完成的功能, 支援多種語言。
ConnectionPlugins:連接配接插件,Ansible和Host通信使用
4、ansible任務執行模式:單個指令、批量指令
①ad-hoc模式:使用單個子產品,支援批量執行單條指令。 ad-hoc 指令是一種可以快速輸入的指令,而且不需要儲存起來的指令。就相當于bash中的一句話shell。
②playbook模式:是Ansible主要管理方式,也是Ansible功能強大的關 鍵所在。playbook通過多個task集合完成一類功能,如Web服務的安裝部署、資料庫伺服器的批量備份等。可以簡單地把playbook了解為通過組合多條ad-hoc進行操作的配置檔案。
5、ansible執行流程 && 流程描述
1、加載自己的配置檔案 預設/etc/ansible/ansible.cfg
2、查找對應的主機配置檔案,找到要執行的主機或者組
3、加載自己對應的子產品檔案,如command
4、通過ansible将子產品或指令生成對應的臨時py檔案,并将該檔案傳 輸至遠端伺服器的
5、對應執行使用者的家目錄的.ansible/tmp/XXX/XXX.PY檔案
6、給檔案+x執行
7、執行并傳回結果
8、删除臨時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界面可與使用者互動的指令執行工具
※指令詳解
1、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:顯示版本資訊
2、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 測試主機網絡連通性
[[email protected] ~]# ansible all -m ping
172.17.214.75 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.17.214.74 | SUCCESS => {
"changed": false,
"ping": "pong"
}
②command執行指令
[[email protected] ~]# 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:檔案存在,則指令執行,也用來做判斷
使用示例如下:
①[[email protected] ~]# 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指令不執行
②[[email protected] ~]# 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指令(支援管道、重定向等特殊符号)
[[email protected] ~]# 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子產品常見用法:
1、複制檔案
-a "src= dest= "
2、生成指定内容的檔案
-a "content= dest= "
copy子產品常用選項:
①backup=<yes|no> :覆寫檔案之前,備份原檔案
②content:功能與重定向">"相同,檔案存在則覆寫檔案内容(default),不能存在則建立指定内容檔案
③dest:檔案或目錄,必須為絕對路徑
④src:檔案或目錄,相對路徑|絕對路徑。
⑤directory_mode:遞歸設定目錄權限,預設為系統預設權限
⑥force yes|no :設為yes時,若目标主機包含該檔案,則強制覆寫;若為no,則隻有目标主機不存在該檔案時才複制。(default:yes)
⑦others:所有file子產品裡的選項都可以在這裡面使用。
⑤file 設定檔案屬性
常見用法:
1、建立目錄
-a 'path= state=directory'
2、建立連結檔案
-a 'path= src= state=link'
3、删除檔案
-a 'path= state=absent'
4、常見選項:
①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:每五分鐘同步各主機時間
[[email protected] ~]# ansible all -m cron -a 'name="sync date per second 5 min" minute="*/5" job="/usr/sbin/ntpdate 172.17.0.1 &> /dev/null"'
[[email protected] ~]# 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目錄下,每台主機的資訊輸入到主機名檔案中,如下為指令執
行結果:
[[email protected] ~]# ls /tmp/facts/
172.17.214.74 172.17.214.75
四:Ansible playbook
1、playbook簡介
(1)playbook是ansible用于配置,部署,和管理被控節點的劇本
(2)通過playbook的較長的描述,執行其中一系列tasks來操控節點
(3)演員:計算機
劇本:playbook
2、playbook使用場景
(1)ad-doc适合執行單條指令,當指令較多時,需要playbook
(2)playbook有自己的文法格式
(3)可以将常用的指令集合編寫為playbook
3、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,運作指定指令
4、playbook運作方法
(1)試運作
ansible-playbook --check/-C #測試運作yml檔案,不執行真正操作,用來檢視是否有錯誤
ansible-playbook --list-hosts #列出執行task所用主機
ansible-playbook
(2)直接運作
ansible-playbook *.yml
5、playbook字典
文法示例:
- name: add some users
user: name={{ item.name }} group={{ item.group }} state=present
with_items:
- { name:'user11',group:'group11' }
- { name:'user22',group:'group22' }
6、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
7、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
轉載于:https://blog.51cto.com/13172823/2049192