觀其大綱
第一章 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
- 核心模塊(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示例
- 創建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交互命令行