讀書筆記:Ansible自動化運維:技術與最佳實踐

觀其大綱

第一章 ansible架構及其特點

架構模式
特性
ansible與DevOps

第二章 ansible安裝與配置

第三章 ansible組件介紹

Ansible inventory
Ansible AD-Hoc命令
Ansible playbook
Ansible facts
Ansible role
Ansible Galaxy

第四章 playbook詳解

基本語法
變量與引用
循環
lookups
conditionals
Jinja2 filter
playbook內置變量

第五章 ansible最佳實踐

優化ansible速度
目錄結構
定義多環境
灰度發布與檢測
統一管理
ansible-shell交互命令行

熟知概念

Ansible中文權威指南
Ansible是一個簡單的自動化運維管理工具,基于Python語言實現,由Paramiko和PyYAML兩個關鍵模塊構建,可用于自動化部署應用、配置、編排task(持續交付、無宕機更新等)。主版本大概每2個月發布一次。

Ansible與Saltstack最大的區別是Ansible無需在被控主機部署任何客戶端代理,默認直接通過SSH通道進行遠程命令執行或下發配置:相同點是都具備功能強大、靈活的系統管理、狀態配置,兩者都提供豐富的模板及API,對云計算平臺、大數據都有很好的支持。

python模塊paramiko

paramiko是一個用于做遠程控制的模塊,使用該模塊可以對遠程服務器進行命令或文件操作,值得一說的是,fabric和ansible內部的遠程管理就是使用的paramiko來現實。

python模塊

Yaml —— Yet Another Markup Language :一種標記語言
編程免不了要寫配置文件,怎么寫配置也是一門學問。
   YAML 是專門用來寫配置文件的語言,非常簡潔和強大,遠比 JSON 格式方便。
   YAML在python語言中有PyYAML安裝包。

第一章 ansible架構及其特點

ansible是新出現的自動化運維工具,基于Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。

架構模式

Ansible 與其他配置管理的對比

項目 Puppet SaltStack Ansible
開發語言 Ruby Python Python
是否有客戶端
是否支持二次開發 不支持 支持 支持
服務器與遠程機器是否相互驗證
服務器與遠程機器的通信是否加密 是,標準的SSL協議 是,使用AES加密 是,使用OpenSSH
平臺支持 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 提供 提供 提供,但是是商業版本
配置文件格式 Ruby 語法格式 YAML YAML
命令行執行 不支持,大師可以通過配置模塊實現 支持 支持

Ansible 是一個模型驅動的配置管理器,支持多節點發布、遠程任務執行。默認使用 SSH 進行遠程連接。無需在被管理節點上安裝附加軟件,可使用各種編程語言進行擴展。

Ansible基本架構
ansible架構

上圖為ansible的基本架構,從上圖可以了解到其由以下部分組成:

  • 核心:ansible
  • 核心模塊(Core Modules):這些都是ansible自帶的模塊
  • 擴展模塊(Custom Modules):如果核心模塊不足以完成某種功能,可以添加擴展模塊
  • 插件(Plugins):完成模塊功能的補充
  • 劇本(Playbooks):ansible的任務配置文件,將多個任務定義在劇本中,由ansible自動執行
  • 連接插件(Connectior Plugins):ansible基于連接插件連接到各個主機上,雖然ansible是使用ssh連接到各個主機的,但是它還支持其他的連接方法,所以需要有連接插件
  • 主機群(Host Inventory):定義ansible管理的主機

特性

? 模塊化:調用特定的模塊,完成特定任務
? 有Paramiko,PyYAML,Jinja2(模板語言)三個關鍵模塊
? 支持自定義模塊
? 基于Python語言實現
? 部署簡單,基于python和SSH(默認已安裝),agentless
? 安全,基于OpenSSH
? 支持playbook編排任務
? 冪等性:一個任務執行1遍和執行n遍效果一樣,不因重復執行帶來意外情況
? 無需代理不依賴PKI(無需ssl)
? 可使用任何編程語言寫模塊
? YAML格式,編排任務,支持豐富的數據結構
? 較強大的多層解決方案

第二章 ansible安裝與配置

安裝

Ansible默認不在標準倉庫中,需要用到EPEL源。
yum -y install ansible

配置文件

配置文件或指令 描述
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主機清單
/etc/ansible/roles/ 存放角色的目錄
指令
/usr/bin/ansible 主程序,臨時命令執行工具
/usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具
/usr/bin/ansible-galaxy 下載/上傳優秀代碼或Roles模塊的官網平臺
/usr/bin/ansible-playbook 定制自動化任務,編排劇本工具
/usr/bin/ansible-pull 遠程執行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基于Console界面與用戶交互的執行工具

每個命令可以加上 -h 獲取幫助信息

第三章 ansible組件介紹

Ansible inventory

管理不同業務的不同機器,這些機器的信息都存放在Ansible的Inventory組件里面,默認是一個靜態的INI格式文件/etc/ansible/hosts
主機(hosts)部分可以使用域名、主機名、IP地址表示

定義主機和主機組,舉例如下

