觀其大綱
第一章 ansible架構(gòu)及其特點(diǎn)
架構(gòu)模式
特性
ansible與DevOps
第二章 ansible安裝與配置
第三章 ansible組件介紹
Ansible inventory
Ansible AD-Hoc命令
Ansible playbook
Ansible facts
Ansible role
Ansible Galaxy
第四章 playbook詳解
基本語法
變量與引用
循環(huán)
lookups
conditionals
Jinja2 filter
playbook內(nèi)置變量
第五章 ansible最佳實(shí)踐
優(yōu)化ansible速度
目錄結(jié)構(gòu)
定義多環(huán)境
灰度發(fā)布與檢測
統(tǒng)一管理
ansible-shell交互命令行
熟知概念
Ansible中文權(quán)威指南
Ansible是一個(gè)簡單的自動(dòng)化運(yùn)維管理工具,基于Python語言實(shí)現(xiàn),由Paramiko和PyYAML兩個(gè)關(guān)鍵模塊構(gòu)建,可用于自動(dòng)化部署應(yīng)用玷犹、配置死遭、編排task(持續(xù)交付、無宕機(jī)更新等)实胸。主版本大概每2個(gè)月發(fā)布一次郎任。
Ansible與Saltstack最大的區(qū)別是Ansible無需在被控主機(jī)部署任何客戶端代理秧耗,默認(rèn)直接通過SSH通道進(jìn)行遠(yuǎn)程命令執(zhí)行或下發(fā)配置:相同點(diǎn)是都具備功能強(qiáng)大、靈活的系統(tǒng)管理舶治、狀態(tài)配置分井,兩者都提供豐富的模板及API,對(duì)云計(jì)算平臺(tái)霉猛、大數(shù)據(jù)都有很好的支持尺锚。
python模塊paramiko
paramiko是一個(gè)用于做遠(yuǎn)程控制的模塊,使用該模塊可以對(duì)遠(yuǎn)程服務(wù)器進(jìn)行命令或文件操作韩脏,值得一說的是缩麸,fabric和ansible內(nèi)部的遠(yuǎn)程管理就是使用的paramiko來現(xiàn)實(shí)铸磅。
python模塊
Yaml —— Yet Another Markup Language :一種標(biāo)記語言
編程免不了要寫配置文件赡矢,怎么寫配置也是一門學(xué)問杭朱。
YAML 是專門用來寫配置文件的語言,非常簡潔和強(qiáng)大吹散,遠(yuǎn)比 JSON 格式方便弧械。
YAML在python語言中有PyYAML安裝包。
第一章 ansible架構(gòu)及其特點(diǎn)
ansible是新出現(xiàn)的自動(dòng)化運(yùn)維工具空民,基于Python開發(fā)刃唐,集合了眾多運(yùn)維工具(puppet、cfengine界轩、chef画饥、func、fabric)的優(yōu)點(diǎn)浊猾,實(shí)現(xiàn)了批量系統(tǒng)配置抖甘、批量程序部署、批量運(yùn)行命令等功能葫慎。
架構(gòu)模式
Ansible 與其他配置管理的對(duì)比
項(xiàng)目 | Puppet | SaltStack | Ansible |
---|---|---|---|
開發(fā)語言 | Ruby | Python | Python |
是否有客戶端 | 有 | 有 | 無 |
是否支持二次開發(fā) | 不支持 | 支持 | 支持 |
服務(wù)器與遠(yuǎn)程機(jī)器是否相互驗(yàn)證 | 是 | 是 | 是 |
服務(wù)器與遠(yuǎn)程機(jī)器的通信是否加密 | 是衔彻,標(biāo)準(zhǔn)的SSL協(xié)議 | 是,使用AES加密 | 是偷办,使用OpenSSH |
平臺(tái)支持 | AIX , BSD, HP-UX, Linux , Mac OSX , Solaris, Windows | BSD, Linux , Mac OS X , Solaris, Windows | AIX , BSD , HP-UX , Linux , Mac OS X , Solaris |
是否提供Web UI | 提供 | 提供 | 提供艰额,但是是商業(yè)版本 |
配置文件格式 | Ruby 語法格式 | YAML | YAML |
命令行執(zhí)行 | 不支持,大師可以通過配置模塊實(shí)現(xiàn) | 支持 | 支持 |
Ansible 是一個(gè)模型驅(qū)動(dòng)的配置管理器椒涯,支持多節(jié)點(diǎn)發(fā)布柄沮、遠(yuǎn)程任務(wù)執(zhí)行。默認(rèn)使用 SSH 進(jìn)行遠(yuǎn)程連接废岂。無需在被管理節(jié)點(diǎn)上安裝附加軟件铡溪,可使用各種編程語言進(jìn)行擴(kuò)展。
Ansible基本架構(gòu)
上圖為ansible的基本架構(gòu)泪喊,從上圖可以了解到其由以下部分組成:
- 核心:ansible
- 核心模塊(Core Modules):這些都是ansible自帶的模塊
- 擴(kuò)展模塊(Custom Modules):如果核心模塊不足以完成某種功能棕硫,可以添加擴(kuò)展模塊
- 插件(Plugins):完成模塊功能的補(bǔ)充
- 劇本(Playbooks):ansible的任務(wù)配置文件,將多個(gè)任務(wù)定義在劇本中袒啼,由ansible自動(dòng)執(zhí)行
- 連接插件(Connectior Plugins):ansible基于連接插件連接到各個(gè)主機(jī)上哈扮,雖然ansible是使用ssh連接到各個(gè)主機(jī)的,但是它還支持其他的連接方法蚓再,所以需要有連接插件
- 主機(jī)群(Host Inventory):定義ansible管理的主機(jī)
特性
? 模塊化:調(diào)用特定的模塊滑肉,完成特定任務(wù)
? 有Paramiko,PyYAML摘仅,Jinja2(模板語言)三個(gè)關(guān)鍵模塊
? 支持自定義模塊
? 基于Python語言實(shí)現(xiàn)
? 部署簡單靶庙,基于python和SSH(默認(rèn)已安裝),agentless
? 安全娃属,基于OpenSSH
? 支持playbook編排任務(wù)
? 冪等性:一個(gè)任務(wù)執(zhí)行1遍和執(zhí)行n遍效果一樣,不因重復(fù)執(zhí)行帶來意外情況
? 無需代理不依賴PKI(無需ssl)
? 可使用任何編程語言寫模塊
? YAML格式缨睡,編排任務(wù)汇荐,支持豐富的數(shù)據(jù)結(jié)構(gòu)
? 較強(qiáng)大的多層解決方案
第二章 ansible安裝與配置
安裝
Ansible默認(rèn)不在標(biāo)準(zhǔn)倉庫中,需要用到EPEL源卵皂。
yum -y install ansible
配置文件
配置文件或指令 | 描述 |
---|---|
/etc/ansible/ansible.cfg | 主配置文件,配置ansible工作特性 |
/etc/ansible/hosts | 主機(jī)清單 |
/etc/ansible/roles/ | 存放角色的目錄 |
指令 | |
/usr/bin/ansible | 主程序砚亭,臨時(shí)命令執(zhí)行工具 |
/usr/bin/ansible-doc | 查看配置文檔灯变,模塊功能查看工具 |
/usr/bin/ansible-galaxy | 下載/上傳優(yōu)秀代碼或Roles模塊的官網(wǎng)平臺(tái) |
/usr/bin/ansible-playbook | 定制自動(dòng)化任務(wù),編排劇本工具 |
/usr/bin/ansible-pull | 遠(yuǎn)程執(zhí)行命令的工具 |
/usr/bin/ansible-vault | 文件加密工具 |
/usr/bin/ansible-console | 基于Console界面與用戶交互的執(zhí)行工具 |
每個(gè)命令可以加上 -h 獲取幫助信息
第三章 ansible組件介紹
Ansible inventory
管理不同業(yè)務(wù)的不同機(jī)器捅膘,這些機(jī)器的信息都存放在Ansible的Inventory組件里面添祸,默認(rèn)是一個(gè)靜態(tài)的INI格式文件/etc/ansible/hosts
主機(jī)(hosts)部分可以使用域名、主機(jī)名寻仗、IP地址表示
定義主機(jī)和主機(jī)組膝捞,舉例如下
168.100.100.112 ansible_ssh_pass = '123456' //定義一個(gè)主機(jī)168.100.100.100 ,使用Inventory內(nèi)置定義了的SSH登錄密碼
[docker] //定義了一個(gè)組叫docker
168.100.100.100[1:3] //定義docker組下面4臺(tái)主機(jī)從168.100.100.100-168.100.100.103
[docker:vars]
ansible_ssh_pass='123456' //定義docker組使用Inventory內(nèi)置定義了的SSH登錄密碼
[ansible:children]
docker //定義一個(gè)組叫ansible,這個(gè)組包含docker組
Ansible AD-Hoc命令
什么是ad-hoc 命令愧沟?
ad-hoc 命令是一種可以快速輸入的命令蔬咬,而且不需要保存起來的命令。就相當(dāng)于bash中的一句話shell沐寺。這也是一個(gè)好的地方林艘,在學(xué)習(xí)ansible playbooks時(shí)可以先了解另外一種ansible基本的快速用法,不一定非要寫一個(gè)palybook文件混坞。
不過狐援,對(duì)于配置管理和應(yīng)用部署這種工作,還是需要使用“/usr/bin/ansible-playbook”命令究孕。
1.需要使用Ad-Hoc的場景
情景1:
節(jié)假日將至,我們需要關(guān)閉所有不必要的服務(wù)器,并對(duì)所有服務(wù)器進(jìn)行節(jié)前健康檢查啥酱。
情景2:
臨時(shí)更新Apache&Nginx的配置文件,且需同時(shí)將其分發(fā)至所有需更新該配置的Web服務(wù)器
2. 需要使用ansible-playbook的場景
情景1:
新購置的服務(wù)器安裝完系統(tǒng)后需做一系列固化的初始化工作,諸如:定制防火墻策略、添加NTP時(shí)間同步配置厨诸、添加EPEL源等镶殷。
情景2:
業(yè)務(wù)側(cè)每周定期對(duì)生產(chǎn)環(huán)境發(fā)布更新程序代碼。
基本語法
ansible <pattern_goes_here> -m <module_name> -a <arguments>
<pattern_goes_here> 指定host信息
<module_name> 指定模塊
<arguments> 指定參數(shù)
常用示例
1微酬、并行執(zhí)行
# 重啟 atlanta 組的機(jī)器绘趋,并發(fā)分支 10
ansible atlanta -a "/sbin/reboot" -f 10
2、Shell 命令
# 在 172.25.99.101 輸出 hello
ansible 172.25.99.101 -m shell -a 'echo hello'
3颗管、文件傳輸
# 將當(dāng)前服務(wù)器的 /srv/foo/a.txt 文件傳輸?shù)?webservers 組
ansible webservers -m file -a "dest=/srv/foo/a.txt mode=600"
4陷遮、軟件包管理
# 在 webservers 組安裝最新版 acme
ansible webservers -m yum -a "name=acme state=latest"
5、Users 和 Groups 管理
# 創(chuàng)建用戶 foo
ansible all -m user -a "name=foo password=<crypted password here>"
6垦江、從源代碼管理部署
ansible webservers -m git -a
"repo=https://foo.example.org/repo.git dest=/srv/myapp version=HEAD"
7帽馋、服務(wù)管理
# 確保在 webservers 組啟動(dòng) httpd 服務(wù)
ansible webservers -m service -a "name=httpd state=started"
8、時(shí)間有限的后臺(tái)操作
# 在后臺(tái)異步執(zhí)行 long_running_operation,超時(shí)時(shí)間為3600秒(-B)绽族,沒有輪詢(-P)
ansible all -B 3600 -P 0 -a "/usr/bin/long_running_operation --do-stuff
ansible常用模塊
模塊 | 功能 | 實(shí)例 |
---|---|---|
1姨涡、ping模塊 | 檢查指定節(jié)點(diǎn)機(jī)器是否還能連通,用法很簡單项秉,不涉及參數(shù)绣溜,主機(jī)如果在線慷彤,則回復(fù)pong | ansible 10.1.1.113 -m ping |
2娄蔼、raw模塊 | 執(zhí)行原始的命令,而不是通過模塊子系統(tǒng)底哗。在任何情況下岁诉,使用shell或命令模塊是合適的。給定原始的參數(shù)直接通過配置的遠(yuǎn)程shell運(yùn)行跋选√檠ⅲ可返回標(biāo)準(zhǔn)輸出、錯(cuò)誤輸出和返回代碼前标。此模塊沒有變更處理程序支持坠韩。 這個(gè)模塊不需要遠(yuǎn)程系統(tǒng)上的Python,就像腳本模塊一樣炼列。此模塊也支持Windows目標(biāo)只搁。 | - |
3、yum模塊 | 這個(gè)模塊是RedHat / CentOS作為遠(yuǎn)端節(jié)點(diǎn)的OS的時(shí)候俭尖,用的最多的氢惋。Yum是啥就不多說了,RedHat / CentOS包管理工具 選項(xiàng)state:狀態(tài)(present稽犁,absent焰望,latest),表示是安裝還卸載 present:默認(rèn)的已亥,表示為安裝 lastest: 安裝為最新的版本 absent:表示刪除 | ansible test -m yum -a ‘name=httpd state=latest’ |
4熊赖、apt模塊 | 這個(gè)模塊是ubuntu作為遠(yuǎn)端節(jié)點(diǎn)的OS的時(shí)候,用的最多的虑椎。Apt是啥就不多說了秫舌,Ubuntu/Debian的包管理工具。 | - |
5绣檬、pip模塊 | 用于管理Python庫依賴項(xiàng)足陨,為了使用pip模塊,必須提供參數(shù)name或者requirements | - |
6娇未、synchronize模塊 | 使用rsync同步文件墨缘,將主控方目錄推送到指定節(jié)點(diǎn)的目錄下 | - |
7、template模塊 | 基于模板方式生成一個(gè)文件復(fù)制到遠(yuǎn)程主機(jī)(template使用Jinjia2格式作為文件模版,進(jìn)行文檔內(nèi)變量的替換的模塊镊讼。它的每次使用都會(huì)被ansible標(biāo)記為”changed”狀態(tài)宽涌。) | - |
8、copy模塊 | 在遠(yuǎn)程主機(jī)執(zhí)行復(fù)制操作文件蝶棋。 | - |
9卸亮、user 模塊與group模塊 | user模塊是請(qǐng)求的是useradd, userdel, usermod三個(gè)指令,goup模塊請(qǐng)求的是groupadd, groupdel, groupmod 三個(gè)指令玩裙。 | - |
10兼贸、service 模塊 | 用于管理服務(wù),記得針對(duì)Centos7就不要使用這個(gè)模塊了吃溅。 | - |
11溶诞、get_url 模塊 | 該模塊主要用于從http、ftp决侈、https服務(wù)器上下載文件(類似于wget) | - |
12螺垢、fetch模塊 | 它用于從遠(yuǎn)程機(jī)器獲取文件,并將其本地存儲(chǔ)在由主機(jī)名組織的文件樹中赖歌。 | - |
13枉圃、file模塊 | file模塊主要用于遠(yuǎn)程主機(jī)上的文件操作 | - |
14、unarchive模塊 | 用于解壓文件 | - |
15庐冯、command 模塊和shell | 用于在各被管理節(jié)點(diǎn)運(yùn)行指定的命令 孽亲,shell和command的區(qū)別:shell模塊可以特殊字符,而command是不支持 | - |
Ansible playbook
像很多其它配置文件管理方法一樣肄扎,Ansible使用一種比較直白的方法來描述自己的任務(wù)配置文件墨林。
Ansible 的任務(wù)配置文件被稱之為“playbook”,我們可以稱之為“劇本”犯祠。每一出劇本(playbook)中都包含一系列的任務(wù)旭等,這每個(gè)任務(wù)在ansible中又被稱為一出“戲劇”(play)。一個(gè)劇本(playbook)中包含多出戲労庠亍(play)搔耕,這很容易理解。
Ansible facts
facts組件是ansible用于采集被管理及其設(shè)備信息的一個(gè)功能痰娱,我們可以使用setup模塊查及其所有facts信息弃榨,可以使用filter來查看指定信息。整個(gè)facts信息被包裝在一個(gè)JSON格式的數(shù)據(jù)結(jié)構(gòu)中梨睁,ansible_facts是最上層的值鲸睛。
fact組件默認(rèn)已經(jīng)收集了很多的設(shè)備基礎(chǔ)信息,這些信息可以在做配置管理的時(shí)候進(jìn)行引用坡贺。fact信息直接當(dāng)做playbook變量信息進(jìn)行引用官辈。通過定制facts以便收集我們想要的信息箱舞,同時(shí)可以通過facter和ohai來拓展facts信息。使用facter拓展facts信息拳亿。facter是pupper里面負(fù)責(zé)收集主機(jī)靜態(tài)信息的組件晴股,ansible的facts功能也一樣。ansible的facts組件也會(huì)判斷被控制機(jī)器上是否安裝有facter和ruby-json包肺魁,如果存在的話电湘,ansible的facts也會(huì)采集facter信息。使用ansible查看目標(biāo)主機(jī)是否安裝facter包鹅经。
Ansible role
Ansible之roles介紹
一寂呛、什么場景下會(huì)用roles?
假如我們現(xiàn)在有3個(gè)被管理主機(jī)瞬雹,第一個(gè)要配置成httpd昧谊,第二個(gè)要配置成php服務(wù)器刽虹,第三個(gè)要配置成MySQL服務(wù)器酗捌。我們?nèi)绾蝸矶xplaybook?
第一個(gè)play用到第一個(gè)主機(jī)上涌哲,用來構(gòu)建httpd胖缤,第二個(gè)play用到第二個(gè)主機(jī)上,用來構(gòu)建php阀圾,第三個(gè)play用到第三個(gè)主機(jī)上哪廓,用來構(gòu)建MySQL。這些個(gè)play定義在playbook中比較麻煩初烘,將來也不利于模塊化調(diào)用涡真,不利于多次調(diào)。比如說后來又加進(jìn)來一個(gè)主機(jī)肾筐,這個(gè)第4個(gè)主機(jī)既是httpd服務(wù)器哆料,又是php服務(wù)器,我們只能寫第4個(gè)play吗铐,上面寫上安裝httpd和php东亦。這樣playbook中的代碼就重復(fù)了。
二唬渗、roles示例
- 創(chuàng)建roles的必需目錄
[root@node1 opt]# mkdir -pv ansible_playbooks/roles/{websrvs,dbsrvs}/
{tasks,files,templates,meta,handlers,vars}
tree ansible_playbooks/
每個(gè)role下面有個(gè)目錄叫meta典阵,在里面可以新建文件main.yml,在文件中可以設(shè)置該role和其它role之前的關(guān)聯(lián)關(guān)系镊逝。
Ansible Galaxy
命令行工具
ansible-galaxy
命令與Ansible捆綁在一起壮啊,您可以使用它從Galaxy或直接從基于git的SCM安裝角色。 您還可以使用它在Galaxy網(wǎng)站上創(chuàng)建新角色撑蒜,刪除角色或執(zhí)行任務(wù)歹啼。
默認(rèn)情況下充坑,命令行工具使用服務(wù)器地址https://galaxy.ansible.com與Galaxy網(wǎng)站API通信。 由于Galaxy項(xiàng)目是一個(gè)開源項(xiàng)目染突,您可能會(huì)運(yùn)行自己的內(nèi)部Galaxy服務(wù)器捻爷,并希望覆蓋默認(rèn)的服務(wù)器地址。 您可以使用-server選項(xiàng)或通過在ansible.cfg文件中設(shè)置Galaxy服務(wù)器值來執(zhí)行此操作份企。 有關(guān)在ansible.cfg中設(shè)置值的信息也榄,請(qǐng)?jiān)L問Galaxy設(shè)置 。
Installing Roles
使用ansible-galaxy
命令從Galaxy網(wǎng)站下載角色
第四章 playbook詳解
基本語法
YAML所表示的YAML Ain’t Markup Language司志,YAML 是一種簡潔的非標(biāo)記語言甜紫。YAML以數(shù)據(jù)為中心,使用空白骂远,縮進(jìn)囚霸,分行組織數(shù)據(jù),從而使得表示更加簡潔易讀激才。
基本規(guī)則
YAML有以下基本規(guī)則:
1拓型、大小寫敏感
2、使用縮進(jìn)表示層級(jí)關(guān)系
3瘸恼、禁止使用tab縮進(jìn)劣挫,只能使用空格鍵
4、縮進(jìn)長度沒有限制东帅,只要元素對(duì)齊就表示這些元素屬于一個(gè)層級(jí)压固。
5、使用#表示注釋
6靠闭、字符串可以不用引號(hào)標(biāo)注
三種數(shù)據(jù)結(jié)構(gòu)
- 1帐我、map,散列表
使用冒號(hào)(:)表示鍵值對(duì)愧膀,同一縮進(jìn)的所有鍵值對(duì)屬于一個(gè)map拦键,示例:
# YAML表示
age : 12
name : huang
# 對(duì)應(yīng)的Json表示
{'age':12,'name':'huang'}
也可以將一個(gè)map寫在一行:
# YAML表示
{age:12,name:huang}
# 對(duì)應(yīng)的Json表示
{'age':12,'name':'huang'}
- 2、list扇调,數(shù)組
使用連字符(-)表示:
# YAML表示
- a
- b
- 12
# 對(duì)應(yīng)Json表示
['a','b',12]
也可以寫在一行:
# YAML表示
[a,b,c]
# 對(duì)應(yīng)Json表示
[ 'a', 'b', 'c' ]
- 3矿咕、scalar,純量
數(shù)據(jù)最小的單位狼钮,不可以再分割碳柱。
數(shù)據(jù)結(jié)構(gòu)嵌套
map和list的元素可以是另一個(gè)map或者list或者是純量。由此出現(xiàn)4種常見的數(shù)據(jù)嵌套:
- 1熬芜、map嵌套map
# YAML表示
websites:
YAML: yaml.org
Ruby: ruby-lang.org
Python: python.org
Perl: use.perl.org
# 對(duì)應(yīng)Json表示
{ websites:
{ YAML: 'yaml.org',
Ruby: 'ruby-lang.org',
Python: 'python.org',
Perl: 'use.perl.org' } }
2莲镣、map嵌套list
# YAML表示
languages:
- Ruby
- Perl
- Python
- c
# 對(duì)應(yīng)Json表示
{ languages: [ 'Ruby', 'Perl', 'Python', 'c' ] }
3、list嵌套list
# YAML表示
-
- Ruby
- Perl
- Python
-
- c
- c++
- java
# 對(duì)應(yīng)Json表示
[ [ 'Ruby', 'Perl', 'Python' ], [ 'c', 'c++', 'java' ] ]
除此以外涎拉,還可以如下表示該結(jié)構(gòu)
# 方法2
- - Ruby
- Perl
- Python
- - c
- c++
- java
# 方法3
- [Ruby,Perl,Python]
- [c,c++,java]
4瑞侮、list嵌套map
# YAML表示
-
id: 1
name: huang
-
id: 2
name: liao
# 對(duì)應(yīng)Json表示
[ { id: 1, name: 'huang' }, { id: 2, name: 'liao' } ]
變量與引用
循環(huán)
lookups
conditionals
Jinja2 filter
playbook內(nèi)置變量
第五章 ansible最佳實(shí)踐
優(yōu)化ansible速度
目錄結(jié)構(gòu)
定義多環(huán)境
灰度發(fā)布與檢測
統(tǒng)一管理
ansible-shell交互命令行