168.100.100.112 ansible_ssh_pass = '123456' //定義一個主機168.100.100.100 ,使用Inventory內置定義了的SSH登錄密碼
[docker] //定義了一個組叫docker
168.100.100.100[1:3] //定義docker組下面4臺主機從168.100.100.100-168.100.100.103
[docker:vars]
ansible_ssh_pass='123456' //定義docker組使用Inventory內置定義了的SSH登錄密碼
[ansible:children]
docker //定義一個組叫ansible,這個組包含docker組

Ansible AD-Hoc命令

什么是ad-hoc 命令?

ad-hoc 命令是一種可以快速輸入的命令,而且不需要保存起來的命令。就相當于bash中的一句話shell。這也是一個好的地方,在學習ansible playbooks時可以先了解另外一種ansible基本的快速用法,不一定非要寫一個palybook文件。
不過,對于配置管理和應用部署這種工作,還是需要使用“/usr/bin/ansible-playbook”命令。

1.需要使用Ad-Hoc的場景

情景1:
節假日將至,我們需要關閉所有不必要的服務器,并對所有服務器進行節前健康檢查。
情景2:
臨時更新Apache&Nginx的配置文件,且需同時將其分發至所有需更新該配置的Web服務器

2. 需要使用ansible-playbook的場景

情景1:
新購置的服務器安裝完系統后需做一系列固化的初始化工作,諸如:定制防火墻策略、添加NTP時間同步配置、添加EPEL源等。
情景2:
業務側每周定期對生產環境發布更新程序代碼。
基本語法
ansible <pattern_goes_here> -m <module_name> -a <arguments>

<pattern_goes_here> 指定host信息
<module_name> 指定模塊
<arguments> 指定參數

常用示例

1、并行執行

# 重啟 atlanta 組的機器,并發分支 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、文件傳輸

# 將當前服務器的 /srv/foo/a.txt 文件傳輸到 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 管理

# 創建用戶 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、服務管理

# 確保在 webservers 組啟動 httpd 服務
ansible webservers -m service -a "name=httpd state=started"

8、時間有限的后臺操作

# 在后臺異步執行 long_running_operation,超時時間為3600秒(-B),沒有輪詢(-P)
ansible all -B 3600 -P 0 -a "/usr/bin/long_running_operation --do-stuff

ansible常用模塊

模塊 功能 實例
1、ping模塊 檢查指定節點機器是否還能連通,用法很簡單,不涉及參數,主機如果在線,則回復pong ansible 10.1.1.113 -m ping
2、raw模塊 執行原始的命令,而不是通過模塊子系統。在任何情況下,使用shell或命令模塊是合適的。給定原始的參數直接通過配置的遠程shell運行。可返回標準輸出、錯誤輸出和返回代碼。此模塊沒有變更處理程序支持。 這個模塊不需要遠程系統上的Python,就像腳本模塊一樣。此模塊也支持Windows目標。 -
3、yum模塊 這個模塊是RedHat / CentOS作為遠端節點的OS的時候,用的最多的。Yum是啥就不多說了,RedHat / CentOS包管理工具 選項state:狀態(present,absent,latest),表示是安裝還卸載 present:默認的,表示為安裝 lastest: 安裝為最新的版本 absent:表示刪除 ansible test -m yum -a ‘name=httpd state=latest’
4、apt模塊 這個模塊是ubuntu作為遠端節點的OS的時候,用的最多的。Apt是啥就不多說了,Ubuntu/Debian的包管理工具。 -
5、pip模塊 用于管理Python庫依賴項,為了使用pip模塊,必須提供參數name或者requirements -
6、synchronize模塊 使用rsync同步文件,將主控方目錄推送到指定節點的目錄下 -
7、template模塊 基于模板方式生成一個文件復制到遠程主機(template使用Jinjia2格式作為文件模版,進行文檔內變量的替換的模塊。它的每次使用都會被ansible標記為”changed”狀態。) -
8、copy模塊 在遠程主機執行復制操作文件。 -
9、user 模塊與group模塊 user模塊是請求的是useradd, userdel, usermod三個指令,goup模塊請求的是groupadd, groupdel, groupmod 三個指令。 -
10、service 模塊 用于管理服務,記得針對Centos7就不要使用這個模塊了。 -
11、get_url 模塊 該模塊主要用于從http、ftp、https服務器上下載文件(類似于wget) -
12、fetch模塊 它用于從遠程機器獲取文件,并將其本地存儲在由主機名組織的文件樹中。 -
13、file模塊 file模塊主要用于遠程主機上的文件操作 -
14、unarchive模塊 用于解壓文件 -
15、command 模塊和shell 用于在各被管理節點運行指定的命令 ,shell和command的區別:shell模塊可以特殊字符,而command是不支持 -

Ansible playbook

像很多其它配置文件管理方法一樣,Ansible使用一種比較直白的方法來描述自己的任務配置文件。
Ansible 的任務配置文件被稱之為“playbook”,我們可以稱之為“劇本”。每一出劇本(playbook)中都包含一系列的任務,這每個任務在ansible中又被稱為一出“戲劇”(play)。一個劇本(playbook)中包含多出戲劇(play),這很容易理解。

Ansible facts

facts組件是ansible用于采集被管理及其設備信息的一個功能,我們可以使用setup模塊查及其所有facts信息,可以使用filter來查看指定信息。整個facts信息被包裝在一個JSON格式的數據結構中,ansible_facts是最上層的值。
fact組件默認已經收集了很多的設備基礎信息,這些信息可以在做配置管理的時候進行引用。fact信息直接當做playbook變量信息進行引用。通過定制facts以便收集我們想要的信息,同時可以通過facter和ohai來拓展facts信息。使用facter拓展facts信息。facter是pupper里面負責收集主機靜態信息的組件,ansible的facts功能也一樣。ansible的facts組件也會判斷被控制機器上是否安裝有facter和ruby-json包,如果存在的話,ansible的facts也會采集facter信息。使用ansible查看目標主機是否安裝facter包。

Ansible role

Ansible之roles介紹

一、什么場景下會用roles?
假如我們現在有3個被管理主機,第一個要配置成httpd,第二個要配置成php服務器,第三個要配置成MySQL服務器。我們如何來定義playbook?

第一個play用到第一個主機上,用來構建httpd,第二個play用到第二個主機上,用來構建php,第三個play用到第三個主機上,用來構建MySQL。這些個play定義在playbook中比較麻煩,將來也不利于模塊化調用,不利于多次調。比如說后來又加進來一個主機,這個第4個主機既是httpd服務器,又是php服務器,我們只能寫第4個play,上面寫上安裝httpd和php。這樣playbook中的代碼就重復了。

二、roles示例

  1. 創建roles的必需目錄
[root@node1 opt]# mkdir -pv ansible_playbooks/roles/{websrvs,dbsrvs}/
{tasks,files,templates,meta,handlers,vars}

tree ansible_playbooks/
每個role下面有個目錄叫meta,在里面可以新建文件main.yml,在文件中可以設置該role和其它role之前的關聯關系。

Ansible Galaxy

命令行工具

ansible-galaxy命令與Ansible捆綁在一起,您可以使用它從Galaxy或直接從基于git的SCM安裝角色。 您還可以使用它在Galaxy網站上創建新角色,刪除角色或執行任務。

默認情況下,命令行工具使用服務器地址https://galaxy.ansible.com與Galaxy網站API通信。 由于Galaxy項目是一個開源項目,您可能會運行自己的內部Galaxy服務器,并希望覆蓋默認的服務器地址。 您可以使用-server選項或通過在ansible.cfg文件中設置Galaxy服務器值來執行此操作。 有關在ansible.cfg中設置值的信息,請訪問Galaxy設置

Installing Roles

使用ansible-galaxy命令從Galaxy網站下載角色

第四章 playbook詳解

基本語法

YAML所表示的YAML Ain’t Markup Language,YAML 是一種簡潔的非標記語言。YAML以數據為中心,使用空白,縮進,分行組織數據,從而使得表示更加簡潔易讀。

基本規則

YAML有以下基本規則:
1、大小寫敏感
2、使用縮進表示層級關系
3、禁止使用tab縮進,只能使用空格鍵
4、縮進長度沒有限制,只要元素對齊就表示這些元素屬于一個層級。
5、使用#表示注釋
6、字符串可以不用引號標注

三種數據結構

  • 1、map,散列表
    使用冒號(:)表示鍵值對,同一縮進的所有鍵值對屬于一個map,示例:
# YAML表示
age : 12
name : huang

# 對應的Json表示
{'age':12,'name':'huang'}

也可以將一個map寫在一行:

# YAML表示
{age:12,name:huang}
# 對應的Json表示
{'age':12,'name':'huang'}
  • 2、list,數組
    使用連字符(-)表示:
# YAML表示
- a
- b
- 12

# 對應Json表示
['a','b',12]

也可以寫在一行:

# YAML表示
[a,b,c]

# 對應Json表示
[ 'a', 'b', 'c' ]
  • 3、scalar,純量
    數據最小的單位,不可以再分割。

數據結構嵌套

map和list的元素可以是另一個map或者list或者是純量。由此出現4種常見的數據嵌套:

  • 1、map嵌套map
# YAML表示
websites:
 YAML: yaml.org 
 Ruby: ruby-lang.org 
 Python: python.org 
 Perl: use.perl.org 

# 對應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

# 對應Json表示
{ languages: [ 'Ruby', 'Perl', 'Python', 'c' ] }

3、list嵌套list

# YAML表示
-
  - Ruby
  - Perl
  - Python 
- 
  - c
  - c++
  - java

# 對應Json表示
[ [ 'Ruby', 'Perl', 'Python' ], [ 'c', 'c++', 'java' ] ]

除此以外,還可以如下表示該結構

# 方法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

# 對應Json表示
[ { id: 1, name: 'huang' }, { id: 2, name: 'liao' } ]

變量與引用
循環
lookups
conditionals
Jinja2 filter
playbook內置變量

第五章 ansible最佳實踐

優化ansible速度
目錄結構
定義多環境
灰度發布與檢測
統一管理
ansible-shell交互命令行

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,555評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,516評論 2 379

推薦閱讀更多精彩內容